void HandleUsed()
 {
     GetComponent <SpriteRenderer>().sprite = usedAltar;
     GetComponent <Animator>().enabled      = false;
     GetComponentInChildren <ParticleSystem>()?.Stop();
     AnimUtils.ShowFloatingText("Upgraded first Rune!", transform.position);
 }
 // Start is called before the first frame update
 void Start()
 {
     this.enemyRunesManager = GameObject.Find("Enemy Runes").GetComponent <EnemyRunesManager>();
     transform.localScale   = new Vector3(0, 0, 1);
     Enemy.OnDeath         += () => {
         Destroy(this.gameObject);
     };
     Enemy.OnAttack += (target) => {
         float intensity      = 1;
         var   startPosition  = transform.position;
         var   targetPosition = new Vector3(target.Coordinates.x, target.Coordinates.y, startPosition.z);
         /// attack animation
         attackAnimation = StartCoroutine(AnimUtils.Animate(0.5f, (t) => {
             float lerp         = Mathf.Pow(Mathf.Cos(Mathf.PI / 2 + Mathf.PI * Mathf.Sqrt(t)), 4) * intensity;
             transform.position = Vector3.Lerp(startPosition, targetPosition, lerp);
             if (t == 1)
             {
                 attackAnimation = null;
             }
         }));
     };
     Enemy.OnHeal += (int heal) => {
         AnimUtils.AddDamageOrHealNumber(heal, transform.position, false);
     };
     Enemy.OnHit += (int damage) => {
         AnimUtils.AddDamageOrHealNumber(damage, transform.position, true);
     };
     Enemy.OnRuneTriggered += (message) => AnimUtils.ShowFloatingText(message, transform.position);
 }
Example #3
0
    void Start()
    {
        Player                  = Grid.instance.Player;
        Player.OnHit           += HandlePlayerHit;
        Player.OnHeal          += HandleHeal;
        Player.OnRuneTriggered += (message) => AnimUtils.ShowFloatingText(message, transform.position);
        transform.position      = new Vector3(Player.Coordinates.x, Player.Coordinates.y, 0);
        SoundEffectSource       = GameObject.Find("Player").GetComponent <AudioSource>();

        attackEffects = new List <AudioClip>(new AudioClip[] {
            (AudioClip)Resources.Load("Sounds/thwack-01"),
            (AudioClip)Resources.Load("Sounds/thwack-02"),
            (AudioClip)Resources.Load("Sounds/thwack-04"),
            (AudioClip)Resources.Load("Sounds/thwack-06"),
            (AudioClip)Resources.Load("Sounds/thwack-07"),
            (AudioClip)Resources.Load("Sounds/thwack-08"),
            (AudioClip)Resources.Load("Sounds/thwack-09"),
        });
    }
    public IEnumerator actionTaken(bool delay, Action then)
    {
        _elapsedTurns += 1;
        EnqueueEvent(new GameEvent(GameEvent.EventType.TURN_ELAPSED));

        var turnWaitDuration = delay ? 0.25f : 0;

        // wait 0.2f seconds
        yield return(new WaitForSeconds(turnWaitDuration));

        ClearEventQueue();

        Entities.FindAll(e => e.Dead).ForEach(e => {
            e.GoDie();

            Rune rune = e.RuneList[0];
            if (rune != null)
            {
                AnimUtils.ShowFloatingText("Rune Shard Recovered!", new Vector3(e.Coordinates.x, e.Coordinates.y, 0));
                if (UnityEngine.Random.value > 0.5f)
                {
                    Player.AddRuneShard(rune.action);
                }
                else
                {
                    Player.AddRuneShard(rune.trigger);
                }
            }

            this.EnqueueEvent(new GameEvent(GameEvent.EventType.ENEMY_DEAD));
        });

        Entities.RemoveAll(e => e.Dead);

        bool enemiesMoved = false;

        foreach (var e in Enemies)
        {
            e.TakeTurn();
            // if (e.isVisible) {
            enemiesMoved = true;
            //   yield return new WaitForSeconds(turnWaitDuration);
            // }
        }

        ClearEventQueue();

        // We want to prevent movement scumming, so if the player hasn't been hit in 75 turns, spawn some enemies
        if (++Player.TurnsSinceHitByEnemy >= 200)
        {
            var positions = EnumerateCircle(Player.Coordinates, 3)
                            .Where(pos => canOccupy(pos))
                            .ToList()
                            .Shuffle()
                            .Take(2);

            foreach (var pos in positions)
            {
                Enemy enemy = new Enemy0(pos);
                AddEntity(enemy);
                OnEntityAdded(enemy);
            }

            Player.TurnsSinceHitByEnemy = 0;
        }

        if (enemiesMoved)
        {
            yield return(new WaitForSeconds(turnWaitDuration));
        }

        /// Move onto the next floor!
        if (Tiles[Player.Coordinates.x, Player.Coordinates.y] is Downstairs)
        {
            Player.score += 10;
            OnCleared?.Invoke();
        }

        then();
    }