private void OnTriggerEnter2D(Collider2D collider) { //If bullet is rebounding then don't detect collisions if (rebounded + reboundTime > Time.time) { return; } //If an object has been hit first, destroy the bullet if (collider.transform.gameObject.tag == "Object") { if (!collider.isTrigger) { this.gameObject.SetActive(false); } //Add destoryed particle effect here } CHitable targetHit = collider.GetComponentInParent <CHitable>(); CMoveCombatable enemy = collider.GetComponentInParent <CMoveCombatable>(); //If object hit is hitable, and this bullet hasn't already hit the target if (targetHit != null && !targetsHit.Contains(enemy)) { if (targetHit.isInvuln() || targetHit.isKnockedback()) { return; } if (enemy != null && enemy.parrying) { this.gameObject.SetActive(false); } //Apply damage and knockback targetHit.setAttacker(caster); //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback targetHit.loseHealth(damage); //Apply stun to the target targetHit.applyStun(stunTime); //TODO: Play audio sound caster.attackHit(); durability--; if (durability <= 0) { this.gameObject.SetActive(false); } else { targetsHit.Add(enemy); findNewTarget(); if (target == null) { this.gameObject.SetActive(false); } } } }
public void parriedEnemy(CMoveCombatable enemy) { //Apply stun to the target enemy.applyStun(stunTime); enemy.knockback(pos, abilityKnockback, enemy.objectHeight); }
private void OnTriggerEnter2D(Collider2D collider) { //If bullet is rebounding then don't detect collisions if (rebounded + reboundTime > Time.time) { return; } //If an object has been hit first, destroy the bullet if (collider.transform.gameObject.tag == "Object") { if (!collider.isTrigger) { this.gameObject.SetActive(false); } //Add destoryed particle effect here } CHitable targetHit = collider.GetComponentInParent <CHitable>(); //If object hit is hitable, and this bullet hasn't hit anything else this life if (targetHit != null && !hitTarget) { if (targetHit.isInvuln() || targetHit.isKnockedback()) { return; } CMoveCombatable enemy = collider.GetComponentInParent <CMoveCombatable>(); if (enemy != null && !FactionManager.instance.isHostile(enemy.faction, faction)) { return; } else if (enemy != null && enemy.parrying) { dir *= -1; rebounded = Time.time; //Change the bullets caster and faction so the ricochet bullet can hit enemies of the parrying target faction = enemy.faction; caster = enemy; return; } hitTarget = true; //Apply damage and knockback targetHit.setAttacker(caster); //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback targetHit.loseHealth(damage); //Apply stun to the target targetHit.applyStun(stunTime); //TODO: Play audio sound caster.attackHit(); this.gameObject.SetActive(false); } }
private void setupDeathScreen() { //Set up text characterName.text = Player.instance.firstName + " " + Player.instance.lastName; player.setSpriteController(Player.instance.getSpriteController()); causeOfDeath.text = Player.instance.causeOfDeath; //Set up revenge Target CMoveCombatable newRevengeTarget = Player.instance.getAttacker(); revengeTarget.setSpriteController(newRevengeTarget.getSpriteController()); //Set up name revengeName.text = Player.instance.getAttacker().getName(); //Setup class revengeClass.text = newRevengeTarget.getClass().name; //set up faction revengeFaction.text = newRevengeTarget.faction.ToString(); revengeStats[0].text = "Level: " + newRevengeTarget.level; revengeStats[1].text = "Strength: " + newRevengeTarget.getStats()[0]; revengeStats[2].text = "Agility: " + newRevengeTarget.getStats()[1]; revengeStats[3].text = "Endurance: " + newRevengeTarget.getStats()[2]; for (int i = 0; i < 4; i++) { revengeStatChanges[i].text = "+" + newRevengeTarget.levelupChanges[i]; } revengeAbilities[0].sprite = newRevengeTarget.getClass().abilities[0].getIcon(); revengeAbilities[1].sprite = newRevengeTarget.getClass().abilities[1].getIcon(); }
void generateNPC(CMoveCombatable npc) { //Change the new NPCs look npc.setSpriteController(getSpriteController(npc)); //Set NPC stats and details npc.firstName = getFirstName(); npc.lastName = getLastName(); }
public void setTarget(CMoveCombatable caster, Vector2 pos) { this.caster = caster; this.pos = pos; //Get direction based on caster facing direction direction = new Vector2(caster.transform.localScale.x, 0); abilityDamage = (int)(caster.attackDamage * 1.2f); }
public void setup(CMoveCombatable boss) { boss.setHealthbar(hpBar); nameBox.text = boss.firstName + " " + boss.lastName; hpBar.recoverHealth(1f); hpBar.setActive(true); bossGUIWrappper.SetActive(true); }
public void createNewNPC(Transform parent, Vector2 spawnPoint) { CMoveCombatable npc = Instantiate(npcBase, spawnPoint, Quaternion.identity); //Set Parent and then reset position in relation to parent npc.transform.SetParent(parent); npc.transform.localPosition = spawnPoint; generateNPC(npc); }
// Use this for initialization public void Setup(CMoveCombatable caster, Vector3 dir) { rb2D = GetComponent <Rigidbody2D>(); this.caster = caster; this.dir = dir; timeShot = Time.time; Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z); transform.position = spawnPos + (dir * 0.4f); }
public override void setTarget(CMoveCombatable caster, Vector2 pos) { base.setTarget(caster, pos); //Direction is either walking direction of caster or facing direction if not moving if (caster.rb2D.velocity == Vector2.zero) { direction = Vector2.right * caster.transform.localScale.x; } else { direction = caster.rb2D.velocity.normalized; } }
public virtual void setTarget(CMoveCombatable caster, Vector2 pos) { this.caster = caster; this.pos = pos; //Get direction based on caster facing direction direction = new Vector2(caster.transform.localScale.x, 0); //Reset combo on caster caster.canCombo = false; newCooldownTime = cooldownTime - (caster.agility * agilityMod); abilityDamage = getDamage(caster.strength); }
//Initialise here public override void setTarget(CMoveCombatable caster, Vector2 pos) { base.setTarget(caster, pos); //---- Setup ability stats ---- //Setup looks icon = AbilitySprite.DASHSTRIKE; name = "Heavy Strike"; //Setup cooldown cooldownTime = 0f; //Setup force abilityKnockback = 1000; abilityKnockUp = 300; abilityVelocity = 640; }
private void findNewTarget() { target = null; Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, 5f, CMoveCombatable.attackMask); int i = 0; while (i < hitColliders.Length && target == null) { CMoveCombatable character = hitColliders[i].GetComponentInParent <CMoveCombatable>(); if (character != null && FactionManager.instance.isHostile(character.faction, caster.faction) && !targetsHit.Contains(character)) { target = character; } i++; } Debug.Log(target); }
// Use this for initialization public void Setup(CMoveCombatable caster, int damage, float stunTime, Vector3 dir) { rb2D = GetComponent <Rigidbody2D>(); renderer = GetComponent <SpriteRenderer>(); hitTarget = false; this.caster = caster; this.damage = damage; this.stunTime = stunTime; this.dir = dir; faction = caster.faction; timeShot = Time.time; Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z); transform.position = spawnPos + (dir * 0.4f); }
//Initialise here public override void setTarget(CMoveCombatable caster, Vector2 pos) { base.setTarget(caster, pos); //---- Setup ability stats ---- //Setup looks icon = AbilitySprite.DASHSTRIKE; name = "Basic Strike"; //Setup cooldown cooldownTime = 0f; //Setup force abilityVelocity = 45; //Setup stun stunTime = 0.1f; }
private void OnTriggerEnter2D(Collider2D collider) { //If an object has been hit first, destroy the bullet if (collider.transform.gameObject.tag == "Object") { if (!collider.isTrigger) { this.gameObject.SetActive(false); } //Add destoryed particle effect here } CHitable targetHit = collider.GetComponentInParent <CHitable>(); //If object hit is hitable, and this bullet hasn't hit anything else this life if (targetHit != null && !targetsHit.Contains(targetHit)) { if (targetHit.isInvuln() || targetHit.isKnockedback()) { return; } CMoveCombatable enemy = collider.GetComponentInParent <CMoveCombatable>(); if (enemy != null && !FactionManager.instance.isHostile(enemy.faction, faction)) { return; } targetsHit.Add(targetHit); //Apply damage and knockback targetHit.setAttacker(caster); //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback targetHit.loseHealth(damage); //Apply stun to the target targetHit.applyStun(stunTime); //TODO: Play audio sound caster.attackHit(); } }
// Use this for initialization public void Setup(CMoveCombatable caster, int damage, float stunTime, Vector3 dir) { rb2D = GetComponent <Rigidbody2D>(); renderer = GetComponent <SpriteRenderer>(); this.caster = caster; this.damage = damage; this.stunTime = stunTime; this.dir = dir; durability = 3; transform.rotation = Quaternion.Euler(0, 0, 0); target = null; targetsHit = new List <CMoveCombatable>(); Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z); transform.position = spawnPos + (dir * 0.4f); }
/// <summary> /// Gets all characters on the hitable layer within aggro range and finds the closest enemy (if any) and sets them as the target /// </summary> /// <returns></returns> protected bool enemyNearby() { Collider2D[] hitColliders = new Collider2D[10]; int collidersLength = Physics2D.OverlapCircleNonAlloc(character.transform.position, character.aggroRange, hitColliders, CMoveCombatable.attackMask); int i = 0; Transform closestEnemy = null; while (i < collidersLength) { //Try and get the component from the collider to check if its actually a character CMoveCombatable target = hitColliders[i].GetComponent <CMoveCombatable>(); //if the target is actually an Enemy and is hostile to the character if (target != null && FactionManager.instance.isHostile(character.faction, target.faction)) { //If there is no closer enemy. assign the new target as the closest if (closestEnemy == null) { closestEnemy = target.transform; } //If the new target is closer than the previous closeset enemy else if ((target.transform.position - character.transform.position).magnitude < (closestEnemy.position - character.transform.position).magnitude) { closestEnemy = target.transform; } } i++; } if (closestEnemy == null) { return(false); } character.target = closestEnemy; return(true); }
//Returns a random sprite[] public RuntimeAnimatorController getSpriteController(CMoveCombatable character) { RuntimeAnimatorController[] spriteControllers; //If class is null if (character.getClass() == null) { character.chooseRandomClass(); } switch (character.faction) { case (Faction.Player): spriteControllers = playerControllers; break; case (Faction.None): spriteControllers = NPCControllers; break; default: if (character.getClass().name == "Sharpshooter") { spriteControllers = shooterControllers; } else { spriteControllers = duelistControllers; } break; } int spriteSet = Random.Range(0, spriteControllers.Length); //Will never be 2 return(spriteControllers[spriteSet]); }
protected override IEnumerator abilityActionSequence() { cooldownStartTime = Time.time; //Wait until the attack frame in the animation has been reached while (!caster.getAttackTrigger().hasAttackTriggered()) { yield return(null); } caster.getAttackTrigger().resetTrigger(); //After shot nudge caster back a tad caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale); //Instantiate Bullet LanceBullet b = ObjectPool.instance.getLanceBullet(); //Setup and turn on bullet b.gameObject.SetActive(true); b.Setup(caster, direction); //Play sound caster.audioSource.clip = abilitySound; caster.audioSource.Play(); RaycastHit2D[] hitObject = Physics2D.RaycastAll(pos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10); Debug.DrawRay(pos, direction * abilityRange, Color.blue, 3f); //If the Raycast hits an object on the layer Enemy foreach (RaycastHit2D r in hitObject) { if (r && r.transform.gameObject != caster.gameObject && caster.attacking) { //If an object has been hit first if (r.transform.gameObject.tag == "Object") { continue; } //Hit attack CHitable objectHit = r.transform.gameObject.GetComponentInParent <CHitable>(); CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>(); if (objectHit.isInvuln() || targetHit.faction == caster.faction || targetHit.isDead()) { continue; } //Apply damage and knockback objectHit.setAttacker(caster); objectHit.loseHealth(abilityDamage); objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight); if (targetHit != null) { targetHit.causeOfDeath = causeOfDeath; } //caster.audioSource.clip = abilitySound; //caster.audioSource.Play(); } } caster.canCombo = false; caster.canMove = true; caster.attacking = false; }
/// <summary> /// Sets the character that landed the last hit on this object /// </summary> /// <param name="attacker"></param> public void setAttacker(CMoveCombatable attacker) { lastAttacker = attacker; }
public void applyEffect(CMoveCombatable character) { character.addToStat(blessedStat, blessingStrength); }
protected override IEnumerator abilityActionSequence() { caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale); while (!caster.getAttackTrigger().hasAttackTriggered()) yield return null; caster.getAttackTrigger().resetTrigger(); //Check if attack can go through if (!caster.isDead()) { Vector2 newPos = new Vector2(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2); RaycastHit2D[] hitObject = Physics2D.RaycastAll(newPos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10); Debug.DrawRay(newPos, direction * abilityRange, Color.red, 3f); bool hitTarget = false; //If the Raycast hits an object on the layer Enemy foreach (RaycastHit2D r in hitObject) { if (r && r.transform.gameObject != caster.gameObject) { //If an object has been hit first if (r.transform.gameObject.tag == "Object") { if (r.collider.isTrigger) continue; else break; } //Hit attack CHitable objectHit = r.transform.gameObject.GetComponentInParent<CHitable>(); if (objectHit.tag == caster.tag) continue; //Apply damage and knockback objectHit.setAttacker(caster); objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight); objectHit.loseHealth(abilityDamage); CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent<CMoveCombatable>(); if (targetHit != null) { targetHit.causeOfDeath = causeOfDeath; } caster.audioSource.clip = caster.attackSound; caster.audioSource.Play(); caster.attackHit(); hitTarget = true; break; } } if (!hitTarget) { caster.audioSource.clip = caster.missSound; caster.audioSource.Play(); } if (caster.pauseAfterAttack < 0.5f) yield return new WaitForSeconds(0.5f); else yield return new WaitForSeconds(caster.pauseAfterAttack); } caster.canMove = true; caster.attacking = false; caster.canCombo = false; }
public override void setTarget(CMoveCombatable caster, Vector2 pos) { base.setTarget(caster, pos); }
public void applyTrait(CMoveCombatable character) { traitEffect.applyEffect(character); }
public void newBossGUI(CMoveCombatable boss) { bossGUI.setup(boss); }
protected override IEnumerator abilityActionSequence() { //Start Cooldown cooldownStartTime = Time.time; string oldLayer = LayerMask.LayerToName(caster.gameObject.layer); caster.gameObject.layer = C.noCollisionLayer; caster.setInvulnerable(timeBeforeRay); caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale); yield return(new WaitForSeconds(timeBeforeRay)); //Check if attack can go through if (!caster.isDead()) { //Actual distance travelled by caster float distanceCovered = Mathf.Abs(caster.transform.position.x - pos.x); RaycastHit2D[] hitObject = Physics2D.RaycastAll(pos, direction, distanceCovered, CMoveCombatable.attackMask, -10, 10); Debug.DrawRay(pos, direction * distanceCovered, Color.blue, 3f); bool hitTarget = false; //If the Raycast hits an object on the layer Enemy foreach (RaycastHit2D r in hitObject) { if (r && r.transform.gameObject != caster.gameObject && caster.attacking) { //If an object has been hit first if (r.transform.gameObject.tag == "Object") { continue; } //Hit attack CHitable objectHit = r.transform.gameObject.GetComponentInParent <CHitable>(); CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>(); if (objectHit.isInvuln() || targetHit.faction == caster.faction || targetHit.isDead()) { continue; } //Apply damage and knockback objectHit.setAttacker(caster); objectHit.loseHealth(abilityDamage); objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight); if (targetHit != null) { targetHit.causeOfDeath = causeOfDeath; } caster.audioSource.clip = abilitySound; caster.audioSource.Play(); hitTarget = true; } } if (!hitTarget) { caster.audioSource.clip = abilitySound; caster.audioSource.Play(); } caster.gameObject.layer = LayerMask.NameToLayer(oldLayer); yield return(new WaitForSeconds(caster.pauseAfterAttack)); } caster.getAttackTrigger().resetTrigger(); caster.canMove = true; caster.attacking = false; }
private void Start() { character = GetComponentInParent <CMoveCombatable>(); }
protected override IEnumerator abilityActionSequence() { //Wait until the attack frame in the animation has been reached while (!caster.getAttackTrigger().hasAttackTriggered()) { yield return(null); } caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale); caster.getAttackTrigger().resetTrigger(); //Check if attack can go through if (!caster.isDead()) { Vector2 newPos = new Vector2(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2); RaycastHit2D[] hitObject = Physics2D.RaycastAll(newPos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10); Debug.DrawRay(newPos, direction * abilityRange, Color.black, 3f); bool hitTarget = false; //If the Raycast hits an object on the layer Enemy foreach (RaycastHit2D r in hitObject) { if (r && r.transform.gameObject != caster.gameObject && caster.attacking) { //If an object has been hit first if (r.transform.gameObject.tag == "Object") { if (r.collider.isTrigger) { continue; } else { break; } } //Hit attack CHitable objectHit = r.transform.gameObject.GetComponentInParent <CHitable>(); CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>(); if (objectHit.isInvuln() || targetHit.faction == caster.faction || objectHit.isKnockedback() || targetHit.isDead()) //Add faction to hitables to use here instead of tags { continue; } //Set attacker and info on hit objectHit.setAttacker(caster); objectHit.lastAttackInfo = "A basic hit"; //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback objectHit.loseHealth(abilityDamage); //Apply stun to the target //objectHit.applyStun(stunTime); caster.audioSource.clip = caster.attackSound; caster.audioSource.Play(); caster.attackHit(); if (targetHit != null) { targetHit.causeOfDeath = causeOfDeath; } lastAttack = Time.time; //caster.canCombo = true; caster.setComboAnimation(true); hitTarget = true; break; } } if (!hitTarget) { caster.audioSource.clip = caster.missSound; caster.audioSource.Play(); } //Wait till attack animation is over while (!caster.getAttackTrigger().isAttackOver()) { yield return(null); } caster.getAttackTrigger().resetAttack(); } if (caster.canCombo) { caster.attack(comboAttack); yield break; } else { //Pause for caster yield return(new WaitForSeconds(caster.pauseAfterAttack)); caster.setComboAnimation(false); } caster.canCombo = false; caster.canMove = true; caster.attacking = false; }
public void applyEffect(CMoveCombatable character) { character.addToStat(cursedStat, -curseStrength); }