File size: 2,230 Bytes
ce81a16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;

namespace Quantum
{
	[Serializable]
	public partial struct GOAPState
	{
		// PUBLIC METHODS

		public static GOAPState Merge(GOAPState state, GOAPState mergeState)
		{
			var newState = state;
			newState.Merge(mergeState);
			return newState;
		}

		public static GOAPState Remove(GOAPState state, GOAPState removeState)
		{
			var newState = state;
			newState.Remove(removeState);
			return newState;
		}

		public bool HasPositiveFlag(EWorldState state)
		{
			return (Positive & state) == state;
		}

		public bool HasNegativeFlag(EWorldState state)
		{
			return (Negative & state) == state;
		}

		public void SetFlag(EWorldState flagState, bool value)
		{
			if (value == true)
			{
				Positive = Positive | flagState;
				Negative = Negative & ~Positive;
			}
			else
			{
				Negative = Negative | flagState;
				Positive = Positive & ~Negative;
			}
		}

		public void ClearFlag(EWorldState clearState)
		{
			Positive = Positive & ~clearState;
			Negative = Negative & ~clearState;
		}

		public void Merge(GOAPState mergeState)
		{
			Positive = Positive | mergeState.Positive;
			Negative = Negative & ~Positive;

			Negative = Negative | mergeState.Negative;
			Positive = Positive & ~Negative;

			MergeUserData(mergeState);
		}

		public void Remove(GOAPState removeState)
		{
			Positive = Positive & ~removeState.Positive;
			Negative = Negative & ~removeState.Negative;

			RemoveUserData(removeState);
		}

		public bool Contains(GOAPState state)
		{
			bool result = (state.Positive & Positive) == state.Positive && (state.Negative & Negative) == state.Negative;

			if (result == false)
				return false;

			ContainsUserData(state, ref result);
			return result;
		}

		public bool ContainsAny(GOAPState state)
		{
			bool result = (state.Positive & Positive) != EWorldState.None || (state.Negative & Negative) != EWorldState.None;

			if (result == true)
				return true;

			ContainsAnyUserData(state, ref result);
			return result;
		}

		partial void MergeUserData(GOAPState mergeState);
		partial void RemoveUserData(GOAPState removeState);
		partial void ContainsUserData(GOAPState state, ref bool result);
		partial void ContainsAnyUserData(GOAPState state, ref bool result);
	}
}