using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using Pathfinding; using System.Threading.Tasks; using System; using System.Linq; using System.Text; public class Sector1BossScript : MonoBehaviour { // Designed by Jacob Weedman GameObject Player; GameObject Barrel; GameObject Target; GameObject ChosenFireZone; GameObject Spotlight; GameObject Camera; GameObject BossProjectile; public float Phase = 0.5f; public float Health = 800; public float angle; bool canDeploy = true; public float DeployTimer = 4; // sec float CurrentDeployTimer; // sec public List DeployLocations; public List FireZones; public int Choice; //1 == shoot >1 == deploy public float InitialChoiceCountdown = 2f; // sec public float ChoiceCountdown; // sec float InitialBulletInterval = 0.01f; float BulletInterval = 0.01f; float InitialMoveCountdown = 2; //sec float MoveCountdown = 6; // sec float LaunchCooldown = 2f; bool canJump = true; float InitialJumpDelay = 1000; float JumpDelay = 1000; bool canShockwaveDamage = true; int ShockwaveDamage = 10; int WeaponDamage = 1; int WeaponRange = 50; int WeaponProjectileSpeed = 20; int WeaponRandomSpread = 8; float MovementSpeed = 2.5f; // Start is called once before the first execution of Update after the MonoBehaviour is created void Awake() { Camera = GameObject.FindGameObjectWithTag("MainCamera"); BossProjectile = GameObject.Find("EnemyProjectile"); Player = GameObject.FindWithTag("Player"); Spotlight = transform.Find("SpotlightAxis").gameObject; Barrel = transform.Find("Barrel").gameObject; Target = GameObject.Find("BossTarget"); Target.transform.position = transform.position; transform.Find("DamagerPiece").gameObject.GetComponent().LockDamage = true; foreach (Transform spawner in transform) { if (spawner.name == "SwitchbladeSpawner") { DeployLocations.Add(spawner.gameObject); } } FireZones = GameObject.FindGameObjectsWithTag("1").ToList(); ChoiceCountdown = InitialChoiceCountdown; } // Update is called once per frame void FixedUpdate() { Health = gameObject.GetComponent().Health; GameObject.Find("HealthIndicator").transform.localScale = new Vector3(Health / 800 * 30, 1, 1); if (Phase == 1 && Choice > 1) { BackgroundMove(); } switch (Phase) { #region Phase1 case 1: // Phase 1 if (Health <= 400) { Health = 400; Phase = 1.5f; gameObject.GetComponent().linearVelocity = Vector2.up * 60; } if (ChosenFireZone) { // Angle spotlight towards fireing zone angle = Mathf.Atan2(ChosenFireZone.transform.position.y + 10 - Barrel.transform.position.y, ChosenFireZone.transform.position.x - Barrel.transform.position.x) * Mathf.Rad2Deg; angle += 90; // Rotate spotlight towards fireing zone Quaternion targetRotation = Quaternion.Euler(new Vector3(0, 0, angle)); Spotlight.transform.rotation = Quaternion.RotateTowards(Spotlight.transform.rotation, targetRotation, 200 * Time.deltaTime); } // Change attack speed if (Health >= 750) { DeployTimer = 4; InitialChoiceCountdown = 3.5f; LaunchCooldown = 1.75f; } else if (Health >= 700) { DeployTimer = 2; InitialChoiceCountdown = 3; LaunchCooldown = 1.50f; } else if (Health >= 650) { DeployTimer = 1; InitialChoiceCountdown = 2.5f; LaunchCooldown = 1.25f; } else if (Health >= 500) { DeployTimer = 0.5f; InitialChoiceCountdown = 1; LaunchCooldown = 0.75f; } ChoiceCountdown -= Time.deltaTime; if (ChoiceCountdown <= 0) { ChoiceCountdown = InitialChoiceCountdown; Choice = UnityEngine.Random.Range(1, 4); if (Choice == 1) // Find random firing zone { foreach (GameObject location in FireZones) // Set all fire zones to invisible { //location.GetComponent().enabled = false; } ChosenFireZone = FireZones[UnityEngine.Random.Range(0, FireZones.Count())]; //ChosenFireZone.GetComponent().enabled = true; Spotlight.transform.Find("Spotlight").gameObject.GetComponent().enabled = true; } else { foreach (GameObject location in FireZones) // Set all fire zones to invisible { //location.GetComponent().enabled = false; } Spotlight.transform.Find("Spotlight").gameObject.GetComponent().enabled = false; } } MoveCountdown -= Time.deltaTime; if (Vector2.Distance(Target.transform.position, transform.position) <= 0.1) { if (MoveCountdown <= 0 ) { MoveCountdown = InitialMoveCountdown; Target.transform.position = new Vector2(UnityEngine.Random.Range(-20, 13), UnityEngine.Random.Range(-1, 4)); } } else { MoveCountdown = InitialMoveCountdown; } if (Choice > 1) // Deploy { CurrentDeployTimer -= Time.deltaTime; if (CurrentDeployTimer <= 0) { canDeploy = true; } if (canDeploy) { CurrentDeployTimer = DeployTimer; canDeploy = false; Deploy(); } } else // Shoot { transform.position = Vector3.MoveTowards(transform.position, new Vector3(-3.5f, 6, transform.position.z), MovementSpeed * Time.deltaTime); BulletInterval -= Time.deltaTime; if (BulletInterval <= 0) { BulletInterval = InitialBulletInterval; Shoot(); } } break; #endregion #region Cutscene between 1 - 2 case 1.5f: // Cutscene between plases 1 & 2 gameObject.GetComponent().gravityScale = 3; gameObject.GetComponent().isTrigger = false; transform.Find("DamagerPiece").gameObject.GetComponent().LockDamage = false; gameObject.layer = LayerMask.NameToLayer("FlyingEnemies"); if (transform.Find("SpotlightAxis")){ Spotlight.transform.Find("Spotlight").gameObject.GetComponent().enabled = false; Destroy(transform.Find("SpotlightAxis").gameObject); } foreach (Transform child in transform) { if (child.name != "DamagerPiece") { child.gameObject.layer = LayerMask.NameToLayer("FlyingEnemies"); } } if (transform.position.y <= 1.5) { Phase = 2; } break; #endregion #region Phase2 case 2: // Phase 2 // Change attack speed if (Health >= 550) { float InitialJumpDelay = 1000; } else if (Health >= 400) { float InitialJumpDelay = 600; } else if (Health >= 300) { float InitialJumpDelay = 300; } else if (Health >= 200) { float InitialJumpDelay = 200; } if (Health <= 0) { Health = 0; Phase = 2.5f; } if (gameObject.GetComponent().linearVelocity.y < 0 && transform.position.y < -3f) { if (canShockwaveDamage) { for (int i = 0; i < 1; i++) { // Spawn Grunt GameObject GrenadeInstance = Instantiate(GameObject.Find("EnemyGrenade").gameObject, transform.position, Quaternion.identity); GrenadeInstance.GetComponent().gravityScale = 1.5f; GrenadeInstance.GetComponent().enabled = true; GrenadeInstance.GetComponent().ExplodeOnContact = true; GrenadeInstance.GetComponent().Duration = UnityEngine.Random.Range(3, 8); GrenadeInstance.GetComponent().linearVelocity = new Vector2(UnityEngine.Random.Range(-25,25), UnityEngine.Random.Range(10,25)); } // Damage Boss gameObject.GetComponent().Health -= ShockwaveDamage; // Shake Camera Camera.GetComponent().shakeCamera(0.8f, 0.5f); canJump = true; if (Player.transform.GetComponentInChildren().isGrounded == true) { // Shockwave Damage GameObject.Find("GameData").GetComponent().CurrentHealth -= ShockwaveDamage; } } canShockwaveDamage = false; } if (canJump) { Jump(); } break; #region Death Animation case 2.5f: Phase = 3; break; #endregion #region Death case 3: break; #endregion default: break; } #endregion } async Awaitable Deploy() { // Find Which module to deploy from GameObject ChosenSpawner = DeployLocations[UnityEngine.Random.Range(0, DeployLocations.Count())]; GameObject Switchblade; Switchblade = Instantiate(GameObject.Find("SwitchbladeEnemy"), new Vector3(ChosenSpawner.transform.position.x, ChosenSpawner.transform.position.y, -1), Quaternion.identity); Switchblade.transform.parent = gameObject.transform; Switchblade.GetComponent().enabled = true; Switchblade.GetComponent().AbilityMove = false; Switchblade.GetComponent().AbilityDash = false; await Awaitable.WaitForSecondsAsync(LaunchCooldown); Switchblade.GetComponent().enabled = true; Switchblade.GetComponent().AbilityMove = true; Switchblade.GetComponent().AbilityDash = true; Switchblade.GetComponent().AbilityPlayerESP = true; // Launch Switchblade.GetComponent().linearVelocity = new Vector2(UnityEngine.Random.Range(-15,15), 20); Switchblade.transform.parent = null; } async Awaitable Jump() { canJump = false; canShockwaveDamage = true; await Awaitable.WaitForSecondsAsync(1); // Jump Towards Player if (Player.transform.position.x - transform.position.x > 0) // Jump right { GetComponent().linearVelocity = new Vector2(15, 30); } else if (Player.transform.position.x - transform.position.x < 0) // Jump left { GetComponent().linearVelocity = new Vector2(-15, 30); } else // Jump straight up { GetComponent().linearVelocity = new Vector2(0, 30); } } void Shoot() { if (ChosenFireZone) { // Create Projectile GameObject BulletInstance; BulletInstance = Instantiate(BossProjectile, Barrel.transform.position, Quaternion.LookRotation(transform.position - ChosenFireZone.transform.position + new Vector3(UnityEngine.Random.Range((-1 * WeaponRandomSpread), WeaponRandomSpread), UnityEngine.Random.Range((-1 * WeaponRandomSpread), WeaponRandomSpread), 0))); //BulletInstance.transform.parent = transform; // Variables BulletInstance.GetComponent().WeaponDamage = WeaponDamage; BulletInstance.GetComponent().WeaponRange = WeaponRange; // Send it on it's way BulletInstance.GetComponent().linearVelocity = BulletInstance.transform.forward * -1 * WeaponProjectileSpeed; BulletInstance.transform.rotation = Quaternion.Euler(new Vector3(0, 0, Vector2.SignedAngle(Vector2.right, BulletInstance.transform.forward) - 90)); } } void BackgroundMove() { transform.position = Vector3.MoveTowards(transform.position, new Vector3(Target.transform.position.x, Target.transform.position.y, transform.position.z), MovementSpeed * Time.deltaTime); } }