//public List<KeyValuePair<GameObject, float> > damage_done{ get; set;}
    //[SerializeField] DragonSenses prefab;
    //[SerializeField] DragonSensesParams[] dragonSensesParams;
    //DragonSenses[] senses;

    //public List<DragonInterest> SensedEnemies;
    //public List<DragonInterest> SensedCrystals;
    //public List<int> SensedEnemiesPower;
    //public List<int> SensedCrystalsPower;

    void Awake()
    {
        DB = transform.parent.GetComponentInChildren <DragonBrain> ();
        boredom.Init();
        apathy.Init();
        panic.Init();

        aggressiveness.Init();
        collectiveness.Init();
        defensiveness.Init();
        weigths = new float[] { aggressiveness.value, collectiveness.value, defensiveness.value };
        state   = DragonActionState.Patrol;
        life    = GetComponent <Life> ();

        /*senses=new DragonSenses[dragonSensesParams.Length];
         * int i = 0;
         * foreach (DragonSensesParams pars in dragonSensesParams) {
         *      DragonSenses newsense = Instantiate (prefab, transform.position, transform.rotation, transform).GetComponent<DragonSenses>();
         *      newsense.SetNewParams (pars.Range, pars.offset);
         *      senses [i++] = newsense;
         * }
         * StartCoroutine (checkWorld ());*/
    }
    void Update()
    {
        float boredom_strength = 0f;
        float apathy_strength  = 1f;
        float panic_strength   = 1f - life.lifePoints / life.maxLife;

        switch (state)
        {
        case DragonActionState.Patrol:
            boredom_strength = 1f;
            apathy_strength  = 0f;
            break;

        case DragonActionState.Attack:
            apathy_strength = Mathf.Clamp(1f - aggressiveness.value - (most_machine != null?most_machine.Dragons[interestID].interest:0f), 0.1f, 0.9f);
            break;

        case DragonActionState.Nest:
            apathy_strength = Mathf.Clamp(1f - defensiveness.value - (most_machine != null?most_machine.Dragons[interestID].interest:0f), 0.1f, 0.9f);
            panic_strength  = 0f;
            break;

        case DragonActionState.Collect:
            apathy_strength = Mathf.Clamp(1f - collectiveness.value - (most_crystal != null?most_crystal.Dragons[interestID].interest:0f), 0.1f, 0.9f);
            break;

        case DragonActionState.Rest:
            boredom_strength = 1f - panic_strength;
            apathy_strength  = 0f;
            break;

        default:
            throw new System.ArgumentOutOfRangeException();
        }
        //boredom calculation
        boredom.TimeChange(boredom_strength);
        //apathy calculation
        apathy.TimeChange(apathy_strength);
        //panic calculation
        panic.TimeChange(panic_strength);


        if (apathy.isState)
        {
            state = DragonActionState.Patrol;
        }
        else if (panic.isState)
        {
            state = DragonActionState.Rest;
        }
        else if (boredom.isState)
        {
            switch (RandomExtension.WeightedRandom(weigths))
            {
            case 0:
                state = DragonActionState.Attack;
                break;

            case 1:
                state = DragonActionState.Collect;
                break;

            case 2:
                state = DragonActionState.Nest;
                break;
            }
        }
    }
    IEnumerator Sense()
    {
        while (true)
        {
            //float sum_crystals_temp=0f;
            //float sum_machines_temp=0f;
            float          max_crystals_temp = -0.1f;
            DragonInterest most_machine_temp = null;

            float          max_machines_temp = -0.1f;
            DragonInterest most_crystal_temp = null;

            float          min_sqrDist          = float.PositiveInfinity;
            DragonInterest closest_machine_temp = null;

            float          min_sqrDist_drone  = float.PositiveInfinity;
            DragonInterest closest_drone_temp = null;

            float          min_sqrDist_robot  = float.PositiveInfinity;
            DragonInterest closest_robot_temp = null;

            float          min_sqrDist_tractor  = float.PositiveInfinity;
            DragonInterest closest_tractor_temp = null;

            foreach (DragonInterest interested in DragonManager.Instance.sensable)
            {
                interested.Dragons [interestID].sqrDist = (interested.transform.position - transform.position).sqrMagnitude;
                if (interested.gameObject.tag == "Pickable")
                {
                    //sum_crystals_temp += interested.Dragons [interestID].interest;
                    if (interested.Dragons [interestID].interest > max_crystals_temp)
                    {
                        max_crystals_temp = interested.Dragons [interestID].interest;
                        most_crystal_temp = interested;
                    }
                }
                else
                {
                    //sum_machines_temp += interested.Dragons [interestID].interest;
                    if (interested.Dragons [interestID].interest > max_machines_temp)
                    {
                        max_machines_temp = interested.Dragons [interestID].interest;
                        most_machine_temp = interested;
                    }
                    if (interested.Dragons [interestID].sqrDist < min_sqrDist)
                    {
                        min_sqrDist          = interested.Dragons [interestID].sqrDist;
                        closest_machine_temp = interested;
                    }
                    switch (interested.Type)
                    {
                    case VehicleType.Drone:
                        if (interested.Dragons [interestID].sqrDist < min_sqrDist_drone)
                        {
                            min_sqrDist_drone  = interested.Dragons [interestID].sqrDist;
                            closest_drone_temp = interested;
                        }
                        break;

                    case VehicleType.Tractor:
                        if (interested.Dragons [interestID].sqrDist < min_sqrDist_tractor)
                        {
                            min_sqrDist_tractor  = interested.Dragons [interestID].sqrDist;
                            closest_tractor_temp = interested;
                        }
                        break;

                    case VehicleType.Robot:
                        if (interested.Dragons [interestID].sqrDist < min_sqrDist_robot)
                        {
                            min_sqrDist_robot  = interested.Dragons [interestID].sqrDist;
                            closest_robot_temp = interested;
                        }
                        break;

                    default:
                        throw new System.ArgumentOutOfRangeException();
                    }
                }
                //foreach(KeyValuePair<GameObject, float> k in damage_done){
                //	if (interested.gameObject == k.Key) {
                //		interested.Dragons [interestID].interest += k.Value*damage2interest_factor;
                //	}
                //}
                //interested.Dragons [interestID].interested = 1f / interested.Dragons [interestID].sqrDist;
                yield return(null);
            }
            //sum_crystals = sum_crystals_temp;
            //sum_machines = sum_machines_temp;
//			if (closest_machine != closest_machine_temp) {
//				print ("closest machine changed in "+interestID+" from "+(closest_machine?closest_machine.name:"null") +" to "+(closest_machine_temp?closest_machine_temp.name:"null"));
//			}
            closest_machine = closest_machine_temp;
            closest_drone   = closest_drone_temp;
            closest_tractor = closest_tractor_temp;
            closest_robot   = closest_robot_temp;

            most_crystal = most_crystal_temp;
//			if (most_machine != most_machine_temp) {
//				print ("machine changed in "+interestID+" from "+(most_machine?most_machine.name:"null") +" to "+(most_machine_temp?most_machine_temp.name:"null"));
//			}
            if ((state == DragonActionState.Collect || state == DragonActionState.Patrol || state == DragonActionState.Nest) && max_machines_temp > interest2triggerAttack)
            {
                state = DragonActionState.Attack;
                boredom.Init();
                apathy.Init();
                panic.Init();
            }
            most_machine = most_machine_temp;
            yield return(null);
        }
    }
