Elin Decompiled Documentation EA 23.295 Stable
Loading...
Searching...
No Matches
RecipeManager.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using Newtonsoft.Json;
3using UnityEngine;
4
5public class RecipeManager : EClass
6{
7 public enum LearnState
8 {
13 }
14
15 public static bool rebuild;
16
17 public static List<RecipeSource> list = new List<RecipeSource>();
18
19 public static Dictionary<string, RecipeSource> dict = new Dictionary<string, RecipeSource>();
20
21 [JsonProperty]
22 public HashSet<string> knownIngredients = new HashSet<string>();
23
24 [JsonProperty]
25 public HashSet<string> craftedRecipes = new HashSet<string>();
26
27 [JsonProperty]
28 public Dictionary<string, int> knownRecipes = new Dictionary<string, int>();
29
30 [JsonProperty]
31 public HashSet<string> hoveredRecipes = new HashSet<string>();
32
33 [JsonProperty]
34 public HashSet<string> newRecipes = new HashSet<string>();
35
36 [JsonProperty]
37 public Dictionary<string, List<int>> lastIngredients = new Dictionary<string, List<int>>();
38
39 public static void BuildList()
40 {
41 if (!rebuild && list.Count > 0)
42 {
43 return;
44 }
45 Debug.Log("Rebuilding recipe list");
46 list.Clear();
47 dict.Clear();
48 foreach (CardRow row in EClass.sources.cards.rows)
49 {
50 if (!row.isOrigin)
51 {
52 Create(row, "", row.isChara ? "-c" : "");
53 }
54 }
55 foreach (SourceBlock.Row row2 in EClass.sources.blocks.rows)
56 {
57 Create(row2, "Block");
58 if (row2.tileType == TileType.Pillar)
59 {
60 Create(row2, "BridgePillar", "-p");
61 }
62 }
63 foreach (SourceFloor.Row row3 in EClass.sources.floors.rows)
64 {
65 if (!row3.tag.Contains("noFloor"))
66 {
67 Create(row3, "Floor");
68 }
69 }
70 foreach (SourceFloor.Row row4 in EClass.sources.floors.rows)
71 {
72 if (!row4.tag.Contains("noBridge") && !row4.factory.IsEmpty() && row4.factory[0] != "x")
73 {
74 Create(row4, "Bridge", "-b");
75 }
76 }
77 foreach (SourceObj.Row row5 in EClass.sources.objs.rows)
78 {
79 Create(row5, "Obj");
80 }
81 foreach (SourceCellEffect.Row row6 in EClass.sources.cellEffects.rows)
82 {
83 Create(row6, "Liquid");
84 }
85 rebuild = false;
86 }
87
88 public static void Create(RenderRow row, string type, string suffix = "")
89 {
90 RecipeSource recipeSource = new RecipeSource();
91 recipeSource.id = row.RecipeID + suffix;
92 recipeSource.isBridge = type == "Bridge";
93 recipeSource.isBridgePillar = type == "BridgePillar";
94 recipeSource.type = type;
95 recipeSource.row = row;
96 recipeSource.isChara = row is SourceChara.Row;
97 if (!row.factory.IsEmpty() && row.factory[0] == "x")
98 {
99 recipeSource.noListing = true;
100 }
101 list.Add(recipeSource);
102 dict[recipeSource.id] = recipeSource;
103 _ = row.components;
104 Recipe.Create(recipeSource).BuildIngredientList();
105 }
106
107 public static RecipeSource Get(string id)
108 {
109 return dict.TryGetValue(id);
110 }
111
112 public RecipeSource GetSource(string id)
113 {
114 return dict.TryGetValue(id);
115 }
116
117 public void Add(string id, bool showEffect = true)
118 {
119 if (id.IsEmpty())
120 {
121 return;
122 }
123 RecipeSource recipeSource = Get(id);
124 if (recipeSource == null)
125 {
126 return;
127 }
128 if (!knownRecipes.ContainsKey(id))
129 {
130 newRecipes.Add(id);
131 knownRecipes[id] = 0;
132 }
133 knownRecipes[id]++;
134 int num = knownRecipes[id];
135 if (showEffect)
136 {
137 EClass.pc.PlaySound("idea");
138 EClass.pc.ShowEmo(Emo.idea, 0.5f, skipSame: false);
139 }
140 EClass.pc.Say("learnRecipe" + ((num == 1) ? "New" : ""), dict[id].Name.ToTitleCase(), num.ToString() ?? "");
141 if (num == 1 && !recipeSource.isBridgePillar)
142 {
143 if (recipeSource.NeedFactory)
144 {
145 EClass.pc.Say("recipe_factory", recipeSource.NameFactory);
146 }
147 else
148 {
149 EClass.pc.Say("recipe_nofactory");
150 }
151 }
152 recipeSource = Get(id + "-p");
153 if (recipeSource != null && !knownRecipes.ContainsKey(recipeSource.id))
154 {
155 Add(recipeSource.id, showEffect: false);
156 }
157 recipeSource = Get(id.Replace("-p", ""));
158 if (recipeSource != null && !knownRecipes.ContainsKey(recipeSource.id))
159 {
160 Add(recipeSource.id, showEffect: false);
161 }
162 if (recipeSource.row.category == "floor")
163 {
164 recipeSource = Get(id + "-b");
165 if (recipeSource != null && !knownRecipes.ContainsKey(recipeSource.id))
166 {
167 Add(recipeSource.id, showEffect: false);
168 }
169 recipeSource = Get(id.Replace("-b", ""));
170 if (recipeSource != null && !knownRecipes.ContainsKey(recipeSource.id))
171 {
172 Add(recipeSource.id, showEffect: false);
173 }
174 }
175 }
176
177 public bool IsKnown(string id)
178 {
180 {
181 return EClass.player.recipes.knownRecipes.ContainsKey(id);
182 }
183 return true;
184 }
185
186 public List<RecipeSource> ListSources(Thing factory, List<RecipeSource> newRecipes = null)
187 {
188 BuildList();
189 List<RecipeSource> list = new List<RecipeSource>();
191 {
192 if (item.isBridgePillar || (factory == null && item.idFactory != "self") || (factory != null && !factory.trait.Contains(item)) || item.isChara || item.noListing)
193 {
194 continue;
195 }
196 if (!EClass.debug.godCraft && !EClass.player.recipes.knownRecipes.ContainsKey(item.id))
197 {
198 bool flag = false;
199 if (item.row.recipeKey != null && item.row.recipeKey.Length != 0 && item.row.recipeKey[0][0] == '*')
200 {
201 flag = true;
202 }
203 string id = item.id;
204 if (!(id == "waystone"))
205 {
206 if (id == "container_shipping" && EClass.game.quests.GetPhase<QuestShippingChest>() >= 0)
207 {
208 flag = true;
209 }
210 }
211 else if (EClass.game.quests.GetPhase<QuestExploration>() >= 6)
212 {
213 flag = true;
214 }
215 if (!flag)
216 {
217 continue;
218 }
219 if (newRecipes != null)
220 {
222 if (EClass.player.recipes.newRecipes.Contains(item.id))
223 {
224 newRecipes.Add(item);
226 }
227 }
228 }
229 list.Add(item);
230 }
231 return list;
232 }
233
234 public void OnSleep(bool ehe = false)
235 {
236 int slept = EClass.player.stats.slept;
237 Rand.SetSeed(EClass.game.seed + slept);
238 if ((slept <= 3 || EClass.rnd(ehe ? 777 : 3) != 0) && (EClass.rnd(EClass.pc.Evalue(1642) + 1) > 0 || ((slept <= 15 || EClass.rnd(3) != 0) && (slept <= 30 || EClass.rnd(3) != 0) && (slept <= 60 || EClass.rnd(3) != 0))))
239 {
240 Msg.Say("learnRecipeSleep");
241 Rand.SetSeed();
242 Add(GetRandomRecipe((ehe ? 5 : 0) + EClass.rnd(EClass.rnd(EClass.rnd(10)))));
243 }
244 }
245
246 public void ComeUpWithRandomRecipe(string idCat = null, int lvBonus = 0)
247 {
248 string randomRecipe = GetRandomRecipe(lvBonus, idCat, onlyUnlearned: true);
249 if (randomRecipe != null)
250 {
251 Msg.Say("learnRecipeIdea");
252 Add(randomRecipe);
253 }
254 }
255
256 public LearnState GetRecipeLearnState(string idRecipe)
257 {
258 if (idRecipe.IsEmpty())
259 {
260 return LearnState.Unavailable;
261 }
262 RecipeSource recipeSource = Get(idRecipe);
263 if (recipeSource == null || (!recipeSource.NeedFactory && !recipeSource.IsQuickCraft))
264 {
265 return LearnState.Unavailable;
266 }
267 if (EClass.player.recipes.knownRecipes.ContainsKey(idRecipe))
268 {
269 return LearnState.AlreadyLearned;
270 }
271 int id = recipeSource.GetReqSkill().id;
272 if (EClass.pc.Evalue(id) + 5 < recipeSource.row.LV)
273 {
274 return LearnState.InsufficientSkill;
275 }
276 return LearnState.Learnable;
277 }
278
279 public void ComeUpWithRecipe(string idRecipe, int chanceForRandomRecipe = 0)
280 {
281 if (idRecipe.IsEmpty())
282 {
283 return;
284 }
285 RecipeSource recipeSource = Get(idRecipe);
286 int num = EClass.pc.Evalue(1661);
287 if (EClass.rnd((num >= 2) ? 5 : ((num == 1) ? 8 : 10)) != 0 && !EClass.debug.enable)
288 {
289 return;
290 }
291 if (recipeSource == null || EClass.player.recipes.knownRecipes.ContainsKey(idRecipe) || (!recipeSource.NeedFactory && !recipeSource.IsQuickCraft))
292 {
293 if (recipeSource != null && chanceForRandomRecipe > 0 && EClass.rnd(EClass.debug.enable ? 1 : chanceForRandomRecipe) == 0)
294 {
295 ComeUpWithRandomRecipe(recipeSource.row.Category.id);
296 }
297 return;
298 }
299 int id = recipeSource.GetReqSkill().id;
300 if (EClass.pc.Evalue(id) + 5 < recipeSource.row.LV)
301 {
302 Msg.Say("recipeReqLv", EClass.sources.elements.map[id].GetName());
303 return;
304 }
305 Msg.Say("learnRecipeIdea");
306 Add(idRecipe);
307 }
308
309 public static RecipeSource GetUnlearnedRecipe(int lvBonus, string cat, bool onlyUnlearned)
310 {
311 BuildList();
312 List<RecipeSource> list = new List<RecipeSource>();
314 {
315 if (!item.alwaysKnown && !item.noRandomRecipe && (item.NeedFactory || item.IsQuickCraft) && (cat == null || item.row.Category.IsChildOf(cat)) && (!onlyUnlearned || !EClass.player.recipes.knownRecipes.ContainsKey(item.id)) && EClass.pc.Evalue(item.GetReqSkill().id) + 5 + lvBonus >= item.row.LV && !item.row.ContainsTag("hiddenRecipe"))
316 {
317 list.Add(item);
318 }
319 }
320 return list.RandomItemWeighted((RecipeSource r) => (r.row.chance == 0) ? 100 : r.row.chance);
321 }
322
323 public static RecipeSource GetLearnedRecipe(string cat = null)
324 {
325 List<RecipeSource> list = new List<RecipeSource>();
326 foreach (string key in EClass.player.recipes.knownRecipes.Keys)
327 {
328 RecipeSource recipeSource = Get(key);
329 if (recipeSource != null && recipeSource.row is SourceThing.Row && !recipeSource.noRandomRecipe && (recipeSource.NeedFactory || recipeSource.IsQuickCraft) && (cat == null || recipeSource.row.Category.IsChildOf(cat)))
330 {
331 list.Add(recipeSource);
332 }
333 }
334 return list.RandomItemWeighted((RecipeSource r) => (r.row.chance == 0) ? 100 : r.row.chance);
335 }
336
337 public static string GetRandomRecipe(int lvBonus, string cat = null, bool onlyUnlearned = false)
338 {
339 RecipeSource recipeSource = null;
340 recipeSource = GetUnlearnedRecipe(lvBonus, cat, onlyUnlearned);
341 if (recipeSource == null)
342 {
343 recipeSource = GetLearnedRecipe(cat);
344 }
345 return recipeSource?.id;
346 }
347
348 public void OnVersionUpdate()
349 {
350 EClass.pc.things.Foreach(delegate(Thing t)
351 {
352 knownIngredients.Add(t.id);
353 });
354 knownIngredients.Add("flower");
355 }
356}
Emo
Definition: Emo.cs:2
bool isChara
Definition: CardRow.cs:55
bool isOrigin
Definition: CardRow.cs:52
string id
Definition: Card.cs:36
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6421
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6389
ThingContainer things
Definition: Card.cs:39
int Evalue(int ele)
Definition: Card.cs:2611
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:7099
bool godCraft
Definition: CoreDebug.cs:181
bool enable
Definition: CoreDebug.cs:286
bool allRecipe
Definition: CoreDebug.cs:233
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static int rnd(long a)
Definition: EClass.cs:59
static SourceManager sources
Definition: EClass.cs:43
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
static CoreDebug debug
Definition: EClass.cs:49
int id
Definition: ELEMENT.cs:255
QuestManager quests
Definition: Game.cs:183
int seed
Definition: Game.cs:201
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
int slept
Definition: Player.cs:102
RecipeManager recipes
Definition: Player.cs:1164
Stats stats
Definition: Player.cs:1083
int GetPhase(string id)
Definition: Rand.cs:4
static void SetSeed(int a=-1)
Definition: Rand.cs:44
static bool rebuild
Dictionary< string, List< int > > lastIngredients
static void BuildList()
HashSet< string > craftedRecipes
static List< RecipeSource > list
void ComeUpWithRecipe(string idRecipe, int chanceForRandomRecipe=0)
bool IsKnown(string id)
static RecipeSource Get(string id)
static RecipeSource GetLearnedRecipe(string cat=null)
static Dictionary< string, RecipeSource > dict
HashSet< string > knownIngredients
static void Create(RenderRow row, string type, string suffix="")
static RecipeSource GetUnlearnedRecipe(int lvBonus, string cat, bool onlyUnlearned)
LearnState GetRecipeLearnState(string idRecipe)
void OnSleep(bool ehe=false)
Dictionary< string, int > knownRecipes
List< RecipeSource > ListSources(Thing factory, List< RecipeSource > newRecipes=null)
void Add(string id, bool showEffect=true)
void OnVersionUpdate()
HashSet< string > hoveredRecipes
static string GetRandomRecipe(int lvBonus, string cat=null, bool onlyUnlearned=false)
void ComeUpWithRandomRecipe(string idCat=null, int lvBonus=0)
RecipeSource GetSource(string id)
HashSet< string > newRecipes
Element GetReqSkill()
RenderRow row
Definition: RecipeSource.cs:5
bool IsQuickCraft
Definition: RecipeSource.cs:51
string NameFactory
Definition: RecipeSource.cs:75
bool isBridgePillar
Definition: RecipeSource.cs:15
bool noRandomRecipe
Definition: RecipeSource.cs:25
bool NeedFactory
Definition: RecipeSource.cs:63
Definition: Recipe.cs:7
static Recipe Create(RecipeSource _source, int idMat=-1, Thing ing=null)
Definition: Recipe.cs:325
virtual void BuildIngredientList()
Definition: Recipe.cs:526
string[] factory
Definition: RenderRow.cs:54
SourceCategory.Row Category
Definition: RenderRow.cs:119
string category
Definition: RenderRow.cs:46
string[] components
Definition: RenderRow.cs:52
int chance
Definition: RenderRow.cs:24
int LV
Definition: RenderRow.cs:22
List< CardRow > rows
Definition: SourceCard.cs:7
SourceCard cards
SourceObj objs
SourceCellEffect cellEffects
SourceBlock blocks
SourceElement elements
SourceFloor floors
void Foreach(Action< Thing > action, bool onlyAccessible=true)
Definition: Thing.cs:8
static TileTypePillar Pillar
Definition: TileType.cs:41