1+ using System . Collections . Generic ;
2+ using System . IO ;
3+ using System . Text ;
4+ using GameLoversEditor . GoogleSheetImporter ;
5+ using UnityEditor ;
6+
7+ namespace SheetImporters
8+ {
9+ /// <inheritdoc />
10+ [ GoogleSheetImportOrder ( 0 ) ]
11+ public class GameIdsImporter : IGoogleSheetImporter
12+ {
13+ private const string _name = "GameId" ;
14+ private const string _nameGroup = "GameIdGroup" ;
15+ private const string _idTag = "Id" ;
16+ private const string _groupsTag = "Groups" ;
17+
18+ /// <inheritdoc />
19+ public string GoogleSheetUrl => "https://docs.google.com/spreadsheets/d/1pxV7Fp8T9ea-Bp1ts0kn0JwAi1M3RyLpibq4LyOYQT8/edit#gid=1793530949" ;
20+
21+ /// <inheritdoc />
22+ public void Import ( List < Dictionary < string , string > > data )
23+ {
24+ var idList = new List < string > ( ) ;
25+ var groupList = new List < string > ( ) ;
26+ var mapGroups = new Dictionary < string , List < string > > ( ) ;
27+ var mapIds = new Dictionary < string , List < string > > ( ) ;
28+
29+ foreach ( var entry in data )
30+ {
31+ var groups = new List < string > ( CsvParser . ArrayParse < string > ( entry [ _groupsTag ] ) ) ;
32+ var id = GetCleanName ( entry [ _idTag ] ) ;
33+
34+ idList . Add ( id ) ;
35+ mapGroups . Add ( id , groups ) ;
36+
37+ foreach ( var group in groups )
38+ {
39+ var groupName = GetCleanName ( group ) ;
40+ if ( ! groupList . Contains ( groupName ) )
41+ {
42+ groupList . Add ( groupName ) ;
43+ mapIds . Add ( groupName , new List < string > ( ) ) ;
44+ }
45+
46+ mapIds [ groupName ] . Add ( id ) ;
47+ }
48+ }
49+
50+ var script = GenerateScript ( idList , groupList , mapGroups , mapIds ) ;
51+
52+ SaveScript ( script ) ;
53+ AssetDatabase . Refresh ( ) ;
54+ }
55+
56+ private static string GenerateScript ( IList < string > ids , IList < string > groups , Dictionary < string , List < string > > mapGroups ,
57+ Dictionary < string , List < string > > mapIds )
58+ {
59+ var stringBuilder = new StringBuilder ( ) ;
60+
61+ stringBuilder . AppendLine ( "using System.Collections.Generic;" ) ;
62+ stringBuilder . AppendLine ( "using System.Collections.ObjectModel;" ) ;
63+ stringBuilder . AppendLine ( "" ) ;
64+ stringBuilder . AppendLine ( "/* AUTO GENERATED CODE */" ) ;
65+ stringBuilder . AppendLine ( "namespace Ids" ) ;
66+ stringBuilder . AppendLine ( "{" ) ;
67+
68+ stringBuilder . AppendLine ( $ "\t public enum { _name } ") ;
69+ stringBuilder . AppendLine ( "\t {" ) ;
70+ GenerateEnums ( stringBuilder , ids ) ;
71+ stringBuilder . AppendLine ( "\t }" ) ;
72+
73+ stringBuilder . AppendLine ( "" ) ;
74+ stringBuilder . AppendLine ( $ "\t public enum { _nameGroup } ") ;
75+ stringBuilder . AppendLine ( "\t {" ) ;
76+ GenerateEnums ( stringBuilder , groups ) ;
77+ stringBuilder . AppendLine ( "\t }" ) ;
78+
79+ stringBuilder . AppendLine ( "" ) ;
80+ stringBuilder . AppendLine ( $ "\t public static class { _name } Lookup") ;
81+ stringBuilder . AppendLine ( "\t {" ) ;
82+ GenerateLoopUpMethods ( stringBuilder ) ;
83+ GenerateLoopUpMaps ( stringBuilder , mapGroups , _name , _nameGroup , "groups" ) ;
84+ GenerateLoopUpMaps ( stringBuilder , mapIds , _nameGroup , _name , "ids" ) ;
85+ stringBuilder . AppendLine ( "\t }" ) ;
86+
87+ stringBuilder . AppendLine ( "}" ) ;
88+
89+ return stringBuilder . ToString ( ) ;
90+ }
91+
92+ private static void GenerateLoopUpMethods ( StringBuilder stringBuilder )
93+ {
94+ stringBuilder . AppendLine ( $ "\t \t public static bool IsInGroup(this { _name } id, { _nameGroup } group)") ;
95+ stringBuilder . AppendLine ( "\t \t {" ) ;
96+ stringBuilder . AppendLine ( "\t \t \t if (!_groups.TryGetValue(id, out var groups))" ) ;
97+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
98+ stringBuilder . AppendLine ( "\t \t \t \t return false;" ) ;
99+ stringBuilder . AppendLine ( "\t \t \t }" ) ;
100+ stringBuilder . AppendLine ( "\t \t \t return groups.Contains(group);" ) ;
101+ stringBuilder . AppendLine ( "\t \t }" ) ;
102+
103+ stringBuilder . AppendLine ( "" ) ;
104+ stringBuilder . AppendLine ( $ "\t \t public static IList<{ _name } > GetIds(this { _nameGroup } group)") ;
105+ stringBuilder . AppendLine ( "\t \t {" ) ;
106+ stringBuilder . AppendLine ( "\t \t \t return _ids[group];" ) ;
107+ stringBuilder . AppendLine ( "\t \t }" ) ;
108+
109+ stringBuilder . AppendLine ( "" ) ;
110+ stringBuilder . AppendLine ( $ "\t \t public static IList<{ _nameGroup } > GetGroups(this { _name } id)") ;
111+ stringBuilder . AppendLine ( "\t \t {" ) ;
112+ stringBuilder . AppendLine ( "\t \t \t return _groups[id];" ) ;
113+ stringBuilder . AppendLine ( "\t \t }" ) ;
114+
115+ stringBuilder . AppendLine ( "" ) ;
116+ stringBuilder . AppendLine ( $ "\t \t public class { _name } Comparer : IEqualityComparer<{ _name } >") ;
117+ stringBuilder . AppendLine ( "\t \t {" ) ;
118+ stringBuilder . AppendLine ( $ "\t \t \t public bool Equals({ _name } x, { _name } y)") ;
119+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
120+ stringBuilder . AppendLine ( "\t \t \t \t return x == y;" ) ;
121+ stringBuilder . AppendLine ( "\t \t \t }" ) ;
122+ stringBuilder . AppendLine ( "" ) ;
123+ stringBuilder . AppendLine ( $ "\t \t \t public int GetHashCode({ _name } obj)") ;
124+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
125+ stringBuilder . AppendLine ( "\t \t \t \t return (int)obj;" ) ;
126+ stringBuilder . AppendLine ( "\t \t \t }" ) ;
127+ stringBuilder . AppendLine ( "\t \t }" ) ;
128+
129+ stringBuilder . AppendLine ( "" ) ;
130+ stringBuilder . AppendLine ( $ "\t \t public class { _nameGroup } Comparer : IEqualityComparer<{ _nameGroup } >") ;
131+ stringBuilder . AppendLine ( "\t \t {" ) ;
132+ stringBuilder . AppendLine ( $ "\t \t \t public bool Equals({ _nameGroup } x, { _nameGroup } y)") ;
133+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
134+ stringBuilder . AppendLine ( "\t \t \t \t return x == y;" ) ;
135+ stringBuilder . AppendLine ( "\t \t \t }" ) ;
136+ stringBuilder . AppendLine ( "" ) ;
137+ stringBuilder . AppendLine ( $ "\t \t \t public int GetHashCode({ _nameGroup } obj)") ;
138+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
139+ stringBuilder . AppendLine ( "\t \t \t \t return (int)obj;" ) ;
140+ stringBuilder . AppendLine ( "\t \t \t }" ) ;
141+ stringBuilder . AppendLine ( "\t \t }" ) ;
142+ }
143+
144+ private static void GenerateLoopUpMaps ( StringBuilder stringBuilder , Dictionary < string , List < string > > map ,
145+ string element1Type , string element2Type , string fieldName )
146+ {
147+ stringBuilder . AppendLine ( "" ) ;
148+ stringBuilder . AppendLine ( $ "\t \t private static readonly Dictionary<{ element1Type } , ReadOnlyCollection<{ element2Type } >> _{ fieldName } =") ;
149+ stringBuilder . AppendLine ( $ "\t \t \t new Dictionary<{ element1Type } , ReadOnlyCollection<{ element2Type } >> (new { element1Type } Comparer())") ;
150+ stringBuilder . AppendLine ( "\t \t \t {" ) ;
151+
152+ foreach ( var pair in map )
153+ {
154+ stringBuilder . AppendLine ( "\t \t \t \t {" ) ;
155+ stringBuilder . AppendLine ( $ "\t \t \t \t \t { element1Type } .{ pair . Key } , new List<{ element2Type } >") ;
156+ stringBuilder . AppendLine ( "\t \t \t \t \t {" ) ;
157+ for ( var i = 0 ; i < pair . Value . Count ; i ++ )
158+ {
159+ stringBuilder . Append ( "\t \t \t \t \t \t " ) ;
160+ stringBuilder . Append ( $ "{ element2Type } .{ pair . Value [ i ] } ") ;
161+ stringBuilder . Append ( i + 1 == pair . Value . Count ? "\n " : ",\n " ) ;
162+ }
163+ stringBuilder . AppendLine ( "\t \t \t \t \t }.AsReadOnly()" ) ;
164+ stringBuilder . AppendLine ( "\t \t \t \t }," ) ;
165+ }
166+
167+ stringBuilder . AppendLine ( "\t \t \t };" ) ;
168+ }
169+
170+ private static void GenerateEnums ( StringBuilder stringBuilder , IList < string > list )
171+ {
172+ for ( var i = 0 ; i < list . Count ; i ++ )
173+ {
174+ stringBuilder . Append ( "\t \t " ) ;
175+ stringBuilder . Append ( list [ i ] ) ;
176+ stringBuilder . Append ( i + 1 == list . Count ? "\n " : ",\n " ) ;
177+ }
178+ }
179+
180+ private static string GetCleanName ( string name )
181+ {
182+ return name . Replace ( ' ' , '_' ) ;
183+ }
184+
185+ private static void SaveScript ( string scriptString )
186+ {
187+ var scriptAssets = AssetDatabase . FindAssets ( $ "t:Script { _name } ") ;
188+ var scriptPath = $ "Assets/{ _name } .cs";
189+
190+ foreach ( var scriptAsset in scriptAssets )
191+ {
192+ var path = AssetDatabase . GUIDToAssetPath ( scriptAsset ) ;
193+ if ( path . EndsWith ( $ "/{ _name } .cs") )
194+ {
195+ scriptPath = path ;
196+ break ;
197+ }
198+ }
199+
200+ File . WriteAllText ( scriptPath , scriptString ) ;
201+ }
202+ }
203+ }
0 commit comments