Пример #4
0
    void Update()
    {
        //pierdoly
        if (prevState != DSA.state && prevState == DragonActionState.Attack)
        {
            fight = false;
        }

        DAT.UpdateFireBreath();

        if (setTarget)
        {
            setTarget = false;
            SetNewTarget(targetPoint);
        }


        switch (DSA.state)
        {
        case DragonActionState.Patrol:
            patrol.Update();
            break;

        case DragonActionState.Attack:
            attack.Update();
            break;

        case DragonActionState.Nest:
            //nieskonczone
            //if (path_built) {
            //	targetPoint = DragonManager.Instance.nests [Random.Range (0, DragonManager.Instance.nests.Length)].position;
            //	targetType = DragonTargetType.Nestpoint;
            //	setTarget = true;
            //}
            nest.Update();
            break;

        case DragonActionState.Collect:
            //	targetPoint = DSA.most_crystal.transform.position;
            //	targetType = DragonTargetType.Nestpoint;
            //	setTarget = true;
            collect.Update();
            break;

        case DragonActionState.Rest:

            //if (path_built) {
            //	targetPoint = DragonManager.Instance.sitpoints [Random.Range (0, DragonManager.Instance.sitpoints.Length)].position;
            //	targetType = DragonTargetType.Sitpoint;
            //}
            rest.Update();
            break;

        default:
            throw new System.ArgumentOutOfRangeException();
        }


        //odpowiedz na zaczepke
        if (DSA.state != DragonActionState.Rest && DSA.state != DragonActionState.Attack)
        {
            if (DS.SensedEnemies.Count > 0)
            {
                fight = true;
                Vector3 point2attack = DSA.closest_machine.transform.position;                //DS.SensedEnemies [0].transform.position;
                DAT.transform.position = point2attack;

                transform.LookAt(point2attack);
                transform.position = point2attack + attack.attackPoint * DAT.averageDist;
            }
            else
            {
                fight = false;
            }
        }
        prevState = DSA.state;
    }