From da61ae7facc0052f079506a60b7563e57455c5f8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 26 Sep 2021 17:13:53 +0800 Subject: [PATCH] [Mobile] Update Avatar Life Loss/Gain Animation --- .../main/java/forge/game/player/Player.java | 8 ++-- .../java/forge/game/player/PlayerView.java | 16 ++++--- .../forge/trackable/TrackableProperty.java | 2 +- .../forge/screens/match/views/VAvatar.java | 46 ++++++++++++------- .../screens/match/views/VPlayerPanel.java | 2 +- .../gui/control/FControlGameEventHandler.java | 2 - 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 52acc7e8333..59c266db866 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -573,8 +573,6 @@ public class Player extends GameEntity implements Comparable { } life -= toLose; - //for Avatar animation - view.setAvatarWasDamaged(true); view.updateLife(this); lifeLost = toLose; if (manaBurn) { @@ -2639,7 +2637,7 @@ public class Player extends GameEntity implements Comparable { public void updateAvatar() { view.updateAvatarIndex(this); view.updateAvatarCardImageKey(this); - view.setAvatarWasDamaged(false); + view.setAvatarLifeDifference(0); view.setHasLost(false); } @@ -2857,8 +2855,8 @@ public class Player extends GameEntity implements Comparable { view.setHasLost(b); } - public void setAvatarWasDamaged(boolean val) { - view.setAvatarWasDamaged(val); + public void setAvatarLifeDifference(int val) { + view.setAvatarLifeDifference(val); } public int getExtraTurnCount() { diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index e13aa0609f3..7531d7c02e2 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -224,14 +224,16 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.HasLost, val); } - public boolean getAvatarWasDamaged() { - if (get(TrackableProperty.WasAvatarDamaged) == null) - return false; - return get(TrackableProperty.WasAvatarDamaged); + public int getAvatarLifeDifference() { + return (int)get(TrackableProperty.AvatarLifeDifference); } - - public void setAvatarWasDamaged(final boolean val) { - set(TrackableProperty.WasAvatarDamaged, val); + public boolean wasAvatarLifeChanged() { + if ((int)get(TrackableProperty.AvatarLifeDifference) == 0) + return false; + return (int)get(TrackableProperty.AvatarLifeDifference) != 0; + } + public void setAvatarLifeDifference(final int val) { + set(TrackableProperty.AvatarLifeDifference, val); } public int getExtraTurnCount() { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index c2deca46c4b..779654e7a55 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -204,7 +204,7 @@ public enum TrackableProperty { ExtraTurnCount(TrackableTypes.IntegerType), HasPriority(TrackableTypes.BooleanType, FreezeMode.IgnoresFreeze), HasDelirium(TrackableTypes.BooleanType), - WasAvatarDamaged(TrackableTypes.BooleanType), + AvatarLifeDifference(TrackableTypes.IntegerType, FreezeMode.IgnoresFreeze), HasLost(TrackableTypes.BooleanType), //SpellAbility diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index eb24c30bada..b0bd5873057 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -24,7 +24,9 @@ public class VAvatar extends FDisplayObject { private final PlayerView player; private final FImage image; - private AvatarAnimation avatarAnimation; + private final AvatarAnimation avatarAnimation; + private static final FSkinFont LIFE_FONT = FSkinFont.get(18); + private static final FSkinFont LIFE_FONT_ALT = FSkinFont.get(22); public VAvatar(PlayerView player0) { player = player0; @@ -42,7 +44,6 @@ public class VAvatar extends FDisplayObject { private class AvatarAnimation extends ForgeAnimation { private static final float DURATION = 0.6f; private float progress = 0; - private boolean finished; Texture splatter = FSkin.splatter; private void drawAvatar(Graphics g, FImage image, float x, float y, float w, float h) { @@ -51,21 +52,34 @@ public class VAvatar extends FDisplayObject { percentage = 0; } else if (percentage > 1) { percentage = 1; - //animation finished clear avatar red overlay - player.setAvatarWasDamaged(false); } float mod = w/2f; - if (splatter == null) { - g.setColorRGBA(1, percentage, percentage, g.getfloatAlphaComposite()); + int amount = player.getAvatarLifeDifference(); + float oldAlpha = g.getfloatAlphaComposite(); + float fade = 1-(percentage*1); + if (amount > 0) { g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); - g.resetColorRGBA(g.getfloatAlphaComposite()); - } else { - g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); - g.setAlphaComposite(1-(percentage*1)); - g.drawImage(splatter, x-mod/2, y-mod/2, w+mod, h+mod); - g.resetAlphaComposite(); + drawPlayerIndicator(g, w, h, percentage); + g.setAlphaComposite(fade); + g.drawRect(w / 12f, Color.WHITE, 0, 0, w, h); + g.drawText("+"+amount, Forge.altZoneTabs ? LIFE_FONT_ALT : LIFE_FONT, Color.WHITE, 0, (getHeight()/2)*fade, getWidth(), getHeight(), false, Align.center, true); + g.setAlphaComposite(oldAlpha); + } else if (amount < 0) { + if (splatter == null) { + g.setColorRGBA(1, percentage, percentage, oldAlpha); + g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); + g.resetColorRGBA(oldAlpha); + } else { + g.drawAvatarImage(image, x, y, w, h, player.getHasLost()); + g.setAlphaComposite(fade); + g.drawImage(splatter, x-mod/2, y-mod/2, w+mod, h+mod); + g.setAlphaComposite(oldAlpha); + } + drawPlayerIndicator(g, w, h, percentage); + g.setAlphaComposite(fade); + g.drawText(String.valueOf(amount), Forge.altZoneTabs ? LIFE_FONT_ALT : LIFE_FONT, Color.RED, 0, (getHeight()/2)*fade, getWidth(), getHeight(), false, Align.center, true); + g.setAlphaComposite(oldAlpha); } - drawPlayerIndicator(g, w, h, percentage); } @Override @@ -76,7 +90,8 @@ public class VAvatar extends FDisplayObject { @Override protected void onEnd(boolean endingAll) { - finished = true; + progress = 0; + player.setAvatarLifeDifference(0); } } @Override @@ -115,11 +130,10 @@ public class VAvatar extends FDisplayObject { float h = getHeight(); if (avatarAnimation != null && !MatchController.instance.getGameView().isMatchOver()) { - if (player.getAvatarWasDamaged() && avatarAnimation.progress < 1) { + if (player.wasAvatarLifeChanged()) { avatarAnimation.start(); avatarAnimation.drawAvatar(g, image, 0, 0, w, h); } else { - avatarAnimation.progress = 0; g.drawAvatarImage(image, 0, 0, w, h, player.getHasLost()); drawPlayerIndicator(g, w, h, 1); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 23a9789c744..12c9c791561 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -417,9 +417,9 @@ public class VPlayerPanel extends FContainer { private void update() { int vibrateDuration = 0; int delta = player.getLife() - life; + player.setAvatarLifeDifference(player.getAvatarLifeDifference()+delta); if (delta != 0) { if (delta < 0) { - //TODO: Show animation on avatar for life loss vibrateDuration += delta * -100; } life = player.getLife(); diff --git a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java index eabf4eaab09..4462eeef38a 100644 --- a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java @@ -474,8 +474,6 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventPlayerDamaged event) { - //for avatar animation - event.target.setAvatarWasDamaged(event.amount > 0); return processEvent(); }