/// <summary> /// Checks the idle mode /// </summary> private void CheckIdle() { if (CheckForEnemys()) { ViriusStatus = ViriusMode.RunFromEnemys; return; } if (m_CurrentProcess < EnitiyManager.instance.ViriusSettings.m_MaxProcess * 0.50f) { ViriusStatus = ViriusMode.SearchForProcessorTree; return; } if (m_CurrentMB < EnitiyManager.instance.ViriusSettings.m_MaxMb * 0.30f) { ViriusStatus = ViriusMode.HuntForMemory; return; } if (m_IsReadyForMating) { CheckForMating(); } }
/// <summary> /// Checks the mating mode /// </summary> private void CheckForMating() { if (m_Target != null) { SetQuickBehavoir(BehaviorEnum.Seek); float _distance = Vector3.Distance(transform.position, m_Target.transform.position); if (_distance < EnitiyManager.instance.ViriusSettings.MatingDistanceNeeded) { ViriusBrain _virusBrain = m_Target.GetComponent <ViriusBrain>(); if (_virusBrain != null) { if (_virusBrain.ReqeustMating(this)) { ViriusBrain[] parents = new ViriusBrain[] { this, _virusBrain, }; EnitiyManager.instance.MakeVirius(parents); ViriusStatus = ViriusMode.Idle; m_Target = null; m_IsReadyForMating = false; m_LifeTime = 0; m_VirusUI.UpdateUi(); } else { ViriusStatus = ViriusMode.Idle; m_Target = null; } } else { m_Target = null; } } } else { Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, EnitiyManager.instance.ViriusSettings.MatingDistanceNeeded, EnitiyManager.instance.ViriusSettings.MatingLayerMask); if (colliders.Length > 0) { if (colliders[0].isActiveAndEnabled) { m_Target = colliders[0].gameObject; } } } }
/// <summary> /// Checks SearchingForProssecorTreeMode /// </summary> private void CheckForProssecor() { if (m_Target != null) { SetQuickBehavoir(BehaviorEnum.Seek); float distance = Vector3.Distance(transform.position, m_Target.transform.position); if (distance < EnitiyManager.instance.DataCubeSettings.SearchForProssecorTreeDistance * 0.2f) { ProcessorOrb processorOrb = m_Target.GetComponent <ProcessorOrb>(); if (processorOrb != null) { float _futureProcess = m_CurrentProcess + processorOrb.FarmOrb(6); if (_futureProcess > EnitiyManager.instance.DataCubeSettings.m_MaxProcess) { m_CurrentProcess = EnitiyManager.instance.DataCubeSettings.m_MaxProcess; ViriusStatus = ViriusMode.Idle; m_Target = null; } else { m_CurrentProcess = _futureProcess; } m_VirusUI.UpdateUi(); } } else { ViriusStatus = ViriusMode.Idle; } } else { Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(transform.position, EnitiyManager.instance.DataCubeSettings.SearchForProssecorTreeDistance, EnitiyManager.instance.DataCubeSettings.ProcessTreeLayerMask); if (collider2Ds.Length > 0) { if (collider2Ds[0].isActiveAndEnabled) { m_Target = collider2Ds[0].GetComponent <ProcessorTree>().GetClosestOrb(transform.position).gameObject; } } } }
/// <summary> /// Checks SearchingForMemoryMode /// </summary> private void CheckSearchForMemory() { if (m_Target != null) { SetQuickBehavoir(BehaviorEnum.Seek); float distance = Vector3.Distance(transform.position, m_Target.transform.position); if (distance < EnitiyManager.instance.ViriusSettings.HuntForMemoryDistance * 0.1f) { DataCubeBrain dataCubeBrain = m_Target.GetComponent <DataCubeBrain>(); if (dataCubeBrain != null) { float futuremb = m_CurrentMB + dataCubeBrain.StealMB(3); if (futuremb > EnitiyManager.instance.ViriusSettings.m_MaxMb) { m_CurrentMB = EnitiyManager.instance.ViriusSettings.m_MaxMb; ViriusStatus = ViriusMode.Idle; m_Target = null; m_VirusUI.UpdateUi(); return; } m_CurrentMB = futuremb; m_VirusUI.UpdateUi(); } else { m_Target = null; } } } else { Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(transform.position, EnitiyManager.instance.ViriusSettings.HuntForMemoryDistance, EnitiyManager.instance.ViriusSettings.MemoryLayerMask); if (collider2Ds.Length > 0) { if (collider2Ds[0].gameObject.activeSelf) { m_Target = collider2Ds[0].gameObject; } } } }
/// <summary> /// Checks Run from enemy /// </summary> private void RunFormEnemy() { if (m_Target != null) { float _distance = Vector3.Distance(transform.position, m_Target.transform.position); if (_distance > EnitiyManager.instance.DataCubeSettings.RunFromEnemyDistance) { ViriusStatus = ViriusMode.Idle; } UpdateDataCubeBehavoir(); } else { ViriusBrain[] viriusBrains = Support.CheckForNearbyObjects <ViriusBrain>(transform.position, EnitiyManager.instance.DataCubeSettings.RunFromEnemyDistance); if (viriusBrains.Length > 0) { m_Target = viriusBrains[0].gameObject; UpdateDataCubeBehavoir(); } } }