add all mechanics
This commit is contained in:
parent
87383d5b8c
commit
0e2a7cc7c3
434 changed files with 238349 additions and 2092 deletions
|
|
@ -56,8 +56,11 @@ public class CirnoFreezeDeflect : EnemyAbility
|
|||
currentDelay -= Time.deltaTime;
|
||||
if (currentDelay <= 0)
|
||||
{
|
||||
if (projectilesInRange.Count > 0)
|
||||
{
|
||||
currentDissipationTime = sweepDissipationTime;
|
||||
}
|
||||
DeflectProjectiles();
|
||||
currentDissipationTime = sweepDissipationTime;
|
||||
swordSweepEffect.SetActive(true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ public class EnemyAbility : Ability
|
|||
|
||||
public override bool TryAbility()
|
||||
{
|
||||
WaveManager.instance.audioSource.PlayOneShot(abilitySound, volume);
|
||||
if (willLookAtPlayer)
|
||||
{
|
||||
direction = WaveManager.instance.GetRandomPlayerPoint();
|
||||
|
|
@ -20,9 +21,13 @@ public class EnemyAbility : Ability
|
|||
}
|
||||
return base.TryAbility();
|
||||
}
|
||||
public void ShootProjectile(Projectile projectile, Vector3 location, float speed, bool aimed)
|
||||
public void ShootProjectile(Projectile projectile, Vector3 location, float speed, bool aimed, Transform bulletParent = null)
|
||||
{
|
||||
Projectile newProjectile = Instantiate(projectile, origin.position, Quaternion.identity);
|
||||
if (bulletParent)
|
||||
{
|
||||
newProjectile.transform.SetParent(bulletParent);
|
||||
}
|
||||
Vector3 projectileDirection = location;
|
||||
if (aimed)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ public class EnemyBulletPattern : EnemyAbility
|
|||
public float burstTiming;
|
||||
public float projectileSpeed;
|
||||
public bool aimedShot;
|
||||
public Transform bulletParent = null;
|
||||
}
|
||||
|
||||
[SerializeField] protected ProjectileDirection[] projectileDirections;
|
||||
|
|
@ -33,7 +34,7 @@ public class EnemyBulletPattern : EnemyAbility
|
|||
{
|
||||
if (projectileDirection.timing <= 0 && projectileDirection.amount <= 1)
|
||||
{
|
||||
ShootProjectile(projectileDirection.projectile, projectileDirection.direction.position, projectileDirection.projectileSpeed, projectileDirection.aimedShot);
|
||||
ShootProjectile(projectileDirection.projectile, projectileDirection.direction.position, projectileDirection.projectileSpeed, projectileDirection.aimedShot, projectileDirection.bulletParent);
|
||||
}
|
||||
else if (projectileDirection.amount > 1)
|
||||
{
|
||||
|
|
@ -51,7 +52,7 @@ public class EnemyBulletPattern : EnemyAbility
|
|||
int currentCount = 0;
|
||||
while (currentCount < burstCount)
|
||||
{
|
||||
ShootProjectile(projectile.projectile, projectile.direction.position, projectile.projectileSpeed, projectile.aimedShot);
|
||||
ShootProjectile(projectile.projectile, projectile.direction.position, projectile.projectileSpeed, projectile.aimedShot, projectile.bulletParent);
|
||||
currentCount++;
|
||||
yield return new WaitForSeconds(burstDelay);
|
||||
}
|
||||
|
|
@ -72,7 +73,7 @@ public class EnemyBulletPattern : EnemyAbility
|
|||
}
|
||||
else
|
||||
{
|
||||
ShootProjectile(projectile.projectile, projectile.direction.position, projectile.projectileSpeed, projectile.aimedShot);
|
||||
ShootProjectile(projectile.projectile, projectile.direction.position, projectile.projectileSpeed, projectile.aimedShot, projectile.bulletParent);
|
||||
}
|
||||
}
|
||||
yield return null;
|
||||
|
|
|
|||
14
Assets/Scripts/Abilities/MultiPattern.cs
Normal file
14
Assets/Scripts/Abilities/MultiPattern.cs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
using UnityEngine;
|
||||
|
||||
public class MultiPattern : EnemyAbility
|
||||
{
|
||||
[SerializeField] private EnemyBulletPattern[] patterns;
|
||||
protected override void AbilityEffects()
|
||||
{
|
||||
base.AbilityEffects();
|
||||
foreach (EnemyBulletPattern pattern in patterns)
|
||||
{
|
||||
pattern.TryAbility();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Abilities/MultiPattern.cs.meta
Normal file
2
Assets/Scripts/Abilities/MultiPattern.cs.meta
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3ab2599b41b50f9c386745492b5e289f
|
||||
|
|
@ -170,7 +170,7 @@ public class YoumuDeflect : Ability
|
|||
List<Enemy> enemiesFound = new();
|
||||
foreach (Collider2D foundEntity in entitiesFound)
|
||||
{
|
||||
if (!foundEntity.CompareTag(tag) && foundEntity.TryGetComponent(out Enemy isEnemy))
|
||||
if (!foundEntity.CompareTag(tag) && foundEntity.TryGetComponent(out Enemy isEnemy) && !isEnemy.isBossEnemy)
|
||||
{
|
||||
enemiesFound.Add(isEnemy);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ public class CutsceneManager : MonoBehaviour
|
|||
public TextMeshProUGUI nameText;
|
||||
public TextMeshProUGUI dialogueText;
|
||||
public Image sceneImage;
|
||||
[Header("Audio")]
|
||||
public AudioSource source;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
|
|
@ -22,11 +24,13 @@ public class CutsceneManager : MonoBehaviour
|
|||
{
|
||||
currentText = 0;
|
||||
scriptToShow = newDialogue;
|
||||
DialogueScript.Dialogue currentDialogue = scriptToShow.dialogueList[currentText];
|
||||
nameText.text = currentDialogue.character.name;
|
||||
sceneImage.sprite = currentDialogue.cutsceneImage;
|
||||
dialogueText.text = currentDialogue.text;
|
||||
dialogueText.color = currentDialogue.character.textColor; //probably should make current dialogue a variable lol
|
||||
if (scriptToShow.musicToPlay)
|
||||
{
|
||||
source.clip = scriptToShow.musicToPlay;
|
||||
source.volume = scriptToShow.volume;
|
||||
source.Play();
|
||||
}
|
||||
SetDialogue();
|
||||
}
|
||||
|
||||
public void ContinueDialogue()
|
||||
|
|
@ -37,8 +41,22 @@ public class CutsceneManager : MonoBehaviour
|
|||
EndDialogue();
|
||||
return;
|
||||
}
|
||||
SetDialogue();
|
||||
}
|
||||
|
||||
private void SetDialogue()
|
||||
{
|
||||
DialogueScript.Dialogue currentDialogue = scriptToShow.dialogueList[currentText];
|
||||
nameText.text = currentDialogue.character.characterName;
|
||||
if (currentDialogue.character)
|
||||
{
|
||||
nameText.text = currentDialogue.character.characterName;
|
||||
dialogueText.color = currentDialogue.character.textColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
nameText.text = "";
|
||||
dialogueText.color = Color.white;
|
||||
}
|
||||
sceneImage.sprite = currentDialogue.cutsceneImage;
|
||||
dialogueText.text = currentDialogue.text;
|
||||
}
|
||||
|
|
@ -54,5 +72,9 @@ public class CutsceneManager : MonoBehaviour
|
|||
{
|
||||
ContinueDialogue();
|
||||
}
|
||||
else if (Input.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
EndDialogue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,10 @@ public class DialogueCharacter : ScriptableObject
|
|||
{
|
||||
Reisen,
|
||||
Youmu,
|
||||
Enemy
|
||||
Enemy,
|
||||
Lunasa,
|
||||
Merlin,
|
||||
Lyrica //the worlds WORST code
|
||||
}
|
||||
public Character thisCharacter;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,12 @@ public class DialogueManager : MonoBehaviour
|
|||
[SerializeField] private TextMeshProUGUI youmuText;
|
||||
[SerializeField] private GameObject reisenSpeechBubble; //have to change the dialogue for this but it's probably fine
|
||||
[SerializeField] private TextMeshProUGUI reisenText;
|
||||
[SerializeField] private GameObject merlinSpeechBubble; //hell
|
||||
[SerializeField] private TextMeshProUGUI merlinText;
|
||||
[SerializeField] private GameObject lyricaSpeechBubble;
|
||||
[SerializeField] private TextMeshProUGUI lyricaText;
|
||||
[SerializeField] private GameObject lunasaSpeechBubble;
|
||||
[SerializeField] private TextMeshProUGUI lunasaText;
|
||||
[Header("Animation")]
|
||||
[SerializeField] private Animator reisenAnimator;
|
||||
[SerializeField] private Animator youmuAnimator;
|
||||
|
|
@ -40,16 +46,37 @@ public class DialogueManager : MonoBehaviour
|
|||
[SerializeField] private string switchToIdleTrigger;
|
||||
[SerializeField] private string changeDialogueTrigger;
|
||||
[SerializeField] private string talkTrigger;
|
||||
|
||||
public Animator battleUIAnimator;
|
||||
[SerializeField] private string dialogueStartTrigger;
|
||||
[SerializeField] private string dialogueEndTrigger;
|
||||
public string nobossTrigger;
|
||||
|
||||
public void StartDialogue(DialogueScript newDialogue)
|
||||
{
|
||||
dialogueUI.SetActive(true);
|
||||
WaveManager.instance.bossUI.SetActive(false);
|
||||
dialogueActive = true;
|
||||
currentText = 0;
|
||||
scriptToShow = newDialogue;
|
||||
battleUIAnimator.SetTrigger(dialogueStartTrigger);
|
||||
DialogueScript.Dialogue currentDialogue = scriptToShow.dialogueList[currentText];
|
||||
bossSpeechBubble.transform.position = WaveManager.instance.bossInstance.transform.position + offset;
|
||||
if (WaveManager.instance.bossInstance)
|
||||
{
|
||||
bossSpeechBubble.position = WaveManager.instance.bossInstance.transform.position + offset;
|
||||
WaveManager.instance.musicSource.clip = WaveManager.instance.bossDialogueLoop;
|
||||
WaveManager.instance.musicSource.volume = WaveManager.instance.bossVolume;
|
||||
WaveManager.instance.musicSource.Play();
|
||||
}
|
||||
if (WaveManager.instance.lyricaInstance)
|
||||
{
|
||||
WaveManager.instance.lyricaInstance.isStalled = true;
|
||||
lunasaSpeechBubble.transform.position = WaveManager.instance.lunasaInstance.transform.position + offset;
|
||||
merlinSpeechBubble.transform.position = WaveManager.instance.merlinInstance.transform.position + offset;
|
||||
lyricaSpeechBubble.transform.position = WaveManager.instance.lyricaInstance.transform.position + offset;
|
||||
WaveManager.instance.musicSource.clip = WaveManager.instance.finalDialogueLoop;
|
||||
WaveManager.instance.musicSource.volume = WaveManager.instance.finalVolume;
|
||||
WaveManager.instance.musicSource.Play();
|
||||
}
|
||||
SetDialogue(currentDialogue);
|
||||
reisenAnimator.SetTrigger(switchToDialogueTrigger);
|
||||
youmuAnimator.SetTrigger(switchToDialogueTrigger);
|
||||
|
|
@ -74,10 +101,31 @@ public class DialogueManager : MonoBehaviour
|
|||
dialogueUI.SetActive(false);
|
||||
WaveManager.instance.player.isStalled = false;
|
||||
WaveManager.instance.player.invulnerable = false;
|
||||
WaveManager.instance.bossInstance.isStalled = false;
|
||||
battleUIAnimator.SetTrigger(dialogueEndTrigger);
|
||||
if (WaveManager.instance.bossInstance)
|
||||
{
|
||||
WaveManager.instance.bossInstance.isStalled = false;
|
||||
WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.musicSource.clip = WaveManager.instance.bossMusic;
|
||||
WaveManager.instance.musicSource.Play();
|
||||
}
|
||||
if (WaveManager.instance.lunasaInstance)
|
||||
{
|
||||
WaveManager.instance.lunasaInstance.isStalled = false;
|
||||
WaveManager.instance.merlinInstance.isStalled = false;
|
||||
WaveManager.instance.lyricaInstance.isStalled = false;
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.musicSource.clip = WaveManager.instance.finalMusic;
|
||||
WaveManager.instance.musicSource.Play();
|
||||
}
|
||||
//GameManager.instance.SetPause(false);
|
||||
WaveManager.instance.bossUI.SetActive(true);
|
||||
WaveManager.instance.musicSource.Play();
|
||||
reisenAnimator.SetTrigger(switchToIdleTrigger);
|
||||
youmuAnimator.SetTrigger(switchToIdleTrigger);
|
||||
|
||||
}
|
||||
|
||||
private void SetDialogue(DialogueScript.Dialogue textToShow)
|
||||
|
|
@ -85,6 +133,9 @@ public class DialogueManager : MonoBehaviour
|
|||
reisenSpeechBubble.SetActive(false);
|
||||
youmuSpeechBubble.SetActive(false);
|
||||
bossSpeechBubble.gameObject.SetActive(false);
|
||||
lyricaSpeechBubble.SetActive(false);
|
||||
merlinSpeechBubble.SetActive(false);
|
||||
lunasaSpeechBubble.SetActive(false);
|
||||
switch (textToShow.character.thisCharacter) //everyone will hate this code but that's alright
|
||||
{
|
||||
case DialogueCharacter.Character.Reisen:
|
||||
|
|
@ -92,18 +143,66 @@ public class DialogueManager : MonoBehaviour
|
|||
reisenText.text = textToShow.text;
|
||||
youmuAnimator.SetTrigger(changeDialogueTrigger);
|
||||
reisenAnimator.SetTrigger(talkTrigger);
|
||||
if (WaveManager.instance.lyricaInstance)
|
||||
{
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
}
|
||||
break;
|
||||
case DialogueCharacter.Character.Youmu:
|
||||
youmuSpeechBubble.SetActive(true);
|
||||
youmuText.text = textToShow.text;
|
||||
youmuAnimator.SetTrigger(talkTrigger);
|
||||
reisenAnimator.SetTrigger(changeDialogueTrigger);
|
||||
if (WaveManager.instance.lyricaInstance)
|
||||
{
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
}
|
||||
break;
|
||||
case DialogueCharacter.Character.Enemy:
|
||||
bossSpeechBubble.gameObject.SetActive(true);
|
||||
bossText.text = textToShow.text;
|
||||
reisenAnimator.SetTrigger(changeDialogueTrigger);
|
||||
youmuAnimator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.bossInstance.animator.SetTrigger(talkTrigger);
|
||||
break;
|
||||
case DialogueCharacter.Character.Lunasa:
|
||||
lunasaSpeechBubble.gameObject.SetActive(true);
|
||||
lunasaText.text = textToShow.text;
|
||||
reisenAnimator.SetTrigger(changeDialogueTrigger);
|
||||
youmuAnimator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(talkTrigger);
|
||||
break;
|
||||
case DialogueCharacter.Character.Merlin:
|
||||
merlinSpeechBubble.gameObject.SetActive(true);
|
||||
merlinText.text = textToShow.text;
|
||||
reisenAnimator.SetTrigger(changeDialogueTrigger);
|
||||
youmuAnimator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(talkTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
break;
|
||||
case DialogueCharacter.Character.Lyrica:
|
||||
lyricaSpeechBubble.gameObject.SetActive(true);
|
||||
lyricaText.text = textToShow.text;
|
||||
reisenAnimator.SetTrigger(changeDialogueTrigger);
|
||||
youmuAnimator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lyricaInstance.animator.SetTrigger(talkTrigger);
|
||||
WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -116,6 +215,10 @@ public class DialogueManager : MonoBehaviour
|
|||
{
|
||||
ContinueDialogue();
|
||||
}
|
||||
else if (Input.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
EndDialogue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,4 +12,7 @@ public class DialogueScript : ScriptableObject
|
|||
}
|
||||
public Dialogue[] dialogueList;
|
||||
public int nextScene;
|
||||
public AudioClip dialogueLoop;
|
||||
public AudioClip musicToPlay;
|
||||
public float volume;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ public class EndlessWaveManager : WaveManager
|
|||
[SerializeField] private float exponentIncrease;
|
||||
protected override void SpawnWave()
|
||||
{
|
||||
waveUI.text = $"Wave: {wave}";
|
||||
//waveUI.text = $"Wave: {wave}";
|
||||
int amountToSpawn = Mathf.FloorToInt(baseSpawnAmount * Mathf.Pow(wave, exponentIncrease));
|
||||
for (int i = 0; i < amountToSpawn; i++)
|
||||
{
|
||||
|
|
@ -25,6 +25,9 @@ public class EndlessWaveManager : WaveManager
|
|||
|
||||
public override void UpdateKills()
|
||||
{
|
||||
|
||||
if (enemiesInPlay.Count == 0)
|
||||
{
|
||||
SpawnWave();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,12 +18,14 @@ public class Enemy : Entity
|
|||
[SerializeField] private float variance;
|
||||
public Coroutine currentMovementRoutine;
|
||||
[Header("boss stuff")]
|
||||
[SerializeField] private bool isBossEnemy;
|
||||
public bool isBossEnemy;
|
||||
[SerializeField] private bool hasStartedDialogue;
|
||||
[Header("Attack")]
|
||||
[SerializeField] private float attackCooldown;
|
||||
private float currentAttackCooldown;
|
||||
[SerializeField] private DialogueScript thisBossDialogue;
|
||||
[SerializeField] private DialogueScript thisBossDialogue;
|
||||
[Header("Animation")]
|
||||
public Animator animator;
|
||||
public event Action onTakeDamage;
|
||||
|
||||
private void Start()
|
||||
|
|
@ -100,7 +102,10 @@ public class Enemy : Entity
|
|||
WaveManager.instance.UpdateKills();
|
||||
if (isBossEnemy)
|
||||
{
|
||||
WaveManager.instance.bossUI.SetActive(false);
|
||||
DialogueManager.instance.battleUIAnimator.SetTrigger(DialogueManager.instance.nobossTrigger);
|
||||
WaveManager.instance.musicSource.clip = WaveManager.instance.musicLoop;
|
||||
WaveManager.instance.musicSource.volume = WaveManager.instance.musicVolume;
|
||||
WaveManager.instance.musicSource.Play();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -129,7 +134,10 @@ public class Enemy : Entity
|
|||
if (isBossEnemy && !hasStartedDialogue)
|
||||
{
|
||||
hasStartedDialogue = true;
|
||||
DialogueManager.instance.StartDialogue(thisBossDialogue); //the worst code ever
|
||||
if (thisBossDialogue)
|
||||
{
|
||||
DialogueManager.instance.StartDialogue(thisBossDialogue); //the worst code ever
|
||||
}
|
||||
isStalled = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,18 +1,27 @@
|
|||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class Player : Entity
|
||||
{
|
||||
[Header("Invulnerability")]
|
||||
[SerializeField] private float invulnerabilityLength;
|
||||
private float currentInvulnerabilityTime;
|
||||
[SerializeField] private float invincibilityBlinkLength;
|
||||
private float currentInvincibilityBlink;
|
||||
[SerializeField] private SpriteRenderer[] playerSprites;
|
||||
[SerializeField] private Color invincibilityColor;
|
||||
[Header("UI")]
|
||||
[SerializeField] private TextMeshProUGUI livesText;
|
||||
[SerializeField] private Image[] healthBar;
|
||||
[SerializeField] private Sprite heart;
|
||||
[SerializeField] private Sprite depletedHeart;
|
||||
|
||||
[Header("SFX")]
|
||||
[SerializeField] private AudioClip hurtSound;
|
||||
[SerializeField] private float hurtVolume = 1f;
|
||||
[SerializeField] private AudioClip gameOverSound;
|
||||
[SerializeField] private float gameOverVolume = 1f;
|
||||
private void Update()
|
||||
{
|
||||
if (!isStalled)
|
||||
|
|
@ -30,8 +39,24 @@ public class Player : Entity
|
|||
if (currentInvulnerabilityTime > 0)
|
||||
{
|
||||
currentInvulnerabilityTime -= Time.deltaTime;
|
||||
if (currentInvincibilityBlink > 0)
|
||||
{
|
||||
currentInvincibilityBlink -= Time.deltaTime;
|
||||
foreach (SpriteRenderer sprite in playerSprites)
|
||||
{
|
||||
sprite.color = Color.Lerp(invincibilityColor, Color.white, 1f - currentInvincibilityBlink);
|
||||
}
|
||||
}
|
||||
else if (currentInvincibilityBlink <= 0)
|
||||
{
|
||||
currentInvincibilityBlink = invincibilityBlinkLength;
|
||||
}
|
||||
if (currentInvulnerabilityTime <= 0)
|
||||
{
|
||||
foreach (SpriteRenderer sprite in playerSprites)
|
||||
{
|
||||
sprite.color = Color.white;
|
||||
}
|
||||
invulnerable = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -53,9 +78,20 @@ public class Player : Entity
|
|||
protected override void OnDeath()
|
||||
{
|
||||
GameManager.instance.LoseGame();
|
||||
WaveManager.instance.audioSource.PlayOneShot(gameOverSound, gameOverVolume);
|
||||
}
|
||||
private void UpdateLivesUI()
|
||||
{
|
||||
livesText.text = $"Lives: {health}/{maxHealth}";
|
||||
for (int i = 0; i < healthBar.Length; i++)
|
||||
{
|
||||
if (i < health)
|
||||
{
|
||||
healthBar[i].sprite = heart;
|
||||
}
|
||||
else
|
||||
{
|
||||
healthBar[i].sprite = depletedHeart;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
17
Assets/Scripts/Entities/Prismriver.cs
Normal file
17
Assets/Scripts/Entities/Prismriver.cs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
using UnityEngine;
|
||||
|
||||
public class Prismriver : Enemy
|
||||
{
|
||||
public override void TakeDamage(int damage)
|
||||
{
|
||||
if (!invulnerable)
|
||||
{
|
||||
WaveManager.instance.prismHP -= damage;
|
||||
WaveManager.instance.UpdateBossUI();
|
||||
}
|
||||
if (WaveManager.instance.prismHP <= 0)
|
||||
{
|
||||
OnDeath();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Entities/Prismriver.cs.meta
Normal file
2
Assets/Scripts/Entities/Prismriver.cs.meta
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 806a8fd558ae195dea2036e9d77338b4
|
||||
|
|
@ -113,7 +113,7 @@ public class GameManager : MonoBehaviour
|
|||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Escape)) //we need to convert this to a better input system
|
||||
if (Input.GetKeyDown(KeyCode.Escape) && !DialogueManager.instance.dialogueActive) //we need to convert this to a better input system
|
||||
{
|
||||
SetPauseMenu();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class MainMenuHandler : MonoBehaviour
|
||||
{
|
||||
|
|
@ -11,15 +13,21 @@ public class MainMenuHandler : MonoBehaviour
|
|||
[SerializeField] private Transform uiMovingObject;
|
||||
[SerializeField] private DialogueScript startingScript;
|
||||
|
||||
[Header("Scene Transition")]
|
||||
[SerializeField] private Image screenFade;
|
||||
[SerializeField] private float fadeSpeed;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
//uiAnimator.SetTrigger(gameStartAction);
|
||||
screenFade.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public void StartGame()
|
||||
{
|
||||
LevelSwitcher.instance.SwitchLevel(2, startingScript);
|
||||
screenFade.gameObject.SetActive(true);
|
||||
screenFade.color = Color.clear;
|
||||
StartCoroutine(FadeScreen(2, startingScript));
|
||||
}
|
||||
|
||||
public void StartEndless()
|
||||
|
|
@ -41,4 +49,19 @@ public class MainMenuHandler : MonoBehaviour
|
|||
{
|
||||
uiAnimator.SetTrigger(closeUIAction);
|
||||
}
|
||||
|
||||
private IEnumerator FadeScreen(int sceneToSwitchTo, DialogueScript scriptToShow)
|
||||
{
|
||||
float state = 0f;
|
||||
while (state < 1f)
|
||||
{
|
||||
state += Time.deltaTime * fadeSpeed;
|
||||
screenFade.color = Color.Lerp(Color.clear, Color.black, state);
|
||||
if (state >= 1)
|
||||
{
|
||||
LevelSwitcher.instance.SwitchLevel(sceneToSwitchTo, scriptToShow);
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ public class DelayedAimShot : Projectile
|
|||
return (WaveManager.instance.GetRandomPlayerPoint() - transform.position).normalized;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
protected override void Update()
|
||||
{
|
||||
if (aimDelay > 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ public class Projectile : MonoBehaviour
|
|||
public float volume;
|
||||
[SerializeField] private Rigidbody2D rb;
|
||||
public SpriteRenderer sprite;
|
||||
public bool willUnparent;
|
||||
public float unparentTime;
|
||||
|
||||
protected virtual void Start()
|
||||
{
|
||||
|
|
@ -25,6 +27,18 @@ public class Projectile : MonoBehaviour
|
|||
direction = transform.right;
|
||||
}
|
||||
|
||||
protected virtual void Update()
|
||||
{
|
||||
if (willUnparent && unparentTime > 0)
|
||||
{
|
||||
unparentTime -= Time.deltaTime;
|
||||
if (unparentTime <= 0)
|
||||
{
|
||||
transform.SetParent(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void FixedUpdate()
|
||||
{
|
||||
rb.linearVelocity = direction * speed;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using System.Collections;
|
|||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
public class WaveManager : MonoBehaviour
|
||||
|
|
@ -31,8 +32,7 @@ public class WaveManager : MonoBehaviour
|
|||
public Enemy[] enemies;
|
||||
public bool bossWave;
|
||||
public Enemy bossEnemy; //optional
|
||||
public string bossName;
|
||||
public string bossDescription;
|
||||
public Texture bossName;
|
||||
//public DialogueScript bossDialogue;
|
||||
}
|
||||
|
||||
|
|
@ -46,30 +46,46 @@ public class WaveManager : MonoBehaviour
|
|||
[SerializeField] private Transform enemyBRPoint;
|
||||
public Transform enemySpawnPoint;
|
||||
[Header("Waves")]
|
||||
[SerializeField] protected TextMeshProUGUI waveUI;
|
||||
public int wave = 1;
|
||||
public Wave[] waveList;
|
||||
[Header("Boss")]
|
||||
public Enemy bossInstance;
|
||||
public GameObject bossUI;
|
||||
[SerializeField] private TextMeshProUGUI bossNameUI;
|
||||
[SerializeField] private TextMeshProUGUI bossDescriptionUI;
|
||||
[SerializeField] private RawImage bossNameUI;
|
||||
[SerializeField] private Transform bossHPBar;
|
||||
[SerializeField] private TextMeshProUGUI bossHPText;
|
||||
|
||||
[Header("Final Boss")]
|
||||
[SerializeField] private Prismriver lunasa;
|
||||
[SerializeField] private Prismriver merlin;
|
||||
[SerializeField] private Prismriver lyrica;
|
||||
public Prismriver lunasaInstance;
|
||||
public Prismriver merlinInstance;
|
||||
public Prismriver lyricaInstance;
|
||||
public int prismMaxHP;
|
||||
public int prismHP;
|
||||
public DialogueScript prismriverDialogue;
|
||||
[Header("Enemies")]
|
||||
public Transform enemyFolder;
|
||||
public List<Enemy> enemiesInPlay = new();
|
||||
[SerializeField] private float enemyCheckRadius;
|
||||
[SerializeField] private LayerMask enemyLayer;
|
||||
[Header("Audio")]
|
||||
public AudioClip bossDialogueLoop;
|
||||
public AudioClip bossMusic;
|
||||
public float bossVolume;
|
||||
public AudioClip finalDialogueLoop;
|
||||
public AudioClip finalMusic;
|
||||
public float finalVolume;
|
||||
public AudioSource audioSource;
|
||||
[SerializeField] private AudioSource musicSource;
|
||||
public AudioSource musicSource;
|
||||
[SerializeField] private AudioClip musicIntro;
|
||||
public AudioClip musicLoop;
|
||||
public float musicVolume;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
SpawnWave();
|
||||
//SpawnFinalBoss();
|
||||
musicSource.volume = musicVolume;
|
||||
musicSource.PlayOneShot(musicIntro, musicVolume);
|
||||
StartCoroutine(WaitForLoop());
|
||||
|
|
@ -84,10 +100,17 @@ public class WaveManager : MonoBehaviour
|
|||
public Vector3 GetRandomEnemyPoint()
|
||||
{
|
||||
Vector3 randomPoint;
|
||||
int currentAttempts = 0;
|
||||
do
|
||||
{
|
||||
randomPoint = new Vector3(Random.Range(enemyTLPoint.position.x, enemyBRPoint.position.x),
|
||||
Random.Range(enemyBRPoint.position.y, enemyTLPoint.position.y), 0);
|
||||
currentAttempts++;
|
||||
if (currentAttempts > 50)
|
||||
{
|
||||
return new Vector3(Random.Range(enemyTLPoint.position.x, enemyBRPoint.position.x),
|
||||
Random.Range(enemyBRPoint.position.y, enemyTLPoint.position.y), 0);
|
||||
}
|
||||
} while (CheckEnemyOverlap(randomPoint));
|
||||
return randomPoint;
|
||||
}
|
||||
|
|
@ -104,13 +127,16 @@ public class WaveManager : MonoBehaviour
|
|||
|
||||
protected virtual void SpawnWave()
|
||||
{
|
||||
waveUI.text = $"Wave: {wave}";
|
||||
foreach (Enemy enemy in waveList[wave-1].enemies)
|
||||
{
|
||||
SpawnEnemy(enemy);
|
||||
}
|
||||
|
||||
if (waveList[wave-1].bossWave)
|
||||
if (wave == waveList.Length)
|
||||
{
|
||||
SpawnFinalBoss();
|
||||
Debug.Log("here");
|
||||
}
|
||||
else if (waveList[wave-1].bossWave)
|
||||
{
|
||||
SpawnBoss(waveList[wave-1].bossEnemy);
|
||||
}
|
||||
|
|
@ -121,14 +147,26 @@ public class WaveManager : MonoBehaviour
|
|||
{
|
||||
Enemy newBoss = SpawnEnemy(boss);
|
||||
bossInstance = newBoss;
|
||||
bossUI.SetActive(true);
|
||||
bossNameUI.text = waveList[wave - 1].bossName;
|
||||
bossDescriptionUI.text = waveList[wave - 1].bossDescription;
|
||||
bossNameUI.texture = waveList[wave - 1].bossName;
|
||||
bossNameUI.SetNativeSize();
|
||||
UpdateBossUI();
|
||||
player.isStalled = true; //wait for boss to enter then start dialogue
|
||||
player.invulnerable = true;
|
||||
}
|
||||
|
||||
private void SpawnFinalBoss()
|
||||
{
|
||||
lunasaInstance = SpawnPrism(lunasa);
|
||||
merlinInstance = SpawnPrism(merlin);
|
||||
lyricaInstance = SpawnPrism(lyrica);
|
||||
//DialogueManager.instance.StartDialogue(prismriverDialogue);
|
||||
lunasaInstance.isStalled = true;
|
||||
merlinInstance.isStalled = true;
|
||||
lyricaInstance.isStalled = true;
|
||||
player.isStalled = true; //wait for boss to enter then start dialogue
|
||||
player.invulnerable = true;
|
||||
bossNameUI.texture = waveList[wave - 1].bossName;
|
||||
bossNameUI.SetNativeSize();
|
||||
}
|
||||
public Enemy SpawnEnemy(Enemy enemy)
|
||||
{
|
||||
Enemy newEnemy = Instantiate(enemy, enemyFolder);
|
||||
|
|
@ -141,24 +179,40 @@ public class WaveManager : MonoBehaviour
|
|||
return newEnemy;
|
||||
}
|
||||
|
||||
public Prismriver SpawnPrism(Prismriver prism)
|
||||
{
|
||||
Prismriver newEnemy = Instantiate(prism, enemyFolder);
|
||||
Vector3 movepos = GetRandomEnemyPoint();
|
||||
newEnemy.currentMovementRoutine = newEnemy.StartCoroutine(newEnemy.MoveToPosition(enemySpawnPoint.position,movepos, newEnemy.moveSpeed));
|
||||
newEnemy.originalPosition = movepos;
|
||||
enemiesInPlay.Add(newEnemy);
|
||||
newEnemy.isStalled = true;
|
||||
newEnemy.invulnerable = true;
|
||||
return newEnemy;
|
||||
}
|
||||
|
||||
public void UpdateBossUI()
|
||||
{
|
||||
bossHPText.text = $"{bossInstance.health}/{bossInstance.maxHealth}";
|
||||
bossHPBar.localScale = new Vector3((float)bossInstance.health / bossInstance.maxHealth, 1f, 1f);
|
||||
if (lyricaInstance)
|
||||
{
|
||||
bossHPBar.localScale = new Vector3(1 - (float)prismHP / prismMaxHP, 1f, 1f);
|
||||
return;
|
||||
}
|
||||
bossHPBar.localScale = new Vector3(1 - (float)bossInstance.health / bossInstance.maxHealth, 1f, 1f);
|
||||
}
|
||||
|
||||
public virtual void UpdateKills()
|
||||
{
|
||||
if (enemiesInPlay.Count == 0)
|
||||
{
|
||||
if (wave > waveList.Length)
|
||||
if (waveList[wave - 1].bossEnemy)
|
||||
{
|
||||
GameManager.instance.WinGame();
|
||||
}
|
||||
else
|
||||
{
|
||||
SpawnWave();
|
||||
}
|
||||
SpawnWave();
|
||||
}
|
||||
if (lunasaInstance && prismHP <= 0)
|
||||
{
|
||||
GameManager.instance.WinGame();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue