412 lines
14 KiB
C#
412 lines
14 KiB
C#
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<GameObject> DeployLocations;
|
|
public List<GameObject> 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<GenericDamager>().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<GenericDestructable>().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<Rigidbody2D>().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<SpriteRenderer>().enabled = false;
|
|
}
|
|
|
|
ChosenFireZone = FireZones[UnityEngine.Random.Range(0, FireZones.Count())];
|
|
//ChosenFireZone.GetComponent<SpriteRenderer>().enabled = true;
|
|
|
|
Spotlight.transform.Find("Spotlight").gameObject.GetComponent<SpriteRenderer>().enabled = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
foreach (GameObject location in FireZones) // Set all fire zones to invisible
|
|
{
|
|
//location.GetComponent<SpriteRenderer>().enabled = false;
|
|
}
|
|
|
|
Spotlight.transform.Find("Spotlight").gameObject.GetComponent<SpriteRenderer>().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<Rigidbody2D>().gravityScale = 3;
|
|
gameObject.GetComponent<BoxCollider2D>().isTrigger = false;
|
|
transform.Find("DamagerPiece").gameObject.GetComponent<GenericDamager>().LockDamage = false;
|
|
|
|
gameObject.layer = LayerMask.NameToLayer("FlyingEnemies");
|
|
|
|
if (transform.Find("SpotlightAxis")){
|
|
Spotlight.transform.Find("Spotlight").gameObject.GetComponent<SpriteRenderer>().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<Rigidbody2D>().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<Rigidbody2D>().gravityScale = 1.5f;
|
|
GrenadeInstance.GetComponent<EnemyGrenade>().enabled = true;
|
|
GrenadeInstance.GetComponent<EnemyGrenade>().ExplodeOnContact = true;
|
|
GrenadeInstance.GetComponent<EnemyGrenade>().Duration = UnityEngine.Random.Range(3, 8);
|
|
GrenadeInstance.GetComponent<Rigidbody2D>().linearVelocity = new Vector2(UnityEngine.Random.Range(-25,25), UnityEngine.Random.Range(10,25));
|
|
}
|
|
|
|
// Damage Boss
|
|
gameObject.GetComponent<GenericDestructable>().Health -= ShockwaveDamage;
|
|
|
|
// Shake Camera
|
|
Camera.GetComponent<CameraMovement>().shakeCamera(0.8f, 0.5f);
|
|
canJump = true;
|
|
if (Player.transform.GetComponentInChildren<GroundCheck>().isGrounded == true)
|
|
{
|
|
// Shockwave Damage
|
|
GameObject.Find("GameData").GetComponent<GameData>().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<MasterEnemyAI>().enabled = true;
|
|
Switchblade.GetComponent<MasterEnemyAI>().AbilityMove = false;
|
|
Switchblade.GetComponent<MasterEnemyAI>().AbilityDash = false;
|
|
|
|
await Awaitable.WaitForSecondsAsync(LaunchCooldown);
|
|
|
|
Switchblade.GetComponent<Seeker>().enabled = true;
|
|
Switchblade.GetComponent<MasterEnemyAI>().AbilityMove = true;
|
|
Switchblade.GetComponent<MasterEnemyAI>().AbilityDash = true;
|
|
Switchblade.GetComponent<MasterEnemyAI>().AbilityPlayerESP = true;
|
|
|
|
// Launch
|
|
Switchblade.GetComponent<Rigidbody2D>().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<Rigidbody2D>().linearVelocity = new Vector2(15, 30);
|
|
}
|
|
else if (Player.transform.position.x - transform.position.x < 0) // Jump left
|
|
{
|
|
GetComponent<Rigidbody2D>().linearVelocity = new Vector2(-15, 30);
|
|
}
|
|
else // Jump straight up
|
|
{
|
|
GetComponent<Rigidbody2D>().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<EnemyProjectileScript>().WeaponDamage = WeaponDamage;
|
|
BulletInstance.GetComponent<EnemyProjectileScript>().WeaponRange = WeaponRange;
|
|
|
|
// Send it on it's way
|
|
BulletInstance.GetComponent<Rigidbody2D>().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);
|
|
}
|
|
|
|
}
|