private void OnHealthChanged(HealthChangedEventArgs eventArgs)
        {
            if (eventArgs.GameObject.name == "Player" && eventArgs.NewValue == 0)
            {
                Time.timeScale = 0.0f;
                Explode();
                AudioManager.Play(PlayerDeath, AudioCategory.Effect, 1.0f);

                Collider2D[] colliders = GetComponentsInChildren <Collider2D>();
                foreach (Collider2D collider in colliders)
                {
                    collider.enabled = false;
                }

                SpriteRenderer[] spriteRenderers = GetComponentsInChildren <SpriteRenderer>();
                foreach (SpriteRenderer spriteRenderer in spriteRenderers)
                {
                    spriteRenderer.enabled = false;
                }

                GameObject.Find("Player").GetComponent <PlayerInput>().actions.Disable();
                MenuManager.GoInto("MenuDeath");
            }
            else if (eventArgs.GameObject.name == "Player" && eventArgs.NewValue <= eventArgs.OldValue)
            {
                _cameraShakeBehaviour.Shake(CameraShakeStrength, CameraShakeDuration);
            }
            else if (eventArgs.GameObject.name == "Player" && eventArgs.NewValue > eventArgs.OldValue)
            {
                HealthParticleSystem.Play();
            }
        }
Beispiel #2
0
        public void LoseHealth(Player source, int magnitude)
        {
            if (source.IsDead)
            {
                return;
            }
            var args = new HealthChangedEventArgs()
            {
                Source = null, Delta = -magnitude
            };

            args.Targets.Add(source);

            Emit(GameEvent.BeforeHealthChanged, args);

            Trace.Assert(args.Targets.Count == 1);
            args.Targets[0].Health += args.Delta;
            Trace.TraceInformation("Player {0} lose {1} hp, @ {2} hp", args.Targets[0].Id, -args.Delta, args.Targets[0].Health);
            NotificationProxy.NotifyLoseHealth(args.Targets[0], -args.Delta);
            GameDelays.Delay(GameDelays.Damage);

            try
            {
                Emit(GameEvent.AfterHealthChanged, args);
            }
            catch (TriggerResultException)
            {
            }
        }
Beispiel #3
0
    // private void SpawnGoldNumber()
    // {
    //     GoldNumber gold = Instantiate(GoldNumber, Camera.main.WorldToScreenPoint(transform.position), Quaternion.identity, GameController.GUICanvas.transform).GetComponent<GoldNumber>();
    //     gold.Number = GoldValue;
    //     GameController.Instance.AddGold(GoldValue);
    // }

    public virtual void TookDamage(object sender, HealthChangedEventArgs e)
    {
        if (e.CausedDeath)
        {
            // GameController.AddDeath();
            // SpawnGoldNumber();
            Destroy(healthBarReference.gameObject);
            Destroy(gameObject);
        }
    }
Beispiel #4
0
        void LoseBuQu(Player player)
        {
            Game.CurrentGame.HandleCardDiscard(player, Game.CurrentGame.Decks[player, bq]);
            var nArgs = new HealthChangedEventArgs()
            {
                Source = null, Delta = 0
            };

            nArgs.Targets.Add(player);
            Game.CurrentGame.Emit(GameEvent.AfterHealthChanged, nArgs);
        }
        private void OnDamage(HealthChangedEventArgs eventArgs)
        {
            int current = eventArgs.Damageable.TotalDamage;
            int max     = eventArgs.Damageable.Thresholds[DamageState.Dead];

            if (eventArgs.Damageable.CurrentState == DamageState.Dead)
            {
                return;
            }
            UpdateVisuals(current, max);
        }
    protected override void ChangeFillAmount(object sender, HealthChangedEventArgs e)
    {
        float total = e.NewHealth;

        for (int i = 0; i < GameController.GUICanvas.GetComponent <GUICanvasLogic>().heartContainer.Hearts.Length; i++)
        {
            var heart = GameController.GUICanvas.GetComponent <GUICanvasLogic>().heartContainer.Hearts[i];
            heart.GetComponent <Image>().fillAmount = total / 2;
            total -= 2;
        }
        hpMngr.SpawnHitNumber();
    }
