Exemple #1
0
        //add a entity to a faction. If a faction doesn't exist for the entity, the function creates one and returns true to indicate that a faction was created
        public static bool addEntity(SoldierEntity entity)
        {
            for (int i = 0; i < Factions.Count; i++)
            {
                if (Factions [i].FactionName == entity.faction)
                {
                    Factions [i].Soldiers.Add(entity);
                    //for (int j = 0; j<FactionName[i].Soldiers.Count; j++){
                    //	FactionName[i].Soldiers[j].knownPositionsOfOtherSoldiers.Add(new SoldierIntel(entity,Vector3.zero));
                    //}
                    for (int j = 0; j < Factions.Count; j++)
                    {
                        if (Factions [j].FactionName != entity.faction)
                        {
                            Factions [j].SoldierIntelData.Add(new SoldierIntel(entity));
                        }
                    }
                    return(true);
                }                // else {

                //}
            }

            return(false);
        }
        /// <summary>
        /// Makes agent fire at the current target if possible
        /// </summary>
        public virtual void AttackTarget()
        {
            SoldierEntity temp = null;

            if (currentTarget != null && currentTarget.mainLOSCollider != null /*&& amountOfTimeCurrentTargetHasBeenInLOS >= fireDelayTime*/)
            {
                temp = currentTarget;
            }
            else if (currentlyVisibleEnemies.Count > 0)
            {
                temp = currentlyVisibleEnemies [0];
            }


            if (temp != null)
            {
                //code for aiming towards player goes here

                //code for firing

                //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(barrelStart.position,barrelEnd.position - barrelStart.position,Color.red,0.1f);
                if (enableDebugVisualizations)
                {
                    if (enableDebugVisualizations)
                    {
                        Debug.DrawRay(weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position, Color.blue, 0.1f);
                    }
                }
                if (enableDebugPrint)
                {
                    Debug.Log("Vector3.Angle(weaponList[currentWeapon].barrelEnd.position - weaponList[currentWeapon].barrelStart.position,temp.centreOfMass.position - weaponList[currentWeapon].barrelStart.position) " + Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position));
                }
                if (weapon.stateOfWeapon == WeaponState.Ready && !friendlySoldierInLineOfFire && Vector3.Distance(temp.centreOfMass.position, transformToDoLOSChecksFrom.position) < maxRangeForEngagement && maxAngleOffsetForFiringShotsNotLinedUpWithBarrel > Mathf.Abs(Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position)) && (currentTargetIsVisible == LOSResult.Visible || amountOfTimeCurrentTargetHasBeenInLOS < amountOfTimePlayerMustBeVisibleBeforeShooting))
                {
                    if (weapon.fire(weapon.barrelEnd, weapon.barrelStart, thisEntity.faction, false))
                    {
                        //animationObject.CrossFade(avatarAlias+"|"+weaponName.ToString()+" Reload");
                        //weapon.stateOfWeapon = WeaponState.Reloading;
                    }                    // else {

                    //}
                }
                else
                {
                    if (enableDebugPrint)
                    {
                        Debug.Log("Target not in path of weapon!");
                    }
                }
            }
            else
            {
                if (enableDebugPrint)
                {
                    Debug.Log("No target");
                }
            }
        }
    public void OnEnemySoldierDead(SoldierEntity soldierEntity)
    {
        Vector3 spawnPos = GetCenterPos();

        enemySoldiersKilled++;
        if (enemySoldiersKilled % newSoldierPerEnemyKilled == 0)
        {
            CreateNewSoldier(spawnPos);
        }
    }
    void CreateNewSoldier(Vector3 spawnPos)
    {
        Transform newSoldier = Instantiate(soldierPrefab, spawnPos, Quaternion.identity) as Transform;

        newSoldier.parent = legion;
        SoldierEntity soldierEntity = newSoldier.GetComponent <SoldierEntity>();

        soldierEntity.SetColor(legionColor);
        soldierEntity.SetLayer("Player");
        soldierEntity.SetRivalLayer("Enemy");
    }
 /// <summary>
 /// Resets state of soldier
 /// of the script
 /// </summary>
 public void ResetSoldier()
 {
     previousPos             = gameObject.transform.position;
     healthController.health = healthController.maxhealth;
     this.CurrentTarget      = null;
     this.weapon.magazines   = new List <int> {
         weapon.magSize, weapon.magSize, weapon.magSize
     };
     exploring = false;
     agent.ResetPath();
     numActionsBusyWith = 0;
     currentActionSet.Clear();
 }
