IEnumerator Think() { float nextNervousMove = Time.time + 3.0f; float nextMeleeSwing = 0.0f; while (true) { var em = hearts_.emission; em.enabled = (playerIsClose_ || State == OrcState.ChasePlayer) && Mood != OrcMood.Nervous; renderer_.flipX = trans_.position.x > lookAt_.x; if (State == OrcState.ChasePlayer) { lookAt_ = GameManager.Instance.PlayerTrans.position; target_ = playerPos_; } else if (State == OrcState.Yoda) { lookAt_ = target_; if (Time.time > nextMeleeSwing) { nextMeleeSwing = Time.time + 0.5f; StartCoroutine(SwingMeleeCo(lookAt_)); float recoil; const float YodaDamage = 200.0f; const float YodaRadius = 2.5f; int hitCount = WeaponSword.Swing(trans_.position, YodaDamage, YodaRadius, AudioManager.Instance.AudioData.SaberHit, AudioManager.Instance.AudioData.SaberSwing, out recoil); if (hitCount > 2) { GameManager.Instance.PlayerScript.Talk(GetYodaPlayerTalk(), 1.0f, Color.white); } target_ = PositionUtility.GetPointInsideArena(0.8f, 0.8f); } if (distanceToPlayer_ < 3) { target_ = trans_.position; } } else if (State == OrcState.Default) { lookAt_ = GameManager.Instance.PlayerTrans.position; if (Mood == OrcMood.Nervous) { if (Time.time > nextNervousMove) { // Look confused for a little bit Text.text = "?"; yield return(new WaitForSeconds(2.0f)); if (Mood != OrcMood.Nervous || State != OrcState.Default) { continue; } // Get alarmed for a very short time Text.text = "!"; yield return(new WaitForSeconds(0.5f)); if (Mood != OrcMood.Nervous || State != OrcState.Default) { continue; } Text.text = ""; // Run randomly target_ = PositionUtility.GetPointInsideArena(1.0f, 1.0f); nextNervousMove = Time.time + 5 + Random.value * 5; } if (distanceToPlayer_ <= NervousMinDistance || distanceToTarget_ < 0.2f) { target_ = trans_.position; // Stop } } } if (Mood != OrcMood.Nervous && Text.text != string.Empty) { Text.text = string.Empty; } yield return(null); } }
public void OnOrcPickup(Vector3 pos) { SaveGame.RoundScore++; GameEvents.CounterEvent(GameCounter.Score_Any_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Any, SaveGame.RoundScore); if (GameMode == GameModeEnum.Nursery) { GameEvents.CounterEvent(GameCounter.Score_Nursery_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Nursery, SaveGame.RoundScore); } else if (GameMode == GameModeEnum.Earth) { GameEvents.CounterEvent(GameCounter.Score_Earth_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Earth, SaveGame.RoundScore); } else if (GameMode == GameModeEnum.Wind) { GameEvents.CounterEvent(GameCounter.Score_Wind_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Wind, SaveGame.RoundScore); } else if (GameMode == GameModeEnum.Fire) { GameEvents.CounterEvent(GameCounter.Score_Fire_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Fire, SaveGame.RoundScore); } else if (GameMode == GameModeEnum.Storm) { GameEvents.CounterEvent(GameCounter.Score_Storm_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_Score_Storm, SaveGame.RoundScore); } else if (GameMode == GameModeEnum.Harmony) { GameEvents.CounterEvent(GameCounter.score_Harmony_Sum, 1); GameEvents.CounterEvent(GameCounter.Max_score_Harmony, SaveGame.RoundScore); } AudioManager.Instance.PlayClipWithRandomPitch(AudioManager.Instance.MiscAudioSource, AudioManager.Instance.AudioData.OrcPickup); Vector2 uiPos = UiPositionFromWorld(PlayerTrans.position + Vector3.up * 0.5f); var rectTransform = TextFloatingWeapon.GetComponent <RectTransform>(); rectTransform.anchoredPosition = uiPos; TextScore.text = SaveGame.RoundScore.ToString(); if (CurrentDeedData.Deed != DeedEnum.Sandbox) { Unlocks.SetRandomWeapon(); TextFloatingWeapon.SetText(WeaponBase.WeaponDisplayName(PlayerScript.Weapon.Type), 2.0f); } if (CurrentDeedData.ShowOrcs) { Vector3 bestPos = Vector3.zero; float bestDistance = 0.0f; for (int i = 0; i < 5; ++i) { Vector3 newPos = PositionUtility.GetPointInsideArena(1.0f, 0.9f); float distance = Vector3.Distance(newPos, pos); if (distance > bestDistance) { bestDistance = distance; bestPos = newPos; } // TODO PE: Does not seem to work? I've seen it behind the score. // Let's try not placing the orc around the UI bool nearUi = newPos.y > 4.5f && (newPos.x > -3.5f && newPos.x < 3.5f); if (nearUi) { continue; } if (distance > 5.0f) { break; } } Orc.SetPosition(bestPos); MakeFlash(bestPos, 2.0f); } else { // Hide the orc Orc.SetPosition(Vector3.left * 10000); } }
Vector3 GetNewTarget() { Vector3 result = PositionUtility.GetPointInsideArena(1.0f, 1.0f); return(result); }