Beispiel #7
0
    public override void TookDamage(object sender, HealthChangedEventArgs e)
    {
        if (e.CausedDeath)
        {
            var dead = Instantiate(deadObject);
            dead.transform.position = transform.position;
            dead.GetComponent <Rigidbody2D>().velocity = new Vector2(0, 8);
            Destroy(dead, 5f);

            GameController.AliveEnemies -= 1;
            Destroy(healthBarReference.gameObject);
            Destroy(gameObject);
        }
    }
Beispiel #8
0
        private void OnHealthChanged(HealthChangedEventArgs eventArgs)
        {
            if (eventArgs.GameObject.name == "Player" && eventArgs.NewValue < eventArgs.OldValue)
            {
                DamageTaken += eventArgs.OldValue - eventArgs.NewValue;
            }

            TagBehaviour tagBehaviour = eventArgs.GameObject.GetComponent <TagBehaviour>();

            if (tagBehaviour != null && tagBehaviour.HasTag("Enemy") && eventArgs.NewValue < eventArgs.OldValue)
            {
                DamageDealt += eventArgs.OldValue - eventArgs.NewValue;
                if (eventArgs.NewValue <= 0)
                {
                    EnemiesDefeated++;
                }
            }
        }
        private void OnHealthChanged(HealthChangedEventArgs eventArgs)
        {
            TagBehaviour tagBehaviour = eventArgs.GameObject.GetComponent <TagBehaviour>();

            bool isEnemy      = tagBehaviour != null && tagBehaviour.HasTag("Enemy");
            bool isDead       = eventArgs.NewValue == 0;
            bool isWithinRoom = eventArgs.GameObject.transform.parent == transform;

            if (isEnemy && isDead && isWithinRoom)
            {
                _enemyCount -= 1;

                if (_enemyCount <= 0)
                {
                    OnRoomCleared();
                    EventManager.Unregister(_healthChangedEventId);
                }
            }
        }
        private void OnHealthChanged(HealthChangedEventArgs eventArgs)
        {
            if (eventArgs.GameObject != Target)
            {
                return;
            }

            for (int i = 0; i < _targetHealthBehaviour.MaxHealth; i++)
            {
                if (i < eventArgs.NewValue)
                {
                    _cellAnimators[i].SetBool("Full", true);
                }
                else
                {
                    _cellAnimators[i].SetBool("Full", false);
                }
            }
        }
Beispiel #11
0
        public BuQu()
        {
            _useBuQu = false;
            var trigger = new AutoNotifyPassiveSkillTrigger(
                this,
                (p, e, a) =>
            {
                HealthChangedEventArgs arg = a as HealthChangedEventArgs;
                return(p.Health <= 0 || arg.Delta > 0 && Game.CurrentGame.Decks[p, bq].Count > 0);
            },
                Run,
                TriggerCondition.OwnerIsTarget
                )
            {
                AskForConfirmation = false, IsAutoNotify = false, Type = TriggerType.Skill
            };

            Triggers.Add(GameEvent.AfterHealthChanged, trigger);
            IsAutoInvoked = true;
        }
Beispiel #12
0
        public void RecoverHealth(Player source, Player target, int magnitude)
        {
            if (target.IsDead)
            {
                return;
            }
            if (target.Health >= target.MaxHealth)
            {
                return;
            }
            var args = new HealthChangedEventArgs()
            {
                Source = source, Delta = magnitude
            };

            args.Targets.Add(target);

            Emit(GameEvent.BeforeHealthChanged, args);

            Trace.Assert(args.Targets.Count == 1);
            if (args.Targets[0].Health + args.Delta > args.Targets[0].MaxHealth)
            {
                args.Targets[0].Health = args.Targets[0].MaxHealth;
            }
            else
            {
                args.Targets[0].Health += args.Delta;
            }

            Trace.TraceInformation("Player {0} gain {1} hp, @ {2} hp", args.Targets[0].Id, args.Delta, args.Targets[0].Health);
            NotificationProxy.NotifyRecoverHealth(args.Targets[0], args.Delta);

            try
            {
                Emit(GameEvent.AfterHealthChanged, args);
            }
            catch (TriggerResultException)
            {
            }
        }
