From 11df4f1164975f7328e74c51ced1b2a346a78cb2 Mon Sep 17 00:00:00 2001 From: henriquenakashima Date: Sat, 26 Sep 2020 18:24:46 -0400 Subject: [PATCH] Implement emotions --- Assets/Battle/BaseCard.cs | 10 ++ Assets/Battle/BattleController.cs | 33 +++++-- Assets/Battle/BattleDeck.cs | 6 ++ Assets/Battle/BattleState.cs | 22 ++++- Assets/Battle/CardType.cs | 1 + Assets/Battle/CardsHeroes/EagernessHCard.cs | 17 ++++ .../Battle/CardsHeroes/EagernessHCard.cs.meta | 11 +++ Assets/Battle/CardsHeroes/LeadShotHCard.cs | 2 +- Assets/Battle/CardsHeroes/ShieldBlockHCard.cs | 2 +- Assets/Battle/CardsHeroes/SwordSlashHCard.cs | 2 +- .../Battle/CardsHeroes/ThunderstormHCard.cs | 2 +- Assets/Battle/Effects/DropEmotionEffect.cs | 21 ++++ .../Battle/Effects/DropEmotionEffect.cs.meta | 11 +++ .../Battle/Effects/IncreaseMaxEnergyEffect.cs | 5 +- Assets/Battle/EnergyPool.cs | 14 ++- Assets/Battle/HandPlayability.cs | 15 ++- Assets/Battle/HeroCardDatabase.cs | 5 + Assets/Battle/IBattleEffectResolver.cs | 1 + Assets/Battle/UI/CardUI.cs | 6 +- Assets/Battle/UI/CardUI.prefab | 34 +++---- Assets/Battle/UI/EnergyColorless.jpg | Bin 0 -> 4514 bytes Assets/Battle/UI/EnergyColorless.jpg.meta | 92 ++++++++++++++++++ Assets/Resources/CardArt/HeroEagerness.jpg | Bin 0 -> 14797 bytes .../Resources/CardArt/HeroEagerness.jpg.meta | 92 ++++++++++++++++++ TODO.txt | 5 +- 25 files changed, 369 insertions(+), 40 deletions(-) create mode 100644 Assets/Battle/CardsHeroes/EagernessHCard.cs create mode 100644 Assets/Battle/CardsHeroes/EagernessHCard.cs.meta create mode 100644 Assets/Battle/Effects/DropEmotionEffect.cs create mode 100644 Assets/Battle/Effects/DropEmotionEffect.cs.meta create mode 100644 Assets/Battle/UI/EnergyColorless.jpg create mode 100644 Assets/Battle/UI/EnergyColorless.jpg.meta create mode 100644 Assets/Resources/CardArt/HeroEagerness.jpg create mode 100644 Assets/Resources/CardArt/HeroEagerness.jpg.meta diff --git a/Assets/Battle/BaseCard.cs b/Assets/Battle/BaseCard.cs index 91b925a..a1c2062 100644 --- a/Assets/Battle/BaseCard.cs +++ b/Assets/Battle/BaseCard.cs @@ -25,6 +25,8 @@ public abstract class BaseCard public int GetCost() {return this.cost;} public string GetDisplayType() { switch (this.type) { + case CardType.Emotion: + return "Emotion"; case CardType.Attack: return "Attack"; case CardType.Skill: @@ -41,7 +43,15 @@ public abstract class BaseCard return this.type == CardType.Enchantment; } + public bool IsEphemeral() { + return this.type == CardType.Emotion; + } + public string StringId { get => this.stringId; } + + public CardType Type { + get => this.type; + } } diff --git a/Assets/Battle/BattleController.cs b/Assets/Battle/BattleController.cs index 5489264..43f0f54 100644 --- a/Assets/Battle/BattleController.cs +++ b/Assets/Battle/BattleController.cs @@ -46,15 +46,16 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe HeroId.NPCGuard, }; - HCardId[] cardIds = new HCardId[10] { - HCardId.IronskinDraught, + HCardId[] cardIds = new HCardId[11] { + HCardId.Eagerness, + HCardId.Eagerness, HCardId.LeadShot, HCardId.LeadShot, HCardId.SmokeBomb, - HCardId.SwordSlash, - HCardId.SwordSlash, + HCardId.Eagerness, HCardId.SwordSlash, HCardId.ShieldBlock, + HCardId.Eagerness, HCardId.SwordSlash, HCardId.ShieldBlock, }; @@ -265,10 +266,6 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe // Start of hero turn OnBattleStateChanged(); - // TODO: Play emotions from hand - if (this.heroEnergy.MaxEnergy < 9) { - this.heroEnergy.DropOneEmotion(); - } foreach (BattleHero hero in this.heroes) { hero.ResetBlock(); } @@ -293,6 +290,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe yield return new WaitForSeconds(0.5f); // Start of monster turn + // TODO: Play emotions from hand if (this.monsterEnergy.MaxEnergy < 9) { this.monsterEnergy.DropOneEmotion(); } @@ -332,11 +330,12 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe yield return card.Use(this, this, battlePlayerControls); if (card.IsPermanent()) { this.playArea.AddPlayedHeroPermanent(card); + } else if (card.IsEphemeral()) { + this.heroDeck.MoveCardToOblivion(card); } else { this.heroDeck.MoveCardToDiscard(card); } - yield return new WaitForSeconds(0.5f); OnBattleStateChanged(); CheckState(); } @@ -347,6 +346,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe yield return card.Use(this, this); if (card.IsPermanent()) { this.playArea.AddPlayedMonsterPermanent(card); + } else if (card.IsEphemeral()) { + this.monsterDeck.MoveCardToOblivion(card); } else { this.monsterDeck.MoveCardToDiscard(card); } @@ -421,8 +422,22 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe } // IBattleEffectResolver + public void DropEmotion(DropEmotionEffect effect) { + if (!this.state.CanPlayEmotion(effect.Team)) { + throw new System.InvalidOperationException("Cannot play emotion"); + } + + this.state.NotifyPlayedEmotion(effect.Team); + EnergyPool pool = (effect.Team == TeamChoice.Heroes ? this.heroEnergy : this.monsterEnergy); + pool.MaxEnergy += effect.Amount; + pool.Energy += effect.Amount; + } + public void IncreaseHeroMaxEnergy(IncreaseMaxEnergyEffect effect) { this.heroEnergy.MaxEnergy += effect.Amount; + if (effect.Immediate) { + this.heroEnergy.Energy += effect.Amount; + } } public void IncreaseMaxHP(IncreaseMaxHPEffect effect) { diff --git a/Assets/Battle/BattleDeck.cs b/Assets/Battle/BattleDeck.cs index 3282d6a..13e5b1a 100644 --- a/Assets/Battle/BattleDeck.cs +++ b/Assets/Battle/BattleDeck.cs @@ -16,11 +16,13 @@ public class BattleDeck where BaseCardT : BaseCard private List drawPile; private List handPile; private List discardPile; + private List oblivionPile; public BattleDeck(CardDatabase cardDatabase, int[] cardIds, BattleParticipant[] cardOwners) { this.drawPile = new List(); this.handPile = new List(); this.discardPile = new List(); + this.oblivionPile = new List(); for (int i = 0; i < cardIds.Length; i++) { BaseCardT newCard = cardDatabase.CreateCard(cardIds[i], cardOwners[i]); @@ -110,6 +112,10 @@ public class BattleDeck where BaseCardT : BaseCard TriggerDrawPileChanged(); TriggerDiscardPileChanged(); } + + public void MoveCardToOblivion(BaseCardT card) { + this.oblivionPile.Insert(0, card); + } private void TriggerDrawPileChanged() { if (OnDrawPileChanged != null) OnDrawPileChanged(); diff --git a/Assets/Battle/BattleState.cs b/Assets/Battle/BattleState.cs index 1503084..22ab7e9 100644 --- a/Assets/Battle/BattleState.cs +++ b/Assets/Battle/BattleState.cs @@ -8,6 +8,7 @@ public class BattleState // public delegate void BattleStateChangedAction(); // public event BattleStateChangedAction OnBattleStateChanged; private bool heroTurn; + private bool playedEmotion; public bool IsTeamsTurn(TeamChoice team) { if (team == TeamChoice.Heroes) { @@ -17,5 +18,24 @@ public class BattleState } } - public bool HeroTurn {get => this.heroTurn; set => this.heroTurn = value;} + public bool CanPlayEmotion(TeamChoice team) { + return !this.playedEmotion && IsTeamsTurn(team); + } + + public void NotifyPlayedEmotion(TeamChoice team) { + if (!this.CanPlayEmotion(team)) { + throw new System.InvalidOperationException("BattleState received NotifyPlayedEmotion but " + + "cannot play emotion"); + } + + this.playedEmotion = true; + } + + public bool HeroTurn { + get => this.heroTurn; + set { + this.heroTurn = value; + this.playedEmotion = false; + } + } } diff --git a/Assets/Battle/CardType.cs b/Assets/Battle/CardType.cs index dad5d00..eb15abe 100644 --- a/Assets/Battle/CardType.cs +++ b/Assets/Battle/CardType.cs @@ -1,4 +1,5 @@ public enum CardType { + Emotion, Attack, Skill, Enchantment, diff --git a/Assets/Battle/CardsHeroes/EagernessHCard.cs b/Assets/Battle/CardsHeroes/EagernessHCard.cs new file mode 100644 index 0000000..0e7d66f --- /dev/null +++ b/Assets/Battle/CardsHeroes/EagernessHCard.cs @@ -0,0 +1,17 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EagernessHCard : HeroCard +{ + public EagernessHCard(BattleParticipant owner) + : base(owner, HCardId.Eagerness, "Eagerness", 0, CardType.Emotion, + "1 Energy") { + } + + public override IEnumerator Use(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + effectApplier.Apply(new DropEmotionEffect(1, this.owner.Team)); + yield break; + } +} diff --git a/Assets/Battle/CardsHeroes/EagernessHCard.cs.meta b/Assets/Battle/CardsHeroes/EagernessHCard.cs.meta new file mode 100644 index 0000000..d937828 --- /dev/null +++ b/Assets/Battle/CardsHeroes/EagernessHCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3460f4183463754694d2195cd86821b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/CardsHeroes/LeadShotHCard.cs b/Assets/Battle/CardsHeroes/LeadShotHCard.cs index 2c437e4..e792840 100644 --- a/Assets/Battle/CardsHeroes/LeadShotHCard.cs +++ b/Assets/Battle/CardsHeroes/LeadShotHCard.cs @@ -13,7 +13,7 @@ public class LeadShotHCard : HeroCard MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { SingleTargeting singleTargeting = new SingleTargeting(new OtherTargetPolicy(this.owner)); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); - yield return new WaitForSeconds(0.8f); + yield return new WaitForSeconds(0.4f); BattleParticipant target = singleTargeting.GetTarget(); effectApplier.Apply(new DealDamageEffect(target, 2)); yield return new WaitForSeconds(0.8f); diff --git a/Assets/Battle/CardsHeroes/ShieldBlockHCard.cs b/Assets/Battle/CardsHeroes/ShieldBlockHCard.cs index 96a7855..596d92f 100644 --- a/Assets/Battle/CardsHeroes/ShieldBlockHCard.cs +++ b/Assets/Battle/CardsHeroes/ShieldBlockHCard.cs @@ -14,7 +14,7 @@ public class ShieldBlockHCard : HeroCard MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { SingleTargeting singleTargeting = new SingleTargeting(new AnyHeroTargetPolicy()); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); - yield return new WaitForSeconds(0.8f); + yield return new WaitForSeconds(0.4f); BattleParticipant target = singleTargeting.GetTarget(); effectApplier.Apply(new BlockEffect(target, 2)); yield return new WaitForSeconds(0.8f); diff --git a/Assets/Battle/CardsHeroes/SwordSlashHCard.cs b/Assets/Battle/CardsHeroes/SwordSlashHCard.cs index daa9031..b34aa30 100644 --- a/Assets/Battle/CardsHeroes/SwordSlashHCard.cs +++ b/Assets/Battle/CardsHeroes/SwordSlashHCard.cs @@ -13,7 +13,7 @@ public class SwordSlashHCard : HeroCard MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { SingleTargeting singleTargeting = new SingleTargeting(new AnyTargetPolicy()); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); - yield return new WaitForSeconds(0.8f); + yield return new WaitForSeconds(0.4f); BattleParticipant target = singleTargeting.GetTarget(); effectApplier.Apply(new DealDamageEffect(target, 1)); yield return new WaitForSeconds(0.8f); diff --git a/Assets/Battle/CardsHeroes/ThunderstormHCard.cs b/Assets/Battle/CardsHeroes/ThunderstormHCard.cs index c0a4f1f..a4618a3 100644 --- a/Assets/Battle/CardsHeroes/ThunderstormHCard.cs +++ b/Assets/Battle/CardsHeroes/ThunderstormHCard.cs @@ -11,7 +11,7 @@ public class ThunderstormHCard : HeroCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { - effectApplier.Apply(new IncreaseMaxEnergyEffect(1)); + effectApplier.Apply(new IncreaseMaxEnergyEffect(1, false)); effectApplier.Apply(new AcquireCardsEffect( new HCardId[] {HCardId.LightningStrike, HCardId.LightningStrike}, BattleZone.DrawPile, this.owner)); diff --git a/Assets/Battle/Effects/DropEmotionEffect.cs b/Assets/Battle/Effects/DropEmotionEffect.cs new file mode 100644 index 0000000..72ed1e2 --- /dev/null +++ b/Assets/Battle/Effects/DropEmotionEffect.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DropEmotionEffect : IBattleEffect +{ + private int amount; + private TeamChoice team; + + public DropEmotionEffect(int amount, TeamChoice team) { + this.amount = amount; + this.team = team; + } + + public void Apply(IBattleEffectResolver resolver) { + resolver.DropEmotion(this); + } + + public int Amount {get => this.amount;} + public TeamChoice Team {get => this.team;} +} diff --git a/Assets/Battle/Effects/DropEmotionEffect.cs.meta b/Assets/Battle/Effects/DropEmotionEffect.cs.meta new file mode 100644 index 0000000..2b29bd1 --- /dev/null +++ b/Assets/Battle/Effects/DropEmotionEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8030217c9c617f49898976464cb13a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/Effects/IncreaseMaxEnergyEffect.cs b/Assets/Battle/Effects/IncreaseMaxEnergyEffect.cs index a594802..7dc202e 100644 --- a/Assets/Battle/Effects/IncreaseMaxEnergyEffect.cs +++ b/Assets/Battle/Effects/IncreaseMaxEnergyEffect.cs @@ -5,9 +5,11 @@ using UnityEngine; public class IncreaseMaxEnergyEffect : IBattleEffect { private int amount; + private bool immediate; - public IncreaseMaxEnergyEffect(int amount) { + public IncreaseMaxEnergyEffect(int amount, bool immediate) { this.amount = amount; + this.immediate = immediate; } public void Apply(IBattleEffectResolver resolver) { @@ -15,4 +17,5 @@ public class IncreaseMaxEnergyEffect : IBattleEffect } public int Amount {get => this.amount;} + public bool Immediate {get => this.immediate;} } diff --git a/Assets/Battle/EnergyPool.cs b/Assets/Battle/EnergyPool.cs index ae7b45e..531a91b 100644 --- a/Assets/Battle/EnergyPool.cs +++ b/Assets/Battle/EnergyPool.cs @@ -36,6 +36,16 @@ public class EnergyPool } } - public int MaxEnergy {get => this.maxEnergy; set => this.maxEnergy = value;} - public int Energy {get => this.energy;} + public int MaxEnergy {get => this.maxEnergy; + set { + this.maxEnergy = value; + TriggerOnEnergyChanged(); + } + } + public int Energy {get => this.energy; + set { + this.energy = value; + TriggerOnEnergyChanged(); + } + } } diff --git a/Assets/Battle/HandPlayability.cs b/Assets/Battle/HandPlayability.cs index a16182e..9ce8ae6 100644 --- a/Assets/Battle/HandPlayability.cs +++ b/Assets/Battle/HandPlayability.cs @@ -47,10 +47,17 @@ public class HandPlayability where BaseCardT : BaseCard { private void UpdatePlayability() { this.playable.Clear(); foreach (BaseCardT card in this.deck.GetHandPile()) { - this.playable[card] = - this.battleState.IsTeamsTurn(this.team) - && card.Owner.CanUseCard(card) - && this.energyPool.CanPayForCard(card); + bool canPlay; + if (card.Type == CardType.Emotion) { + canPlay = this.battleState.CanPlayEmotion(this.team); + } else { + canPlay = this.energyPool.CanPayForCard(card); + } + canPlay = canPlay + && this.battleState.IsTeamsTurn(this.team) + && card.Owner.CanUseCard(card); + + this.playable[card] = canPlay; } TriggerOnPlayabilityChanged(); diff --git a/Assets/Battle/HeroCardDatabase.cs b/Assets/Battle/HeroCardDatabase.cs index 0c31a3d..77c895d 100644 --- a/Assets/Battle/HeroCardDatabase.cs +++ b/Assets/Battle/HeroCardDatabase.cs @@ -23,10 +23,12 @@ public enum HCardId { ShieldBlock, LeadShot, SmokeBomb, + Eagerness, } public class HeroCardDatabase : CardDatabase { + // TODO: Get rid of this and instead input who owns each card. private static Dictionary CARD_TO_HERO = new Dictionary() { {HCardId.CrashingPunch, HeroId.Brute}, {HCardId.Cover, HeroId.Brute}, @@ -41,6 +43,7 @@ public class HeroCardDatabase : CardDatabase {HCardId.ShieldBlock, HeroId.NPCGuard}, {HCardId.LeadShot, HeroId.Alchemist}, {HCardId.SmokeBomb, HeroId.Alchemist}, + {HCardId.Eagerness, HeroId.Alchemist}, }; public override HeroCard CreateCard(int id, BattleParticipant owner) { @@ -73,6 +76,8 @@ public class HeroCardDatabase : CardDatabase return new LeadShotHCard(owner); case HCardId.SmokeBomb: return new SmokeBombHCard(owner); + case HCardId.Eagerness: + return new EagernessHCard(owner); default: throw new System.ArgumentException("HCardId unknown", "id"); } diff --git a/Assets/Battle/IBattleEffectResolver.cs b/Assets/Battle/IBattleEffectResolver.cs index 3a5b7fb..14410e2 100644 --- a/Assets/Battle/IBattleEffectResolver.cs +++ b/Assets/Battle/IBattleEffectResolver.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using UnityEngine; public interface IBattleEffectResolver { + void DropEmotion(DropEmotionEffect effect); int DealDamage(DealDamageEffect effect); int DealMassDamage(MassDamageEffect effect); int Heal(HealEffect effect); diff --git a/Assets/Battle/UI/CardUI.cs b/Assets/Battle/UI/CardUI.cs index 439933f..21d7571 100644 --- a/Assets/Battle/UI/CardUI.cs +++ b/Assets/Battle/UI/CardUI.cs @@ -14,7 +14,11 @@ public class CardUI : MonoBehaviour public void Init(BaseCard card) { this.nameText.text = card.GetDisplayName(); this.typeText.text = card.GetDisplayType(); - this.costText.text = "" + card.GetCost(); + if (card.Type != CardType.Emotion) { + this.costText.text = "" + card.GetCost(); + } else { + this.costText.text = ""; + } this.effectText.text = card.GetEffectText(); Sprite sprite = Resources.Load(GetCardArtResourcePath(card)); this.artImage.sprite = sprite; diff --git a/Assets/Battle/UI/CardUI.prefab b/Assets/Battle/UI/CardUI.prefab index fea884f..cf963b1 100644 --- a/Assets/Battle/UI/CardUI.prefab +++ b/Assets/Battle/UI/CardUI.prefab @@ -58,7 +58,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_Maskable: 1 m_OnCullStateChanged: @@ -253,8 +253,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -48.86} - m_SizeDelta: {x: -8, y: -105.724106} + m_AnchoredPosition: {x: -0.22777939, y: -48.438} + m_SizeDelta: {x: -8, y: -103.21904} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2477879197027808367 CanvasRenderer: @@ -277,7 +277,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_Maskable: 1 m_OnCullStateChanged: @@ -285,12 +285,12 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 10 + m_FontSize: 11 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 1 m_MaxSize: 40 - m_Alignment: 1 + m_Alignment: 4 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 @@ -331,8 +331,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -0.11389, y: 11.333} - m_SizeDelta: {x: 114.22778, y: 64.87021} + m_AnchoredPosition: {x: -0.11389, y: 12.589} + m_SizeDelta: {x: 114.22778, y: 70.49167} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2144677943642500384 CanvasRenderer: @@ -405,8 +405,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 40.35, y: 50} - m_SizeDelta: {x: -88.7, y: -136} + m_AnchoredPosition: {x: 38.1, y: 65} + m_SizeDelta: {x: -88.7, y: -140.14691} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7591601241322559362 CanvasRenderer: @@ -429,7 +429,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_Maskable: 1 m_OnCullStateChanged: @@ -448,7 +448,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: 1WW + m_Text: 3 --- !u!1 &6525514904971610804 GameObject: m_ObjectHideFlags: 0 @@ -483,8 +483,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -19.96, y: 50} - m_SizeDelta: {x: -47.914093, y: -136} + m_AnchoredPosition: {x: -19.957, y: 52.84} + m_SizeDelta: {x: -47.914093, y: -144.77003} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4222329136353876023 CanvasRenderer: @@ -507,7 +507,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_Maskable: 1 m_OnCullStateChanged: @@ -515,12 +515,12 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 10 + m_FontSize: 9 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 1 m_MaxSize: 40 - m_Alignment: 3 + m_Alignment: 0 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 diff --git a/Assets/Battle/UI/EnergyColorless.jpg b/Assets/Battle/UI/EnergyColorless.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96586577762ae2dc7b467d8acc07ed17de366c21 GIT binary patch literal 4514 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 literal 0 HcmV?d00001 diff --git a/Assets/Battle/UI/EnergyColorless.jpg.meta b/Assets/Battle/UI/EnergyColorless.jpg.meta new file mode 100644 index 0000000..356a004 --- /dev/null +++ b/Assets/Battle/UI/EnergyColorless.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 4955c4f57b7ec0e42a0a4d603cf8745c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/CardArt/HeroEagerness.jpg b/Assets/Resources/CardArt/HeroEagerness.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9aef33b54a5b638bdb2e15c62664731d4b299cac GIT binary patch literal 14797 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 z