protected override AttackViability EvaluateScan(Scan sc) { AttackViability scanResult = base.EvaluateScan(sc); switch (scanResult) { case AttackViability.SignalForHelp: scanResult = AttackViability.Escape; break; } return(scanResult); }
protected virtual void Suspicious() { if (nearbySuspects.Count == 0) { SetState(AIState.Scanning); return; } targetEntity = (Entity)nearbySuspects[0]; //if target is too far away then return to exploring if (targetEntity == null || Vector2.Distance(targetEntity.transform.position, transform.position) > suspiciousChaseRange) { intenseScanTimer = 0f; nearbySuspects.RemoveAt(0); suspicionMeter.gameObject.SetActive(false); suspicionMeter.material.SetFloat("_ArcAngle", 0); return; } //follow entity GoToLocation(targetEntity.transform.position, true, intenseScanRange, true, targetEntity.transform.position); if (Vector2.Distance(transform.position, targetEntity.transform.position) <= intenseScanRange) { //scan entity if close enough intenseScanTimer += Time.deltaTime; //draw scanner particles if (!intenseScanner.isPlaying) { intenseScanner.Play(); } float angle = -Vector2.SignedAngle(Vector2.up, targetEntity.transform.position - transform.position); intenseScanner.transform.eulerAngles = Vector3.forward * -angle; intenseScanner.transform.localScale = Vector3.one * Vector2.Distance(transform.position, targetEntity.transform.position); //draw suspicion meter suspicionMeter.gameObject.SetActive(true); suspicionMeter.material.SetFloat("_ArcAngle", intenseScanTimer / intenseScanDuration * 360f); //check if scan is complete if (intenseScanTimer >= intenseScanDuration) { intenseScanner.Stop(); suspicionMeter.gameObject.SetActive(false); suspicionMeter.material.SetFloat("_ArcAngle", 0); //scan complete intenseScanTimer = 0f; //assess threat level and make a decision AttackViability threatLevel = EvaluateScan(targetEntity.ReturnScan()); switch (threatLevel) { case AttackViability.AttackAlone: ICombat enemy = targetEntity.GetICombat(); if (!(bool)enemy?.EngageInCombat(this)) { break; } EngageInCombat(enemy); SetState(AIState.Attacking); break; case AttackViability.SignalForHelp: enemy = targetEntity.GetICombat(); if (!(bool)enemy?.EngageInCombat(this)) { break; } EngageInCombat(enemy); SetState(AIState.Signalling); break; case AttackViability.Escape: hive?.MarkCoordAsEmpty(targetEntity.GetCoords()); scaryEntities.Add(targetEntity); SetState(AIState.Exploring); break; case AttackViability.Ignore: unsuspiciousEntities.Add((Entity)nearbySuspects[0]); nearbySuspects.RemoveAt(0); break; } } } else { intenseScanner.Stop(); } suspicionMeter.transform.position = (Vector2)transform.position + meterRelativePosition; }