Beispiel #13
0
        protected void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            HealthChangedEventArgs arg = eventArgs as HealthChangedEventArgs;

            if (arg.Delta > 0)
            {
                if (Game.CurrentGame.Decks[Owner, bq].Count <= arg.Delta)
                {
                    Game.CurrentGame.HandleCardDiscard(Owner, Game.CurrentGame.Decks[Owner, bq]);
                    return;
                }
                else
                {
                    List <List <Card> > answer;
                    List <DeckPlace>    sourceDecks = new List <DeckPlace>()
                    {
                        new DeckPlace(Owner, bq)
                    };
                    if (!Owner.AskForCardChoice(new CardChoicePrompt("BuQu", Owner),
                                                sourceDecks,
                                                new List <string>()
                    {
                        "QiPaiDui"
                    },
                                                new List <int>()
                    {
                        1
                    },
                                                new RequireCardsChoiceVerifier(arg.Delta),
                                                out answer,
                                                null,
                                                CardChoiceCallback.GenericCardChoiceCallback))
                    {
                        answer = new List <List <Card> >();
                        answer.Add(Game.CurrentGame.PickDefaultCardsFrom(sourceDecks, arg.Delta));
                    }
                    Game.CurrentGame.HandleCardDiscard(Owner, answer[0]);
                }
                if (!_useBuQu)
                {
                    return;
                }
                List <int> check = new List <int>();
                foreach (var c in Game.CurrentGame.Decks[Owner, bq])
                {
                    if (!check.Contains(c.Rank))
                    {
                        check.Add(c.Rank);
                    }
                }
                if (check.Count == Game.CurrentGame.Decks[Owner, bq].Count && Game.CurrentGame.DyingPlayers.Contains(Owner))
                {
                    Owner[Player.SkipDeathComputation] = 1;
                }
                return;
            }
            if (!AskForSkillUse())
            {
                Owner[Player.SkipDeathComputation] = 0; _useBuQu = false; return;
            }
            _useBuQu = true;
            if (1 - Owner.Health > Game.CurrentGame.Decks[Owner, bq].Count)
            {
                int           toDraw = 1 - Owner.Health - Game.CurrentGame.Decks[Owner, bq].Count;
                CardsMovement move   = new CardsMovement();
                move.To = new DeckPlace(Owner, bq);
                move.Helper.PrivateDeckHeroTag = HeroTag;
                while (toDraw-- > 0)
                {
                    Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
                    Card c1 = Game.CurrentGame.DrawCard();
                    move.Cards.Add(c1);
                }
                Game.CurrentGame.MoveCards(move);
            }
            if (Owner.Health <= 0)
            {
                Dictionary <int, bool> death = new Dictionary <int, bool>();
                foreach (Card c in Game.CurrentGame.Decks[Owner, bq])
                {
                    if (death.ContainsKey(c.Rank))
                    {
                        return;
                    }
                    death.Add(c.Rank, true);
                }
                Owner[Player.SkipDeathComputation] = 1;
                NotifySkillUse();
            }
        }