Exemple #6
0
    public void InitializeSoldiers(string side, Vector3 pos)
    {
        string rivalSide = side.StartsWith("Player") ? "Enemy" : "Player";

        for (int i = 0; i < soldierCount; i++)
        {
            Transform soldierTransform = Instantiate(soldierPrefab, pos, Quaternion.identity) as Transform;
            soldierTransform.parent = legion;

            SoldierEntity soldierEntity = soldierTransform.GetComponent <SoldierEntity>();
            soldierEntity.SetLayer(side);
            soldierEntity.SetRivalLayer(rivalSide);
            soldierEntity.SetColor(legionColor);
        }
    }
Exemple #7
0
 public static void RemoveSoldier(SoldierEntity entity)
 {
     getFaction(entity.faction).Soldiers.Remove(entity);
     for (int i = 0; i < Factions.Count; ++i)
     {
         for (int k = 0; k < Factions[i].SoldierIntelData.Count; k++)
         {
             if (Factions[i].SoldierIntelData[k].soldierEntityToTrack == entity)
             {
                 Factions[i].SoldierIntelData.RemoveAt(k);
                 --k;
             }
         }
     }
 }
Exemple #8
0
    void Start()
    {
        legionColor  = Color.Lerp(legionColor, legionColorVariance, Random.Range(0f, 1f));
        mapGenerator = FindObjectOfType <MapGenerator>();

        InitializeSoldiers("Enemy", transform.position);
        InvokeRepeating("SetRandomDestination", 1f, newDestTime);

        GameObject          playerLegionControlObj = GameObject.FindGameObjectWithTag("Player");
        PlayerLegionControl playerLegionControl    = playerLegionControlObj.GetComponent <PlayerLegionControl>();

        for (int i = 0; i < legion.childCount; i++)
        {
            Transform     soldierTransform = legion.GetChild(i);
            SoldierEntity soldierEntity    = soldierTransform.GetComponent <SoldierEntity>();
            soldierEntity.OnSoldierDead += playerLegionControl.OnEnemySoldierDead;
        }
    }
        /// <summary>
        /// Checks whether agent can shoot without hitting a friendly soldier
        /// </summary>
        protected virtual void UpdateFriendlyFireFlag()
        {
            friendlySoldierInLineOfFire = false;
            SoldierEntity temp = null;

            if (currentTarget != null && currentTarget.mainLOSCollider != null /*&& amountOfTimeCurrentTargetHasBeenInLOS > weapon.fireDelayTime*/)
            {
                temp = currentTarget;
            }
            else if (currentlyVisibleEnemies.Count > 0)
            {
                temp = currentlyVisibleEnemies [0];
            }
            //			if (fireTeamController != null) {
            //				for (int i= 0; i<fireTeamController.fireTeamMembers.Count; i++) {
            //					LOSRay.direction = weapon.barrelEnd.position - weapon.barrelStart.position;
            //					LOSRay.origin = weapon.barrelStart.position;
            //					if (fireTeamController.fireTeamMembers [i] != this && fireTeamController.fireTeamMembers [i].thisEntity.mainLOSCollider.Raycast (LOSRay, out hit, float.PositiveInfinity) && Vector3.Distance (hit.point, weapon.barrelStart.position) < Vector3.Distance (temp.centreOfMass.position, weapon.barrelStart.position)) {
            //						if (enableDebugPrint) Debug.Log ("Friendly soldier in the way!");
            //						friendlySoldierInLineOfFire = true;
            //						break;
            //					}
            //				}
            //			}
            if (temp != null && temp.centreOfMass != null)
            {
                for (int i = 0; i < GameData.getFaction(thisEntity.faction).Soldiers.Count; ++i)
                {
                    LOSRay.direction = weapon.barrelEnd.position - weapon.barrelStart.position;
                    LOSRay.origin    = weapon.barrelStart.position;
                    if (GameData.getFaction(thisEntity.faction).Soldiers [i] != thisEntity &&
                        GameData.getFaction(thisEntity.faction).Soldiers [i].mainLOSCollider.Raycast(LOSRay, out hit, float.PositiveInfinity) && Vector3.Distance(hit.point, weapon.barrelStart.position) < Vector3.Distance(temp.centreOfMass.position, weapon.barrelStart.position))
                    {
                        if (enableDebugPrint)
                        {
                            Debug.Log("Friendly soldier in the way!");
                        }
                        friendlySoldierInLineOfFire = true;
                        break;
                    }
                }
            }
        }
