Skip to content

Commit 3294cee

Browse files
authored
Refactor "Set Variable" event command to be VariableType agnostic (AscensionGameDev#2069)
* wip: (Day) Refactor variable selection in editor * chore: (Day) refactor selector component to be more generic * chore: (Day) Further remove reliance on variable data type in variable event * chore: (Day) Localization * chore: (Day) Move VariableDescriptor to GameObjects * wip * wip: (Day) Attempt to use editor attributes * chore: (Day) Code review * code review pt 1 * revert files * code review * chore: (Day) Code review * chore: code review * code review
1 parent ae6f668 commit 3294cee

29 files changed

Lines changed: 1705 additions & 1577 deletions
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Intersect.Enums;
2+
3+
namespace Intersect.Attributes;
4+
5+
[AttributeUsage(AttributeTargets.Field)]
6+
public sealed class RelatedTableAttribute : Attribute
7+
{
8+
public GameObjectType TableType { get; }
9+
10+
public RelatedTableAttribute(GameObjectType gameObjectType) { TableType = gameObjectType; }
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Intersect.Enums;
2+
3+
namespace Intersect.Attributes;
4+
5+
[AttributeUsage(AttributeTargets.Field)]
6+
public sealed class RelatedVariableTypeAttribute : Attribute
7+
{
8+
public VariableType VariableType { get; }
9+
10+
public RelatedVariableTypeAttribute(VariableType variableType) { VariableType = variableType; }
11+
}

Intersect (Core)/Enums/GameObjectTypeExtensions.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
using Intersect.Collections;
66
using Intersect.Extensions;
7+
using Intersect.GameObjects;
8+
using Intersect.GameObjects.Switches_and_Variables;
79
using Intersect.Models;
10+
using MessagePack.Resolvers;
811

912
namespace Intersect.Enums
1013
{
@@ -45,6 +48,11 @@ public static DatabaseObjectLookup GetLookup(this GameObjectType gameObjectType)
4548
return LookupUtils.GetLookup(GetObjectType(gameObjectType));
4649
}
4750

51+
public static dynamic Get(this GameObjectType gameObjectType, Guid id)
52+
{
53+
return LookupUtils.GetLookup(GetObjectType(gameObjectType)).Get(id);
54+
}
55+
4856
public static IDatabaseObject CreateNew(this GameObjectType gameObjectType)
4957
{
5058
var instance = Activator.CreateInstance(
@@ -54,5 +62,78 @@ public static IDatabaseObject CreateNew(this GameObjectType gameObjectType)
5462

5563
return instance as IDatabaseObject;
5664
}
65+
66+
public static int ListIndex(this GameObjectType gameObjectType, Guid id, VariableDataType dataTypeFilter = 0)
67+
{
68+
var lookup = gameObjectType.GetLookup();
69+
70+
if (dataTypeFilter == 0)
71+
{
72+
return lookup.KeyList.OrderBy(pairs => lookup[pairs]?.Name).ToList().IndexOf(id);
73+
}
74+
75+
return lookup
76+
.OrderBy(kv => kv.Value?.Name)
77+
.Select(kv => kv.Value)
78+
.OfType<IVariableBase>()
79+
.Where(desc => desc.Type == dataTypeFilter)
80+
.Select(desc => desc.Id)
81+
.ToList()
82+
.IndexOf(id);
83+
}
84+
85+
public static VariableDataType GetVariableType(this GameObjectType gameObjectType, Guid variableDescriptorId)
86+
{
87+
var lookup = gameObjectType.GetLookup();
88+
89+
return lookup.ValueList
90+
.OfType<IVariableBase>()
91+
.FirstOrDefault(var => var.Id == variableDescriptorId)?.Type ?? 0;
92+
}
93+
94+
public static Guid IdFromList(this GameObjectType gameObjectType, int listIndex, VariableDataType dataTypeFilter = 0)
95+
{
96+
var lookup = gameObjectType.GetLookup();
97+
98+
if (listIndex < 0 || listIndex >= lookup.KeyList.Count)
99+
{
100+
return Guid.Empty;
101+
}
102+
103+
if (dataTypeFilter == 0)
104+
{
105+
return lookup.KeyList.OrderBy(pairs => lookup[pairs]?.Name).ToArray()[listIndex];
106+
}
107+
108+
return lookup
109+
.OrderBy(kv => kv.Value?.Name)
110+
.Select(kv => kv.Value)
111+
.OfType<IVariableBase>()
112+
.Where(desc => desc.Type == dataTypeFilter)
113+
.Select(desc => desc.Id)
114+
.Skip(listIndex)
115+
.FirstOrDefault();
116+
}
117+
118+
public static string[] Names(this GameObjectType gameObjectType, VariableDataType dataTypeFilter = 0)
119+
{
120+
if (dataTypeFilter == 0)
121+
{
122+
return gameObjectType
123+
.GetLookup()
124+
.OrderBy(p => p.Value?.Name)
125+
.Select(pair => pair.Value?.Name ?? PlayerVariableBase.Deleted)
126+
.ToArray();
127+
}
128+
129+
return gameObjectType
130+
.GetLookup()
131+
.Select(kv => kv.Value)
132+
.OfType<IVariableBase>()
133+
.Where(desc => desc.Type == dataTypeFilter)
134+
.OrderBy(p => p?.Name)
135+
.Select(pair => pair?.Name ?? PlayerVariableBase.Deleted)
136+
.ToArray();
137+
}
57138
}
58139
}

Intersect (Core)/Enums/VariableMod.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Intersect.Attributes;
2+
13
namespace Intersect.Enums
24
{
35
public enum VariableMod
@@ -12,70 +14,98 @@ public enum VariableMod
1214

1315
SystemTime,
1416

17+
[RelatedVariableType(VariableType.PlayerVariable)]
1518
DupPlayerVar,
1619

20+
[RelatedVariableType(VariableType.ServerVariable)]
1721
DupGlobalVar,
1822

23+
[RelatedVariableType(VariableType.PlayerVariable)]
1924
AddPlayerVar,
2025

26+
[RelatedVariableType(VariableType.ServerVariable)]
2127
AddGlobalVar,
2228

29+
[RelatedVariableType(VariableType.PlayerVariable)]
2330
SubtractPlayerVar,
2431

32+
[RelatedVariableType(VariableType.ServerVariable)]
2533
SubtractGlobalVar,
2634

2735
Replace,
2836

2937
Multiply,
3038

39+
[RelatedVariableType(VariableType.PlayerVariable)]
3140
MultiplyPlayerVar,
3241

42+
[RelatedVariableType(VariableType.ServerVariable)]
3343
MultiplyGlobalVar,
3444

3545
Divide,
3646

47+
[RelatedVariableType(VariableType.PlayerVariable)]
3748
DividePlayerVar,
3849

50+
[RelatedVariableType(VariableType.ServerVariable)]
3951
DivideGlobalVar,
4052

4153
LeftShift,
4254

55+
[RelatedVariableType(VariableType.PlayerVariable)]
4356
LeftShiftPlayerVar,
4457

58+
[RelatedVariableType(VariableType.ServerVariable)]
4559
LeftShiftGlobalVar,
4660

4761
RightShift,
4862

63+
[RelatedVariableType(VariableType.PlayerVariable)]
4964
RightShiftPlayerVar,
5065

66+
[RelatedVariableType(VariableType.ServerVariable)]
5167
RightShiftGlobalVar,
5268

69+
[RelatedVariableType(VariableType.GuildVariable)]
5370
DupGuildVar,
5471

72+
[RelatedVariableType(VariableType.GuildVariable)]
5573
AddGuildVar,
5674

75+
[RelatedVariableType(VariableType.GuildVariable)]
5776
SubtractGuildVar,
5877

78+
[RelatedVariableType(VariableType.GuildVariable)]
5979
MultiplyGuildVar,
6080

81+
[RelatedVariableType(VariableType.GuildVariable)]
6182
DivideGuildVar,
6283

84+
[RelatedVariableType(VariableType.GuildVariable)]
6385
LeftShiftGuildVar,
6486

87+
[RelatedVariableType(VariableType.GuildVariable)]
6588
RightShiftGuildVar,
6689

90+
[RelatedVariableType(VariableType.UserVariable)]
6791
DuplicateUserVariable,
6892

93+
[RelatedVariableType(VariableType.UserVariable)]
6994
AddUserVariable,
7095

96+
[RelatedVariableType(VariableType.UserVariable)]
7197
SubtractUserVariable,
7298

99+
[RelatedVariableType(VariableType.UserVariable)]
73100
MultiplyUserVariable,
74101

102+
[RelatedVariableType(VariableType.UserVariable)]
75103
DivideUserVariable,
76104

105+
[RelatedVariableType(VariableType.UserVariable)]
77106
LeftShiftUserVariable,
78107

108+
[RelatedVariableType(VariableType.UserVariable)]
79109
RightShiftUserVariable,
80110
}
81111
}

