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(); }