//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); } }
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; }