summaryrefslogtreecommitdiff
path: root/ROUNDS/PlayerAIDavid.cs
blob: bb0b654ea1c42dd9a8d4832abbd44920a29459dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System.Collections.Generic;
using Landfall.AI;
using UnityEngine;

public class PlayerAIDavid : MonoBehaviour
{
	public static int[] topology = new int[4] { 2, 10, 16, 5 };

	[SerializeField]
	private bool m_useWeights;

	[SerializeField]
	private WeightDataAsset m_weightData;

	private PlayerAPI m_api;

	private NeuralNet m_neuralNet;

	private double[] m_cachedInput;

	private float m_startTime;

	private Vector2 m_movement = Vector2.zero;

	private float m_aiTimer;

	private void Awake()
	{
		m_api = GetComponentInParent<PlayerAPI>();
		m_cachedInput = new double[2];
		m_neuralNet = new NeuralNet(topology);
		if (m_weightData != null && m_useWeights)
		{
			m_neuralNet.SetWeights(m_weightData.m_weightDatas[m_weightData.m_weightDatas.Count - 1].m_weights);
		}
		m_startTime = Time.time + 0.8f;
	}

	public void SetWeights(double[] weights)
	{
		m_neuralNet.SetWeights(new List<double>(weights));
	}

	public void SetWeights(List<double> weights)
	{
		m_neuralNet.SetWeights(weights);
	}

	private void Update()
	{
		if (Time.time < m_startTime)
		{
			return;
		}
		if (m_aiTimer >= 0.1f)
		{
			m_aiTimer -= 0.1f;
			Vector3 vector = m_api.OtherPlayerPosition() - m_api.PlayerPosition();
			m_cachedInput[0] = vector.x;
			m_cachedInput[1] = vector.y;
			m_neuralNet.FeedForward(m_cachedInput, 1.0);
			double[] results = m_neuralNet.GetResults();
			m_api.SetAimDirection(new Vector2((float)results[3], (float)results[4]));
			if (results[0] > 0.5)
			{
				m_api.Jump();
			}
			if (results[1] > 0.5)
			{
				m_api.Attack();
			}
			Vector2 zero = Vector2.zero;
			if (results[2] > 0.5)
			{
				zero.x = 1f;
			}
			else if (results[2] < -0.5)
			{
				zero.x = -1f;
			}
			m_movement = zero;
		}
		m_api.Move(m_movement);
		m_aiTimer += TimeHandler.deltaTime;
	}
}