Exemple #10
0
    protected override IEnumerator Attack()
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, attackRadius, LayerMask.GetMask(LayerMask.LayerToName(rivalLayer)));
        if (colliders.Length > 0)
        {
            currentStatus = Status.Attack;
            nav.enabled   = false;
            SoldierEntity soldierEntity = colliders[0].transform.GetComponent <SoldierEntity>();

            Vector3 originalPos = transform.position;
            Vector3 targetPos   = colliders[0].transform.position + (transform.position - colliders[0].transform.position).normalized * attackRadius / 2f;

            float animationSpeed = 2f;
            // attack animation
            float percent     = 0;
            bool  hasAttacked = false;
            while (percent <= 1)
            {
                if (percent > 0.5f && !hasAttacked)
                {
                    hasAttacked = true;
                    if (soldierEntity != null)
                    {
                        soldierEntity.TakeDamage(damage, transform);
                    }
                    else
                    {
                        break;
                    }
                }
                transform.position = Vector3.Lerp(originalPos, targetPos, (-(percent * percent) + percent) * 4);
                percent           += animationSpeed * Time.deltaTime;
                yield return(null);
            }
            nav.enabled   = true;
            currentStatus = Status.Idle;
        }
    }
Exemple #11
0
        /// <summary>
        /// Checks whether the given agent is in line of sight.
        /// Again, the code is compact and messy for efficiency purposes
        /// </summary>
        /// <returns>The in line of sight.</returns>
        /// <param name="entity">Entity.</param>
        public virtual LOSResult isInLineOfSight(SoldierEntity entity)
        {
            Color randCol = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value);

            if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) > horizontalLOSDistance || Mathf.Abs(Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, entity.centreOfMass.position - transformToDoLOSChecksFrom.position)) > horizontalFOVAngle)
            {
                if (enableDebugPrint)
                {
                    Debug.Log("Not withing FOV angle!");
                }
                if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) < peripheralVisionDistance)
                {
                    return(LOSResult.PeripheralVisionTriggered);
                }
                else
                {
                    return(LOSResult.Invisible);
                }
            }
            else
            {
                LOSRay.origin    = transformToDoLOSChecksFrom.position;
                LOSRay.direction = entity.centreOfMass.position - transformToDoLOSChecksFrom.position;
                if (enableDebugVisualizations)
                {
                    Debug.DrawRay(LOSRay.origin, LOSRay.direction, randCol, 0.1f);
                }

                if ((Physics.Raycast(LOSRay, out hit, Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) + 10, LOSCheckLayers)))
                {
                    if (hit.collider == entity.mainLOSCollider)
                    {
                        //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position,entity.centreOfMass.position - transformToDoLOSChecksFrom.position,Color.red,0.1f);
                        if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) < maxDistanceForUsingHighAccuracyLOSChecks && entity.LOSCheckColliders.Length > 0 && entity.LOSCheckTransforms.Length > 0)
                        {
                            for (int i = 0; i < entity.LOSCheckColliders.Length; i++)
                            {
                                LOSRay.direction = entity.LOSCheckTransforms [i].position - transformToDoLOSChecksFrom.position;
                                //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position, entity.LOSCheckTransforms[i].position - transformToDoLOSChecksFrom.position,Color.red,0.1f);
                                if ((Physics.Raycast(LOSRay, out hit, Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) + 10, LOSCheckLayers)))
                                {
                                    if (hit.collider.Equals(entity.LOSCheckColliders [i]))
                                    {
                                        //currentlyVisibleEnemies.Add(entity);
                                        return(LOSResult.Visible);
                                    }
                                }
                            }
                        }
                        else
                        {
                            //currentlyVisibleEnemies.Add(entity);
                            if (enableDebugPrint)
                            {
                                Debug.Log("High accuracy visibility checks skipped!");
                            }
                            return(LOSResult.Visible);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < entity.LOSCheckColliders.Length; i++)
                        {
                            if (hit.collider.gameObject.Equals(entity.LOSCheckColliders [i].gameObject))
                            {
                                return(LOSResult.Visible);
                            }
                        }


                        if (enableDebugPrint)
                        {
                            Debug.Log("MainLOSColliderNotVisible! " + entity.mainLOSCollider.gameObject.transform.root.gameObject.name + ". It hit " + hit.collider.gameObject.transform.root.gameObject.name + " " + entity.LOSCheckColliders.Length);
                        }
                        //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position,hit.point - transformToDoLOSChecksFrom.position,Color.green,0.1f);
                        return(LOSResult.Invisible);
                    }
                }
                if (enableDebugPrint)
                {
                    Debug.Log("Rays didn't hit anything!");
                }
                return(LOSResult.Invisible);
                //}
            }
        }
Exemple #12
0
 public void Start()
 {
     thisEntity = GetComponent <CreateSoldierEntity> ().entity;
     healthController.AddOnDamageEvent(this.OnDamage);
     previousPos = gameObject.transform.position;
 }