Exemplo n.º 1
0
    public void TakeHit(int damage, InteriorProblemOdds problemOdds = null)
    {
        if (!invincible && barrelRollTimer <= 0f)
        {
            if (shields > 0 && ShieldsEnabled)
            {
                shields = Mathf.Max(shields - 1, 0); // could change to damage, if wanted that. But currently just negates a hit
                UpdateShieldsSprite();
            }
            else
            {
                currentHitPoints = Mathf.Max(currentHitPoints - damage, 0);
                UpdateDamageSprite();

                if (currentHitPoints <= 0)
                {
                    if (explosionPrefab != null)
                    {
                        Instantiate(explosionPrefab, transform.position, Quaternion.identity);
                    }
                    exteriorManager.HandleShipDestroyed(this);
                    Destroy(gameObject);
                }
            }
        }

        shipHitEvent.Invoke();
        interiorManager.HandleShipDamage(problemOdds);
    }
    public void HandleShipDamage(InteriorProblemOdds problemOdds = null)
    {
        // Shake things up
        interiorCameraQuad.GetComponent <CameraShake>().Shake(0.3f, 0.005f);
        interiorShipMap.GetComponent <CameraShake>().Shake(0.3f, 0.005f);

        // Rough up the player
        interiorPlayer.DropItem();
        interiorPlayer.RandomPush();

        // Push anything that can be pushed! Really shake things up.
        Pushable[] pushables = GameObject.FindObjectsOfType <Pushable>();
        for (int i = 0; i < pushables.Length; i++)
        {
            pushables[i].RandomPush();
        }

        // ---- Spawn Problems for Intrior Player ---- //

        if (problemOdds == null)
        {
            problemOdds             = new InteriorProblemOdds();
            problemOdds.nothingOdds = 100f;
            problemOdds.debrisOdds  = 100f;
            problemOdds.steamOdds   = 100f;
            problemOdds.flameOdds   = 100f;
            problemOdds.breachOdds  = 100f;
        }

        int problemsSpawned = 0;

        // Problems that can occur when shields are up
        int steamSpawned = CheckSpawnSteamVents(problemOdds.ComputeChanceForProblem(InteriorProblemType.Steam), problemOdds.numProblems);

        problemsSpawned += steamSpawned;

        // Problems that can only occur when shields are down
        if (exteriorShip.Shields <= 0 || !exteriorShip.ShieldsEnabled)
        {
            aSource.PlayOneShot(hullHitSounds[Random.Range(0, hullHitSounds.Length)], 0.5f);

            int fSpawned = CheckSpawnFlame(problemOdds.ComputeChanceForProblem(InteriorProblemType.Flame), problemOdds.numProblems);
            int dSpawned = CheckSpawnDebris(problemOdds.ComputeChanceForProblem(InteriorProblemType.Debris), problemOdds.numProblems);
            int hSpawned = CheckSpawnHullBreach(problemOdds.ComputeChanceForProblem(InteriorProblemType.Breach), problemOdds.numProblems);

            problemsSpawned += fSpawned + dSpawned + hSpawned;
        }
        else
        {
            aSource.PlayOneShot(shieldHitSounds[Random.Range(0, shieldHitSounds.Length)], 0.5f);
        }

        if (problemsSpawned == 0)
        {
            SpawnSteamVent(1);                       // always spawn at least one problem TEMPORARY FIX
        }
        UpdateShipHPUI();
    }