v2.0.2: overhauled action indicator functionality

This commit is contained in:
Evan Debenham
2023-04-07 11:30:44 -04:00
parent 04b9592f60
commit 513f60bee6
17 changed files with 181 additions and 47 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -32,6 +32,8 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIcon;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.DangerIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Sample;
@@ -241,8 +243,17 @@ public class Berserk extends Buff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
//TODO, should look into these in general honestly
return new BuffIcon(BuffIndicator.FURY, true);
return new HeroIcon(HeroIcon.BERSERK);
}
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
return 0x660000;
}
@Override

View File

@@ -42,6 +42,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndCombo;
@@ -71,7 +72,7 @@ public class Combo extends Buff implements ActionIndicator.Action {
public void tintIcon(Image icon) {
ComboMove move = getHighestMove();
if (move != null){
icon.hardlight(move.tintColor & 0x00FFFFFF);
icon.hardlight(move.tintColor);
} else {
icon.resetColor();
}
@@ -175,15 +176,26 @@ public class Combo extends Buff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
Image icon;
if (((Hero)target).belongings.weapon() != null){
icon = new ItemSprite(((Hero)target).belongings.weapon().image, null);
} else {
icon = new ItemSprite(new Item(){ {image = ItemSpriteSheet.WEAPON_HOLDER; }});
}
return new HeroIcon(HeroIcon.COMBO);
}
icon.tint(getHighestMove().tintColor);
return icon;
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
ComboMove best = getHighestMove();
if (best == null) {
return 0xDFDFDF;
} else {
//take the tint color and darken slightly to match buff icon
int r = (int) ((best.tintColor & 0xFF) * 0.875f);
int g = (int) (((best.tintColor >> 8) & 0xFF) * 0.875f);
int b = (int) ((best.tintColor & 0xFF) * 0.875f);
return (r << 16) + (g << 8) + b;
}
}
@Override
@@ -192,11 +204,11 @@ public class Combo extends Buff implements ActionIndicator.Action {
}
public enum ComboMove {
CLOBBER(2, 0xFF00FF00),
SLAM (4, 0xFFCCFF00),
PARRY (6, 0xFFFFFF00),
CRUSH (8, 0xFFFFCC00),
FURY (10, 0xFFFF0000);
CLOBBER(2, 0x00FF00),
SLAM (4, 0xCCFF00),
PARRY (6, 0xFFFF00),
CRUSH (8, 0xFFCC00),
FURY (10, 0xFF0000);
public int comboReq, tintColor;

View File

@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIcon;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
@@ -206,9 +207,19 @@ public class Momentum extends Buff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
Image im = new BuffIcon(BuffIndicator.HASTE, true);
im.hardlight(0x99992E);
return im;
Image actionIco = new HeroIcon(HeroIcon.MOMENTUM);
actionIco.hardlight(1, 1, 0);
return actionIco;
}
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
return 0x444444;
}
@Override

View File

@@ -42,12 +42,14 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndMonkAbilities;
import com.watabou.noosa.BitmapText;
import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
@@ -242,7 +244,21 @@ public class MonkEnergy extends Buff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
return new HeroIcon(HeroSubClass.MONK);
return new HeroIcon(HeroIcon.MONK_ABILITIES);
}
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
if (abilitiesEmpowered(Dungeon.hero)){
return 0xA0FF40;
} else {
return 0xA08840;
}
}
@Override

View File

