43 lines
No EOL
1.3 KiB
C#
43 lines
No EOL
1.3 KiB
C#
using UnityEngine;
|
|
|
|
public class AI
|
|
{
|
|
public int aiChances;
|
|
|
|
public Quaternion rot = Quaternion.identity;
|
|
|
|
public Vector3Int InputDirection(Main main)
|
|
{
|
|
Vector3 headPos = main.snake[0];
|
|
float dist = Vector3.Distance(headPos, main.food);
|
|
|
|
float turnRate = (1 + Mathf.Sin(Time.time)) + (1 + Mathf.Sin(Time.time / 3)) * (1 - (dist / ((float)main.design.bounds.x * 2)));
|
|
if (main.food != headPos && aiChances == main.design.aiMaxChances)
|
|
{
|
|
rot = Quaternion.Lerp(rot, Quaternion.LookRotation(main.food - headPos), turnRate * main.design.aiIQ * main.bpm * Time.deltaTime);
|
|
|
|
Vector3Int newDir = Main.SnapDir(rot * Vector3.forward);
|
|
|
|
// rethink this system now that it is seperated from the player inputs
|
|
// chances get refueled each *ai* step
|
|
while (aiChances > 0 && main.snake.Contains(main.snake[0] + newDir) || Main.OutOfBounds(main.snake[0] + newDir, main.design.bounds))
|
|
{
|
|
newDir = Main.dirs[Random.Range(0, Main.dirs.Length)];
|
|
aiChances--;
|
|
}
|
|
|
|
// NO neck snaps, ok?
|
|
if (aiChances > 0 && main.snake[0] + newDir != main.snake[1])
|
|
{
|
|
if (aiChances < main.design.aiMaxChances)
|
|
{
|
|
rot = Quaternion.LookRotation((Vector3)newDir);
|
|
}
|
|
|
|
return newDir;
|
|
}
|
|
}
|
|
|
|
return main.dir;
|
|
}
|
|
} |