コード例 #1
0
ファイル: BombManager.cs プロジェクト: Danvil/ld26_minimal
    public void ExplodeBomb(Bomb bomb)
    {
        bombs.Remove(bomb);
        // mark explosion sight
        ExplosionSite site = new ExplosionSite();

        site.position = bomb.transform.position;
        site.time     = MyTime.time;
        explosions.Add(site);
        // damage living
        DamageLiving(site, bomb);
    }
コード例 #2
0
ファイル: BombManager.cs プロジェクト: Danvil/ld26_minimal
 void DamageLiving(ExplosionSite site, Bomb bomb)
 {
     foreach (Living x in Globals.BlobManager.GetLifeBehaviours())
     {
         if (Globals.Level.IsPathBlocked(site.position, x.transform.position))
         {
             // in cover
             continue;
         }
         float d   = (x.transform.position - site.position).magnitude;
         float dmg = bomb.ComputeDamage(d);
         if (bomb.IsPlayerBomb == (x == Globals.Player.living))
         {
             dmg *= x.FriendlyFireMult;
         }
         if (dmg > 0)
         {
             x.Health -= dmg;
         }
     }
 }
コード例 #3
0
ファイル: Enemy.cs プロジェクト: Danvil/ld26_minimal
    void UpdateGoal()
    {
        move.PlayerMinDistance = 0.0f;
        // go to explosion
        ExplosionSite[] sites = Globals.BombManager.GetExplosions();
        if (sites.Length > 0)
        {
            ExplosionSite site = sites.Last();
            // check if new goal
            if (site.time > goalTime)
            {
                // check if in sight
                if (!Globals.Level.IsPathBlocked(this.transform.position, site.position))
                {
                    move.SetGoal(site.position);
                    goalTime = MyTime.time;
                }
            }
        }
        // go to player
        Vector3 player_pos = Globals.Player.transform.position;

        if (!Globals.Level.IsPathBlocked(this.transform.position, player_pos) && (player_pos - this.transform.position).magnitude <= 5.0f)
        {
            move.PlayerMinDistance = PLAYER_APPROACH_DIST;
            hasLastPlayerPos       = true;
            lastPlayerPos          = player_pos;
            alarmTimeout           = 0.0f;
            Vector3 delta = player_pos - this.transform.position;
            if (delta.magnitude < PLAYER_APPROACH_DIST)
            {
                move.DisableGoal();
                // throw grenade
                bool isMega = (Random.value < MegaBombProbability);
                if (bombTimeout >= BOMB_TIMEOUT)
                {
                    if (Random.value < AimProbability)
                    {
                        if (NumBombs == 1)
                        {
                            Globals.BombManager.ThrowBomb(this.transform.position + new Vector3(0, 0, BombStartHeight), player_pos, false, isMega);
                        }
                        else
                        {
                            for (int i = 0; i < NumBombs; i++)
                            {
                                float dx = Random.Range(-0.2f, +0.2f);
                                float dy = Random.Range(-0.2f, +0.2f);
                                Globals.BombManager.ThrowBomb(this.transform.position + new Vector3(dx, dy, BombStartHeight), player_pos, false, isMega);
                            }
                        }
                    }
                    else
                    {
                        float deltaPhi = 6.283f / (float)(NumBombs);
                        float phi      = 0.0f;
                        for (int i = 0; i < NumBombs; i++, phi += deltaPhi)
                        {
                            float dx = Mathf.Cos(phi);
                            float dy = Mathf.Sin(phi);
                            Globals.BombManager.ThrowBomb(
                                this.transform.position + new Vector3(0.4f * dx, 0.4f * dy, BombStartHeight),
                                this.transform.position + new Vector3(5.0f * dx, 5.0f * dy, 0.0f),
                                false, isMega);
                        }
                    }
                    bombTimeout = 0.0f;
                }
            }
            else
            {
                move.SetGoal(player_pos);
            }
        }
        else
        {
            if (hasLastPlayerPos)
            {
                move.SetGoal(lastPlayerPos);
                if (move.isGoalReached())
                {
                    hasLastPlayerPos = false;
                    move.DisableGoal();
                }
            }
        }
    }