@@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Image;
@@ -252,10 +253,20 @@ public class Preparation extends Buff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
Image actionIco = Effects.get(Effects.Type.WOUND);
Image actionIco = new HeroIcon(HeroIcon.PREPARATION);
tintIcon(actionIco);
return actionIco;
}
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
return 0x444444;
}
@Override
public void doAction() {

View File

@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
@@ -114,9 +115,19 @@ public class SnipersMark extends FlavourBuff implements ActionIndicator.Action {
@Override
public Image actionIcon() {
return new ItemSprite(ItemSpriteSheet.SPIRIT_BOW, null);
return new HeroIcon(HeroIcon.SNIPERS_MARK);
}
@Override
public Image secondIcon() {
return null;
}
@Override
public int actionColor() {
return 0x444444;
}
@Override
public void doAction() {

View File

@@ -109,7 +109,7 @@ abstract public class KindOfWeapon extends EquipableItem {
activate( hero );
Talent.onItemEquipped(hero, this);
Badges.validateDuelistUnlock();
ActionIndicator.updateIcon();
ActionIndicator.refresh();
updateQuickslot();
cursedKnown = true;
@@ -152,7 +152,7 @@ abstract public class KindOfWeapon extends EquipableItem {
activate( hero );
Talent.onItemEquipped(hero, this);
Badges.validateDuelistUnlock();
ActionIndicator.updateIcon();
ActionIndicator.refresh();
updateQuickslot();
cursedKnown = true;

View File

@@ -29,25 +29,23 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MonkEnergy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
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.effects.Transmuting;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Sample;
@@ -153,7 +151,7 @@ public class MeleeWeapon extends Weapon {
@Override
public boolean doEquip(Hero hero) {
if (super.doEquip(hero)){
ActionIndicator.updateIcon();
ActionIndicator.refresh();
return true;
}
return false;
@@ -162,7 +160,7 @@ public class MeleeWeapon extends Weapon {
@Override
public boolean equipSecondary(Hero hero) {
if (super.equipSecondary(hero)){
ActionIndicator.updateIcon();
ActionIndicator.refresh();
return true;
}
return false;
@@ -171,7 +169,7 @@ public class MeleeWeapon extends Weapon {
@Override
public boolean doUnequip(Hero hero, boolean collect, boolean single) {
if (super.doUnequip(hero, collect, single)){
ActionIndicator.updateIcon();
ActionIndicator.refresh();
return true;
}
return false;
@@ -551,11 +549,32 @@ public class MeleeWeapon extends Weapon {
@Override
public Image actionIcon() {
Image ico;
if (Dungeon.hero.belongings.weapon == null){
return new ItemSprite(ItemSpriteSheet.WEAPON_HOLDER);
ico = new ItemSprite(ItemSpriteSheet.WEAPON_HOLDER);
} else {
return new ItemSprite(Dungeon.hero.belongings.weapon);
ico = new ItemSprite(Dungeon.hero.belongings.weapon);
}
ico.width += 4; //shift slightly to the left to separate from smaller icon
return ico;
}
@Override
public Image secondIcon() {
Image ico;
if (Dungeon.hero.belongings.secondWep == null){
ico = new ItemSprite(ItemSpriteSheet.WEAPON_HOLDER);
} else {
ico = new ItemSprite(Dungeon.hero.belongings.secondWep);
}
ico.scale.set(PixelScene.align(0.51f));
ico.brightness(0.6f);
return ico;
}
@Override
public int actionColor() {
return 0x5500BB;
}
@Override

View File

@@ -25,19 +25,19 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.SPDAction;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings;
import com.watabou.input.GameAction;
import com.watabou.noosa.Image;
public class ActionIndicator extends Tag {
Image icon;
Image secondIcon;
public static Action action;
public static ActionIndicator instance;
public ActionIndicator() {
super( 0xFFFF4C );
super( 0 );
instance = this;
@@ -65,8 +65,10 @@ public class ActionIndicator extends Tag {
else icon.x = x + width - (SIZE + icon.width()) / 2f - 1;
icon.y = y + (height - icon.height()) / 2f;
PixelScene.align(icon);
if (!members.contains(icon))
add(icon);
if (secondIcon != null){
secondIcon.x = icon.center().x + 8 - secondIcon.width();
secondIcon.y = icon.y + icon.height() - secondIcon.height();
}
}
}
@@ -78,13 +80,15 @@ public class ActionIndicator extends Tag {
if (!Dungeon.hero.ready){
if (icon != null) icon.alpha(0.5f);
if (secondIcon != null) secondIcon.alpha(0.5f);
} else {
if (icon != null) icon.alpha(1f);
if (secondIcon != null) secondIcon.alpha(1f);
}
if (!visible && action != null){
visible = true;
updateIcon();
refresh();
flash();
} else {
visible = action != null;
@@ -115,7 +119,7 @@ public class ActionIndicator extends Tag {
public static void setAction(Action action){
ActionIndicator.action = action;
updateIcon();
refresh();
}
public static void clearAction(Action action){
@@ -124,16 +128,29 @@ public class ActionIndicator extends Tag {
}
}
public static void updateIcon(){
public static void refresh(){
if (instance != null){
synchronized (instance) {
if (instance.icon != null) {
instance.icon.killAndErase();
instance.icon = null;
}
if (instance.secondIcon != null){
instance.secondIcon.killAndErase();
instance.secondIcon = null;
}
if (action != null) {
instance.icon = action.actionIcon();
instance.add(instance.icon);
Image secondIco = action.secondIcon();
if (secondIco != null){
instance.secondIcon = secondIco;
instance.add(instance.secondIcon);
}
instance.needsLayout = true;
instance.setColor(action.actionColor());
}
}
}
@@ -145,6 +162,11 @@ public class ActionIndicator extends Tag {
public Image actionIcon();
//TODO more variable than an icon maybe
public Image secondIcon();
public int actionColor();
public void doAction();
}

View File

@@ -34,7 +34,7 @@ import com.watabou.noosa.Image;
public class DangerIndicator extends Tag {
public static final int COLOR = 0xFF4C4C;
public static final int COLOR = 0xC03838;
private BitmapText number;
private Image icon;
@@ -46,7 +46,7 @@ public class DangerIndicator extends Tag {
public static int HEIGHT = 16;
public DangerIndicator() {
super( 0xFF4C4C );
super( COLOR );
setSize( SIZE, HEIGHT );

View File

@@ -66,6 +66,14 @@ public class HeroIcon extends Image {
public static final int FEINT = 30;
public static final int RATMOGRIFY = 31;
//action indicator visuals
public static final int BERSERK = 32;
public static final int COMBO = 33;
public static final int PREPARATION = 34;
public static final int MOMENTUM = 35;
public static final int SNIPERS_MARK = 36;
public static final int MONK_ABILITIES = 37;
public HeroIcon(HeroSubClass subCls){
super( Assets.Interfaces.HERO_ICONS );
if (film == null){
@@ -82,4 +90,13 @@ public class HeroIcon extends Image {
frame(film.get(abil.icon()));
}
//TODO make this consistent with subclass and ability icons
public HeroIcon(int icon){
super( Assets.Interfaces.HERO_ICONS );
if (film == null){
film = new TextureFilm(texture, SIZE, SIZE);
}
frame(film.get(icon));
}
}

View File

@@ -36,7 +36,7 @@ public class LootIndicator extends Tag {
private int lastQuantity = 0;
public LootIndicator() {
super( 0x1F75CC );
super( 0x185898 );
setSize( SIZE, SIZE );

View File

@@ -34,7 +34,7 @@ public class ResumeIndicator extends Tag {
private Image icon;
public ResumeIndicator() {
super(0xCDD5C0);
super(0xA3A695);
setSize( SIZE, SIZE );

View File

@@ -75,6 +75,13 @@ public class Tag extends Button {
bg.flipHorizontal(value);
layout();
}
public void setColor( int color ){
this.r = (color >> 16) / 255f;
this.g = ((color >> 8) & 0xFF) / 255f;
this.b = (color & 0xFF) / 255f;
bg.hardlight( r, g, b );
}
@Override
public void update() {

View File

@@ -62,7 +62,6 @@ public class WndCombo extends Window {
}
for (Combo.ComboMove move : Combo.ComboMove.values()) {
Image ic = new Image(icon);
RedButton moveBtn = new RedButton(move.desc(combo.getComboCount()), 6){
@Override
@@ -72,8 +71,6 @@ public class WndCombo extends Window {
combo.useMove(move);
}
};
ic.tint(move.tintColor);
moveBtn.icon(ic);
moveBtn.leftJustify = true;
moveBtn.multiline = true;
moveBtn.setSize(width, moveBtn.reqHeight());