Beispiel #14
0
        /// <summary>
        /// 造成伤害
        /// </summary>
        /// <param name="source">伤害来源</param>
        /// <param name="dest">伤害目标</param>
        /// <param name="originalTarget">最初的伤害目标</param>
        /// <param name="magnitude">伤害点数</param>
        /// <param name="elemental">伤害属性</param>
        /// <param name="cards">造成伤害的牌</param>
        public void DoDamage(Player source, Player dest, Player originalTarget, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
        {
            if (dest.IsDead)
            {
                return;
            }
            var damageArgs = new DamageEventArgs()
            {
                Source = source, OriginalTarget = originalTarget, Targets = new List <Player>(), Magnitude = magnitude, Element = elemental
            };
            HealthChangedEventArgs healthChangedArgs;
            int           ironShackledDamage        = 0;
            DamageElement ironShackledDamageElement = DamageElement.None;

            if (readonlyCard == null)
            {
                readonlyCard = new ReadOnlyCard(new Card()
                {
                    Place = new DeckPlace(null, null)
                });
            }
            damageArgs.ReadonlyCard = readonlyCard;
            if (card is CompositeCard)
            {
                if ((card as CompositeCard).Subcards != null)
                {
                    damageArgs.Cards = new List <Card>((card as CompositeCard).Subcards);
                }
            }
            else if (card is Card)
            {
                damageArgs.Cards = new List <Card>()
                {
                    card as Card
                };
            }
            else
            {
                damageArgs.Cards = new List <Card>();
            }
            damageArgs.Targets.Add(dest);
            damageArgs.Card = card;

            try
            {
                //伤害来源与基数、属性的确定发生在伤害结算前,连环,以及转移的伤害不会重新确定来源与基数,所以不会多次触发【裸衣】,以及【酒】
                while (damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] == 0)
                {
                    Emit(GameEvent.DamageSourceConfirmed, damageArgs);
                    Emit(GameEvent.DamageElementConfirmed, damageArgs);
                    damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] = 1;
                    break;
                }
                Emit(GameEvent.BeforeDamageComputing, damageArgs);
                Emit(GameEvent.DamageComputingStarted, damageArgs);
                Emit(GameEvent.DamageCaused, damageArgs);
                Emit(GameEvent.DamageInflicted, damageArgs);
                if (damageArgs.Magnitude == 0)
                {
                    Trace.TraceInformation("Damage is 0, aborting");
                    return;
                }
                if (damageArgs.Targets[0].IsIronShackled && damageArgs.Element != DamageElement.None)
                {
                    ironShackledDamage = damageArgs.Magnitude;
                    Trace.TraceInformation("IronShackled damage {0}", ironShackledDamage);
                    ironShackledDamageElement            = damageArgs.Element;
                    damageArgs.Targets[0].IsIronShackled = false;
                    // if this is TieSuo damage already, prevent itself from spreading...
                    if (readonlyCard[IsIronShackleDamage] == 1)
                    {
                        ironShackledDamage = 0;
                    }
                }
                healthChangedArgs = new HealthChangedEventArgs(damageArgs);
                Emit(GameEvent.BeforeHealthChanged, healthChangedArgs);
                damageArgs.Magnitude = -healthChangedArgs.Delta;
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.End)
                {
                    //伤害结算完毕事件应该总是被触发
                    //受到伤害的角色如果存活能发动的技能/会执行的技能效果:【酒诗②】、执行【天香】摸牌的效果。
                    Emit(GameEvent.DamageComputingFinished, damageArgs);
                    Trace.TraceInformation("Damage Aborted");
                    return;
                }
                Trace.Assert(false);
                return;
            }

            Trace.Assert(damageArgs.Targets.Count == 1);
            damageArgs.Targets[0].Health -= damageArgs.Magnitude;
            Trace.TraceInformation("Player {0} Lose {1} hp, @ {2} hp", damageArgs.Targets[0].Id, damageArgs.Magnitude, damageArgs.Targets[0].Health);
            NotificationProxy.NotifyDamage(damageArgs.Source, damageArgs.Targets[0], damageArgs.Magnitude, damageArgs.Element);
            GameDelays.Delay(GameDelays.Damage);

            try
            {
                Emit(GameEvent.AfterHealthChanged, healthChangedArgs);
            }
            catch (TriggerResultException)
            {
            }
            Emit(GameEvent.AfterDamageCaused, damageArgs);
            Emit(GameEvent.AfterDamageInflicted, damageArgs);
            Emit(GameEvent.DamageComputingFinished, damageArgs);
            if (ironShackledDamage != 0)
            {
                List <Player> toProcess = new List <Player>(AlivePlayers);
                SortByOrderOfComputation(CurrentPlayer, toProcess);
                foreach (Player p in toProcess)
                {
                    if (p.IsIronShackled)
                    {
                        readonlyCard[IsIronShackleDamage] = 1;
                        DoDamage(damageArgs.Source, p, originalTarget, ironShackledDamage, ironShackledDamageElement, card, readonlyCard);
                    }
                }
            }
        }
Beispiel #15
0
 private void view_HealthUpdated(object sender, HealthChangedEventArgs e)
 {
     playerModel.Health += e.difference;
 }