Intersect (Core)/Enums/VariableType.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Intersect.Attributes;
2+
13
namespace Intersect.Enums
24
{
35
// Should properly separate static value, player & global vars into a separate enum.
@@ -6,12 +8,16 @@ namespace Intersect.Enums
68

79
public enum VariableType
810
{
11+
[RelatedTable(GameObjectType.PlayerVariable)]
912
PlayerVariable = 0,
1013

14+
[RelatedTable(GameObjectType.ServerVariable)]
1115
ServerVariable,
1216

17+
[RelatedTable(GameObjectType.GuildVariable)]
1318
GuildVariable,
1419

20+
[RelatedTable(GameObjectType.UserVariable)]
1521
UserVariable,
1622
}
1723
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Reflection;
2+
using Intersect.Attributes;
3+
using Intersect.Enums;
4+
5+
namespace Intersect.Extensions;
6+
public static class VariableModExtensions
7+
{
8+
public static VariableType GetRelatedVariableType(this VariableMod value)
9+
{
10+
if (!Enum.IsDefined(value))
11+
{
12+
throw new ArgumentOutOfRangeException(nameof(value), value, "Invalid VariableMod enum");
13+
}
14+
15+
string name = Enum.GetName(value);
16+
if (name == null)
17+
{
18+
throw new ArgumentOutOfRangeException(nameof(value), value, "Missing enum name");
19+
}
20+
21+
FieldInfo fieldInfo = typeof(VariableMod).GetField(name);
22+
if (fieldInfo == null)
23+
{
24+
throw new MissingFieldException($"Reflection failed for VariableType enum, value was {value}", nameof(value));
25+
}
26+
27+
RelatedVariableTypeAttribute attr = fieldInfo.GetCustomAttribute<RelatedVariableTypeAttribute>();
28+
if (attr == null)
29+
{
30+
throw new ArgumentException($"Failed to get RelatedVariableType attribute for VariableType enum, value was {value}", nameof(value));
31+
}
32+
33+
return attr.VariableType;
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Reflection;
2+
using Intersect.Attributes;
3+
using Intersect.Enums;
4+
5+
namespace Intersect.Extensions;
6+
public static class VariableTypeExtensions
7+
{
8+
public static GameObjectType GetRelatedTable(this VariableType value)
9+
{
10+
if (!Enum.IsDefined(value))
11+
{
12+
throw new ArgumentOutOfRangeException(nameof(value), value, "Invalid VariableType enum");
13+
}
14+
15+
string name = Enum.GetName(value);
16+
if (name == null)
17+
{
18+
throw new ArgumentOutOfRangeException(nameof(value), value, "Missing enum name");
19+
}
20+
21+
FieldInfo fieldInfo = typeof(VariableType).GetField(name);
22+
if (fieldInfo == null)
23+
{
24+
throw new MissingFieldException($"Reflection failed for VariableType enum, value was {value}", nameof(value));
25+
}
26+
27+
RelatedTableAttribute attr = fieldInfo.GetCustomAttribute<RelatedTableAttribute>();
28+
if (attr == null)
29+
{
30+
throw new ArgumentException($"Failed to get RelatedTable attribute for VariableType enum, value was {value}", nameof(value));
31+
}
32+
33+
return attr.TableType;
34+
}
35+
}

Intersect (Core)/GameObjects/Events/Commands/EventCommands.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33

44
using Intersect.Enums;
5-
65
using Newtonsoft.Json;
76

87
namespace Intersect.GameObjects.Events.Commands

0 commit comments

Comments
 (0)