Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
TraitCrafter.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using UnityEngine;
3
4public class TraitCrafter : Trait
5{
6 public enum MixType
7 {
8 None,
9 Food,
11 Dye,
12 Butcher,
13 Grind,
16 Scratch,
18 Fortune,
20 }
21
22 public enum AnimeType
23 {
24 Default,
26 Pot
27 }
28
29 public override bool ShowFuelWindow => false;
30
31 public virtual Emo Icon => Emo.none;
32
33 public virtual int numIng => 1;
34
35 public virtual string IdSource => "";
36
37 public virtual AnimeType animeType => AnimeType.Default;
38
39 public virtual AnimeID IdAnimeProgress => AnimeID.HitObj;
40
41 public virtual string idSoundProgress => "";
42
43 public virtual string idSoundComplete => null;
44
45 public virtual bool StopSoundProgress => false;
46
47 public override bool IsNightOnlyLight => false;
48
49 public virtual bool CanUseFromInventory => true;
50
51 public override bool HoldAsDefaultInteraction => true;
52
53 public virtual string idSoundBG => null;
54
55 public virtual string CrafterTitle => "";
56
57 public virtual bool CanTriggerFire => base.IsRequireFuel;
58
59 public virtual bool AutoTurnOff => false;
60
61 public virtual bool IsConsumeIng => true;
62
63 public virtual bool CloseOnComplete => false;
64
65 public virtual int CostSP => 1;
66
67 public virtual string IDReqEle(RecipeSource r)
68 {
69 return GetParam(1) ?? "handicraft";
70 }
71
72 public virtual bool IsCraftIngredient(Card c, int idx)
73 {
74 foreach (SourceRecipe.Row row in EClass.sources.recipes.rows)
75 {
76 if (idx == 1)
77 {
79 if (!IsIngredient(0, row, card) || (card == c && card.Num < 2))
80 {
81 continue;
82 }
83 }
84 if (IsIngredient(idx, row, c))
85 {
86 return true;
87 }
88 }
89 return false;
90 }
91
92 public bool IsIngredient(int idx, SourceRecipe.Row r, Card c)
93 {
94 if (r.factory != IdSource || c == null)
95 {
96 return false;
97 }
98 if (c.c_isImportant && ShouldConsumeIng(r, idx))
99 {
100 return false;
101 }
102 string[] array = ((idx == 0) ? r.ing1 : r.ing2);
103 if (r.type.ToEnum<MixType>() == MixType.Grind && idx == 1)
104 {
105 if (r.tag.Contains("rust") && c.encLV >= 0)
106 {
107 return false;
108 }
109 if (r.tag.Contains("mod_eject"))
110 {
111 if (c.sockets == null)
112 {
113 return false;
114 }
115 bool flag = false;
116 foreach (int socket in c.sockets)
117 {
118 if (socket != 0)
119 {
120 flag = true;
121 }
122 }
123 if (!flag)
124 {
125 return false;
126 }
127 }
128 }
129 string[] array2 = array;
130 foreach (string text in array2)
131 {
132 if (r.tag.Contains("noCarbone") && c.material.alias == "carbone")
133 {
134 return false;
135 }
136 if (text.StartsWith('#'))
137 {
138 string text2 = text.Replace("#", "");
139 if (c.category.IsChildOf(text2) && IsIngredient(text2, c))
140 {
141 return true;
142 }
143 continue;
144 }
145 string[] array3 = text.Split('@');
146 if (array3.Length > 1)
147 {
148 if (c.id != array3[0] && c.sourceCard._origin != array3[0])
149 {
150 return false;
151 }
152 if (c.refCard is SourceChara.Row row && row.race_row.tag.Contains(array3[1]))
153 {
154 return true;
155 }
156 if (c.material.tag.Contains(array3[1]))
157 {
158 return true;
159 }
160 continue;
161 }
162 if (text == "any")
163 {
164 if (this is TraitDyeMaker && !c.category.GetRoot().tag.Contains("dye") && !c.category.tag.Contains("dye"))
165 {
166 return false;
167 }
168 if (!c.IsUnique && !c.IsImportant && !c.trait.CanOnlyCarry)
169 {
170 return true;
171 }
172 }
173 if (c.id == text || c.sourceCard._origin == text)
174 {
175 return true;
176 }
177 }
178 return false;
179 }
180
181 public virtual bool IsIngredient(string cat, Card c)
182 {
183 return true;
184 }
185
187 {
188 int num = r.id;
189 string[] ing = r.ing1;
190 for (int i = 0; i < ing.Length; i++)
191 {
192 if (ing[i].Contains('@'))
193 {
194 num -= 10000;
195 }
196 }
197 return num;
198 }
199
200 public virtual int GetDuration(AI_UseCrafter ai, int costSp)
201 {
202 return Mathf.Max(1, GetSource(ai).time * 100 / (80 + EClass.pc.Evalue(IDReqEle(ai.recipe?.source)) * 5));
203 }
204
205 public virtual int GetCostSp(AI_UseCrafter ai)
206 {
207 return GetSource(ai).sp;
208 }
209
211 {
212 List<SourceRecipe.Row> list = new List<SourceRecipe.Row>();
213 foreach (SourceRecipe.Row row in EClass.sources.recipes.rows)
214 {
215 if (row.factory == IdSource)
216 {
217 list.Add(row);
218 }
219 }
220 for (int i = 0; i < numIng; i++)
221 {
222 foreach (SourceRecipe.Row row2 in EClass.sources.recipes.rows)
223 {
224 if (i >= ai.ings.Count || !IsIngredient(i, row2, ai.ings[i]))
225 {
226 list.Remove(row2);
227 }
228 }
229 }
230 if (list.Count == 0)
231 {
232 return null;
233 }
234 list.Sort((SourceRecipe.Row a, SourceRecipe.Row b) => GetSortVal(a) - GetSortVal(b));
235 return list[0];
236 }
237
238 public virtual bool ShouldConsumeIng(SourceRecipe.Row item, int index)
239 {
240 if (IsFactory)
241 {
242 return true;
243 }
244 if (item == null)
245 {
246 return false;
247 }
248 int id = item.id;
249 if ((uint)(id - 47) <= 1u)
250 {
251 return index == 0;
252 }
253 return true;
254 }
255
256 public virtual Thing Craft(AI_UseCrafter ai)
257 {
258 Thing thing = ai.ings[0];
259 Thing thing2 = ((numIng > 1) ? ai.ings[1] : null);
260 SourceRecipe.Row source = GetSource(ai);
261 if (source == null)
262 {
263 return null;
264 }
265 if (!EClass.player.knownCraft.Contains(source.id))
266 {
267 SE.Play("idea");
268 Msg.Say("newKnownCraft");
269 EClass.player.knownCraft.Add(source.id);
270 if ((bool)LayerDragGrid.Instance)
271 {
273 }
274 }
275 string thing3 = source.thing;
276 MixType mixType = source.type.ToEnum<MixType>();
277 int num = source.num.Calc();
278 Thing t = null;
279 bool claimed;
280 switch (mixType)
281 {
282 case MixType.Food:
283 t = CraftUtil.MixIngredients(thing3, ai.ings, CraftUtil.MixType.General, 0, EClass.pc);
284 break;
285 case MixType.Resource:
286 {
287 string[] array = thing3.Split('%');
288 t = CraftUtil.MixIngredients(ThingGen.Create(array[0], (array.Length > 1) ? EClass.sources.materials.alias[array[1]].id : thing.material.id), ai.ings, CraftUtil.MixType.General, 999, EClass.pc).Thing;
289 break;
290 }
291 case MixType.Dye:
292 t = ThingGen.Create(thing3, thing2.material.id);
293 break;
294 case MixType.Butcher:
295 thing3 = SpawnListThing.Get("butcher", (SourceThing.Row a) => a.Category.id == "bodyparts").Select().id;
296 t = ThingGen.Create(thing3);
297 break;
298 case MixType.Grind:
299 if (source.tag.Contains("rust"))
300 {
301 EClass.pc.Say("polish", EClass.pc, ai.ings[1]);
302 ai.ings[1].ModEncLv(1);
303 ai.ings[0].ModNum(-1);
304 }
305 if (source.tag.Contains("mod_eject"))
306 {
307 ai.ings[1].EjectSockets();
308 ai.ings[0].ModNum(-1);
309 }
310 break;
311 case MixType.Sculpture:
312 {
313 t = ThingGen.Create(thing3);
314 List<CardRow> list2 = EClass.player.codex.ListKills();
315 list2.Add(EClass.sources.cards.map["putty"]);
316 list2.Add(EClass.sources.cards.map["snail"]);
317 CardRow cardRow = list2.RandomItemWeighted((CardRow a) => Mathf.Max(50 - a.LV, Mathf.Clamp(EClass.pc.Evalue(258) / 2, 1, a.LV * 2)));
318 t.c_idRefCard = cardRow.id;
319 t.ChangeMaterial(thing.material);
320 t.SetEncLv(Mathf.Min(EClass.rnd(EClass.rnd(Mathf.Max(5 + EClass.pc.Evalue(258) - cardRow.LV, 1))), 12));
321 t = CraftUtil.MixIngredients(t, ai.ings, CraftUtil.MixType.General, 999, EClass.pc).Thing;
322 break;
323 }
324 case MixType.RuneMold:
325 {
326 Thing eq = ai.ings[0];
327 Thing thing7 = eq.Duplicate(1);
328 thing7.SetEncLv(0);
329 List<Element> list = thing7.elements.ListRune();
330 if (list.Count == 0)
331 {
333 break;
334 }
335 foreach (Element item in list)
336 {
337 SocketData runeEnc = eq.GetRuneEnc(item.id);
338 item.vLink = 0;
339 if (runeEnc != null)
340 {
341 if (item.vBase + item.vSource != runeEnc.value)
342 {
343 item.vLink = item.vBase + item.vSource;
344 }
345 item.vBase = runeEnc.value;
346 item.vSource = 0;
347 }
348 }
349 if (eq.material.hardness > owner.material.hardness && !EClass.debug.enable)
350 {
351 Msg.Say("rune_tooHard", owner);
352 break;
353 }
354 EClass.ui.AddLayer<LayerList>().SetList2(list, (Element a) => a.Name, delegate(Element a, ItemGeneral b)
355 {
356 owner.ModNum(-1);
357 eq.Destroy();
358 Thing thing8 = ThingGen.Create("rune");
360 thing8.refVal = a.id;
361 thing8.encLV = a.vBase + a.vSource;
362 EClass.pc.Pick(thing8);
363 EClass.pc.PlaySound("intonation");
364 EClass.pc.PlayEffect("intonation");
365 }, delegate(Element a, ItemGeneral b)
366 {
367 b.SetSubText(a.vBase + a.vSource + ((a.vLink != 0) ? (" (" + a.vLink + ")") : ""), 200, FontColor.Default, TextAnchor.MiddleRight);
368 b.Build();
369 if (a.HasTag("noRune"))
370 {
371 b.button1.interactable = false;
372 b.button1.mainText.gameObject.AddComponent<CanvasGroup>().alpha = 0.5f;
373 }
374 }).SetSize(500f)
375 .SetOnKill(delegate
376 {
377 })
378 .SetTitles("wRuneMold");
379 break;
380 }
381 case MixType.Talisman:
382 {
383 int num4 = EClass.pc.Evalue(1418);
384 Thing thing5 = ai.ings[1];
385 SourceElement.Row source2 = (thing5.trait as TraitSpellbook).source;
386 int num5 = thing5.c_charges * source2.charge * (100 + num4 * 50) / 500 + 1;
387 int num6 = 100;
388 Thing thing6 = ThingGen.Create("talisman").SetNum(num5);
389 thing6.refVal = source2.id;
390 thing6.encLV = num6 * (100 + num4 * 10) / 100;
391 thing.ammoData = thing6;
392 thing.c_ammo = num5;
393 EClass.pc.Say("talisman", thing, thing6);
394 thing5.Destroy();
395 break;
396 }
397 case MixType.Scratch:
398 claimed = false;
399 Prize(20, "medal", "save", cat: false);
400 Prize(10, "plat", "save", cat: false);
401 Prize(10, "furniture", "nice", cat: true);
402 Prize(4, "plamo_box", "nice", cat: false);
403 Prize(4, "food", "", cat: false);
404 Prize(1, "casino_coin", "", cat: false);
405 break;
406 case MixType.Fortune:
407 {
409 int num2 = 0;
410 FortuneRollData orCreateFortuneRollData = EClass._zone.GetOrCreateFortuneRollData(refresh: false);
411 int seed = orCreateFortuneRollData.seed + orCreateFortuneRollData.count + EClass.player.seedFortune;
413 for (int num3 = 3; num3 > 0; num3--)
414 {
415 if (EClass.rnd(FortuneRollData.chances[num3]) == 0)
416 {
417 num2 = num3;
418 break;
419 }
420 }
421 Rand.SetSeed();
422 if (num2 != 0)
423 {
424 owner.PlaySound((num2 == 3) ? "fortuneroll_winBig" : "fortuneroll_win");
425 }
426 Thing thing4 = ThingGen.Create("fortune_ball");
427 thing4.ChangeMaterial(FortuneRollData.mats[num2]);
428 EClass._zone.AddCard(thing4, owner.pos);
429 owner.PlaySound("fortuneroll_ball");
430 orCreateFortuneRollData.GetPrize(num2, seed);
431 if ((bool)LayerDragGrid.Instance)
432 {
434 }
435 break;
436 }
437 case MixType.Incubator:
439 break;
440 default:
441 t = ThingGen.Create(thing3);
442 if (thing3 == "gene")
443 {
444 if (ai.ings[0].c_DNA != null)
445 {
446 t.MakeRefFrom(ai.ings[0].c_idRefCard);
447 t.c_DNA = ai.ings[0].c_DNA;
448 t.c_DNA.GenerateWithGene(DNA.Type.Inferior, t);
449 }
450 }
451 else
452 {
453 t = CraftUtil.MixIngredients(t, ai.ings, CraftUtil.MixType.General, 999, EClass.pc).Thing;
454 }
455 break;
456 }
457 if (t != null)
458 {
459 if (t.HasElement(1229))
460 {
461 num = 1;
462 }
463 if (t.HasElement(704))
464 {
465 num = 1;
466 }
467 if (t.HasElement(703))
468 {
469 num = 1;
470 }
471 t.SetNum(num);
472 }
473 return t;
474 void Prize(int chance, string s, string col, bool cat)
475 {
476 if (!claimed && EClass.rnd(chance) == 0)
477 {
478 t = (cat ? ThingGen.CreateFromCategory(s, EClass.pc.LV) : ThingGen.Create(s, -1, EClass.pc.LV));
479 claimed = true;
480 if (col != "")
481 {
482 Msg.SetColor(col);
483 }
484 }
485 }
486 }
487
488 public override void TrySetAct(ActPlan p)
489 {
490 if (IsFactory)
491 {
492 Thing _t = owner.Thing;
493 p.TrySetAct("craft", delegate
494 {
495 if (EClass.player.recipes.ListSources(_t).Count > 0)
496 {
497 EClass.ui.AddLayer<LayerCraft>().SetFactory(_t);
498 }
499 else
500 {
501 Msg.Say("noRecipes");
502 }
503 return false;
504 }, _t, CursorSystem.Craft);
505 }
506 else if (!(this is TraitIncubator) || EClass._zone.IsPCFaction)
507 {
508 p.TrySetAct(CrafterTitle, delegate
509 {
511 return false;
512 }, owner);
513 }
514 }
515
516 public override bool CanUse(Chara c)
517 {
518 return CanUseFromInventory;
519 }
520
521 public override bool OnUse(Chara c)
522 {
524 {
526 return false;
527 }
528 if (IsFactory)
529 {
530 Thing thing = owner.Thing;
531 if (EClass.player.recipes.ListSources(thing).Count > 0)
532 {
533 EClass.ui.AddLayer<LayerCraft>().SetFactory(thing);
534 }
535 else
536 {
537 Msg.Say("noRecipes");
538 }
539 return false;
540 }
542 return false;
543 }
544
545 public virtual void OnEndAI(AI_UseCrafter ai)
546 {
547 }
548}
AnimeID
Definition: AnimeID.cs:2
@ seed
Emo
Definition: Emo.cs:2
FontColor
Definition: FontColor.cs:2
List< Thing > ings
bool TrySetAct(string lang, Func< bool > onPerform, Card tc, CursorInfo cursor=null, int dist=1, bool isHostileAct=false, bool localAct=true, bool canRepeat=false)
Definition: ActPlan.cs:344
string id
Definition: CardRow.cs:7
Definition: Card.cs:11
void MakeRefFrom(string id)
Definition: Card.cs:5094
Thing Split(int a)
Definition: Card.cs:3231
ElementContainerCard elements
Definition: Card.cs:37
bool HasElement(int ele, int req=1)
Definition: Card.cs:5214
SourceMaterial.Row material
Definition: Card.cs:1927
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5404
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:2838
Thing SetNum(int a)
Definition: Card.cs:3242
Point pos
Definition: Card.cs:55
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5438
void Dye(string idMat)
Definition: Card.cs:5267
void SetEncLv(int a)
Definition: Card.cs:3567
void Destroy()
Definition: Card.cs:4538
bool c_isImportant
Definition: Card.cs:984
virtual Thing Thing
Definition: Card.cs:1934
int Evalue(int ele)
Definition: Card.cs:2431
Thing Duplicate(int num)
Definition: Card.cs:3191
DNA c_DNA
Definition: Card.cs:1781
void ModNum(int a, bool notify=true)
Definition: Card.cs:3262
List< int > sockets
Definition: Card.cs:43
int LV
Definition: Card.cs:370
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6046
Definition: Chara.cs:10
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:3920
List< CardRow > ListKills()
Definition: CodexManager.cs:70
bool enable
Definition: CoreDebug.cs:285
static Thing MixIngredients(string idProduct, List< Thing > ings, MixType type, int idMat=0, Chara crafter=null)
Definition: CraftUtil.cs:132
static CursorInfo Craft
Definition: CursorSystem.cs:90
Definition: DNA.cs:8
void GenerateWithGene(Type _type, Card gene, Chara model=null)
Definition: DNA.cs:247
Type
Definition: DNA.cs:10
Definition: EClass.cs:5
static int rnd(int a)
Definition: EClass.cs:50
static Zone _zone
Definition: EClass.cs:20
static SourceManager sources
Definition: EClass.cs:42
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
static CoreDebug debug
Definition: EClass.cs:48
static UI ui
Definition: EClass.cs:16
List< Element > ListRune()
int id
Definition: ELEMENT.cs:240
int vBase
Definition: ELEMENT.cs:242
bool HasTag(string tag)
Definition: ELEMENT.cs:463
virtual string Name
Definition: ELEMENT.cs:294
int vLink
Definition: ELEMENT.cs:250
int vSource
Definition: ELEMENT.cs:252
void GetPrize(int grade, int seed)
static string[] mats
static int[] chances
void Build()
Definition: ItemGeneral.cs:161
UIButton SetSubText(string lang, int x, FontColor c=FontColor.Default, TextAnchor align=TextAnchor.MiddleLeft)
Definition: ItemGeneral.cs:119
UIDragGridInfo info
List< ButtonGrid > buttons
static LayerDragGrid Instance
static LayerDragGrid CreateCraft(TraitCrafter crafter)
Layer SetOnKill(Action action)
Definition: Layer.cs:579
Definition: Msg.cs:5
static string SayCannotUseHere()
Definition: Msg.cs:101
static string SayNothingHappen()
Definition: Msg.cs:96
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
static void SetColor()
Definition: Msg.cs:22
CodexManager codex
Definition: Player.cs:916
RecipeManager recipes
Definition: Player.cs:898
HashSet< int > knownCraft
Definition: Player.cs:877
int seedFortune
Definition: Player.cs:757
Definition: Rand.cs:4
static void SetSeed(int a=-1)
Definition: Rand.cs:37
List< RecipeSource > ListSources(Thing factory, List< RecipeSource > newRecipes=null)
RecipeSource source
Definition: Recipe.cs:187
int LV
Definition: RenderRow.cs:22
Dictionary< string, CardRow > map
Definition: SourceCard.cs:8
SourceRace.Row race_row
Definition: SourceChara.cs:75
SourceMaterial materials
SourceCard cards
SourceRecipe recipes
virtual bool IsRegion
Definition: Spatial.cs:501
static SpawnList Get(string id, Func< SourceThing.Row, bool > func)
string id
Definition: SpawnList.cs:10
static Thing CreateFromCategory(string idCat, int lv=-1)
Definition: ThingGen.cs:75
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
virtual bool IsConsumeIng
Definition: TraitCrafter.cs:61
virtual string IDReqEle(RecipeSource r)
Definition: TraitCrafter.cs:67
virtual bool StopSoundProgress
Definition: TraitCrafter.cs:45
virtual Emo Icon
Definition: TraitCrafter.cs:31
virtual bool CloseOnComplete
Definition: TraitCrafter.cs:63
virtual string idSoundProgress
Definition: TraitCrafter.cs:41
virtual string IdSource
Definition: TraitCrafter.cs:35
virtual string idSoundBG
Definition: TraitCrafter.cs:53
virtual string CrafterTitle
Definition: TraitCrafter.cs:55
virtual bool IsIngredient(string cat, Card c)
virtual bool ShouldConsumeIng(SourceRecipe.Row item, int index)
SourceRecipe.Row GetSource(AI_UseCrafter ai)
virtual int CostSP
Definition: TraitCrafter.cs:65
virtual AnimeType animeType
Definition: TraitCrafter.cs:37
override bool OnUse(Chara c)
virtual bool AutoTurnOff
Definition: TraitCrafter.cs:59
override bool CanUse(Chara c)
override bool ShowFuelWindow
Definition: TraitCrafter.cs:29
virtual int numIng
Definition: TraitCrafter.cs:33
bool IsIngredient(int idx, SourceRecipe.Row r, Card c)
Definition: TraitCrafter.cs:92
virtual void OnEndAI(AI_UseCrafter ai)
int GetSortVal(SourceRecipe.Row r)
override void TrySetAct(ActPlan p)
virtual bool CanUseFromInventory
Definition: TraitCrafter.cs:49
virtual int GetCostSp(AI_UseCrafter ai)
virtual AnimeID IdAnimeProgress
Definition: TraitCrafter.cs:39
virtual bool IsCraftIngredient(Card c, int idx)
Definition: TraitCrafter.cs:72
virtual int GetDuration(AI_UseCrafter ai, int costSp)
virtual string idSoundComplete
Definition: TraitCrafter.cs:43
override bool IsNightOnlyLight
Definition: TraitCrafter.cs:47
virtual Thing Craft(AI_UseCrafter ai)
override bool HoldAsDefaultInteraction
Definition: TraitCrafter.cs:51
virtual bool CanTriggerFire
Definition: TraitCrafter.cs:57
static Chara Incubate(Thing egg, Point pos, Card incubator=null)
Definition: Trait.cs:7
virtual bool IsFactory
Definition: Trait.cs:135
virtual bool Contains(RecipeSource r)
Definition: Trait.cs:533
string GetParam(int i, string def=null)
Definition: Trait.cs:515
Card owner
Definition: Trait.cs:26
UIText mainText
Definition: UIButton.cs:102
UIButton button1
Definition: UIItem.cs:18
FortuneRollData GetOrCreateFortuneRollData(bool refresh=true)
Definition: Zone.cs:3536
bool IsPCFaction
Definition: Zone.cs:464
Card AddCard(Card t, Point point)
Definition: Zone.cs:1893