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