1use std::collections::HashMap;
2
3use crate::constants::ResourceType;
4
5#[derive(Clone, Debug)]
8pub struct FactoryRecipe {
9 pub amount: u32,
11 pub cooldown: u32,
13 pub components: HashMap<ResourceType, u32>,
15 pub level: Option<u32>,
18}
19
20impl ResourceType {
21 #[inline]
23 pub const fn reaction_components(self) -> Option<[ResourceType; 2]> {
24 use ResourceType::*;
25 let components = match self {
26 Hydroxide => [Oxygen, Hydrogen],
28 ZynthiumKeanite => [Zynthium, Keanium],
30 UtriumLemergite => [Utrium, Lemergium],
32 Ghodium => [UtriumLemergite, ZynthiumKeanite],
34 UtriumHydride => [Utrium, Hydrogen],
36 UtriumAcid => [UtriumHydride, Hydroxide],
38 CatalyzedUtriumAcid => [UtriumAcid, Catalyst],
40 UtriumOxide => [Utrium, Oxygen],
42 UtriumAlkalide => [UtriumOxide, Hydroxide],
44 CatalyzedUtriumAlkalide => [UtriumAlkalide, Catalyst],
46 KeaniumHydride => [Keanium, Hydrogen],
48 KeaniumAcid => [KeaniumHydride, Hydroxide],
50 CatalyzedKeaniumAcid => [KeaniumAcid, Catalyst],
52 KeaniumOxide => [Keanium, Oxygen],
54 KeaniumAlkalide => [KeaniumOxide, Hydroxide],
56 CatalyzedKeaniumAlkalide => [KeaniumAlkalide, Catalyst],
58 LemergiumHydride => [Lemergium, Hydrogen],
60 LemergiumAcid => [LemergiumHydride, Hydroxide],
62 CatalyzedLemergiumAcid => [LemergiumAcid, Catalyst],
64 LemergiumOxide => [Lemergium, Oxygen],
66 LemergiumAlkalide => [LemergiumOxide, Hydroxide],
68 CatalyzedLemergiumAlkalide => [LemergiumAlkalide, Catalyst],
70 ZynthiumHydride => [Zynthium, Hydrogen],
72 ZynthiumAcid => [ZynthiumHydride, Hydroxide],
74 CatalyzedZynthiumAcid => [ZynthiumAcid, Catalyst],
76 ZynthiumOxide => [Zynthium, Oxygen],
78 ZynthiumAlkalide => [ZynthiumOxide, Hydroxide],
80 CatalyzedZynthiumAlkalide => [ZynthiumAlkalide, Catalyst],
82 GhodiumHydride => [Ghodium, Hydrogen],
84 GhodiumAcid => [GhodiumHydride, Hydroxide],
86 CatalyzedGhodiumAcid => [GhodiumAcid, Catalyst],
88 GhodiumOxide => [Ghodium, Oxygen],
90 GhodiumAlkalide => [GhodiumOxide, Hydroxide],
92 CatalyzedGhodiumAlkalide => [GhodiumAlkalide, Catalyst],
94 _ => return None,
96 };
97 Some(components)
98 }
99
100 #[inline]
102 pub const fn reaction_time(self) -> Option<u32> {
103 use ResourceType::*;
104 let time = match self {
105 Hydroxide => 20,
108 ZynthiumKeanite => 5,
110 UtriumLemergite => 5,
112 Ghodium => 5,
114 UtriumHydride => 10,
116 UtriumAcid => 5,
118 CatalyzedUtriumAcid => 60,
120 UtriumOxide => 10,
122 UtriumAlkalide => 5,
124 CatalyzedUtriumAlkalide => 60,
126 KeaniumHydride => 10,
128 KeaniumAcid => 5,
130 CatalyzedKeaniumAcid => 60,
132 KeaniumOxide => 10,
134 KeaniumAlkalide => 5,
136 CatalyzedKeaniumAlkalide => 60,
138 LemergiumHydride => 15,
140 LemergiumAcid => 10,
142 CatalyzedLemergiumAcid => 65,
144 LemergiumOxide => 10,
146 LemergiumAlkalide => 5,
148 CatalyzedLemergiumAlkalide => 60,
150 ZynthiumHydride => 20,
152 ZynthiumAcid => 40,
154 CatalyzedZynthiumAcid => 160,
156 ZynthiumOxide => 10,
158 ZynthiumAlkalide => 5,
160 CatalyzedZynthiumAlkalide => 60,
162 GhodiumHydride => 10,
164 GhodiumAcid => 15,
166 CatalyzedGhodiumAcid => 80,
168 GhodiumOxide => 10,
170 GhodiumAlkalide => 30,
172 CatalyzedGhodiumAlkalide => 150,
174 _ => return None,
176 };
177 Some(time)
178 }
179
180 pub fn commodity_recipe(self) -> Option<FactoryRecipe> {
183 use ResourceType::*;
184 let recipe = match self {
185 UtriumBar => FactoryRecipe {
186 amount: 100,
187 cooldown: 20,
188 components: {
189 let mut components = HashMap::new();
190 components.insert(Utrium, 500);
191 components.insert(Energy, 200);
192 components
193 },
194 level: None,
195 },
196 Utrium => FactoryRecipe {
197 amount: 500,
198 cooldown: 20,
199 components: {
200 let mut components = HashMap::new();
201 components.insert(UtriumBar, 100);
202 components.insert(Energy, 200);
203 components
204 },
205 level: None,
206 },
207 LemergiumBar => FactoryRecipe {
208 amount: 100,
209 cooldown: 20,
210 components: {
211 let mut components = HashMap::new();
212 components.insert(Lemergium, 500);
213 components.insert(Energy, 200);
214 components
215 },
216 level: None,
217 },
218 Lemergium => FactoryRecipe {
219 amount: 500,
220 cooldown: 20,
221 components: {
222 let mut components = HashMap::new();
223 components.insert(LemergiumBar, 100);
224 components.insert(Energy, 200);
225 components
226 },
227 level: None,
228 },
229 ZynthiumBar => FactoryRecipe {
230 amount: 100,
231 cooldown: 20,
232 components: {
233 let mut components = HashMap::new();
234 components.insert(Zynthium, 500);
235 components.insert(Energy, 200);
236 components
237 },
238 level: None,
239 },
240 Zynthium => FactoryRecipe {
241 amount: 500,
242 cooldown: 20,
243 components: {
244 let mut components = HashMap::new();
245 components.insert(ZynthiumBar, 100);
246 components.insert(Energy, 200);
247 components
248 },
249 level: None,
250 },
251 KeaniumBar => FactoryRecipe {
252 amount: 100,
253 cooldown: 20,
254 components: {
255 let mut components = HashMap::new();
256 components.insert(Keanium, 500);
257 components.insert(Energy, 200);
258 components
259 },
260 level: None,
261 },
262 Keanium => FactoryRecipe {
263 amount: 500,
264 cooldown: 20,
265 components: {
266 let mut components = HashMap::new();
267 components.insert(KeaniumBar, 100);
268 components.insert(Energy, 200);
269 components
270 },
271 level: None,
272 },
273 GhodiumMelt => FactoryRecipe {
274 amount: 100,
275 cooldown: 20,
276 components: {
277 let mut components = HashMap::new();
278 components.insert(Ghodium, 500);
279 components.insert(Energy, 200);
280 components
281 },
282 level: None,
283 },
284 Ghodium => FactoryRecipe {
285 amount: 500,
286 cooldown: 20,
287 components: {
288 let mut components = HashMap::new();
289 components.insert(GhodiumMelt, 100);
290 components.insert(Energy, 200);
291 components
292 },
293 level: None,
294 },
295 Oxidant => FactoryRecipe {
296 amount: 100,
297 cooldown: 20,
298 components: {
299 let mut components = HashMap::new();
300 components.insert(Oxygen, 500);
301 components.insert(Energy, 200);
302 components
303 },
304 level: None,
305 },
306 Oxygen => FactoryRecipe {
307 amount: 500,
308 cooldown: 20,
309 components: {
310 let mut components = HashMap::new();
311 components.insert(Oxidant, 100);
312 components.insert(Energy, 200);
313 components
314 },
315 level: None,
316 },
317 Reductant => FactoryRecipe {
318 amount: 100,
319 cooldown: 20,
320 components: {
321 let mut components = HashMap::new();
322 components.insert(Hydrogen, 500);
323 components.insert(Energy, 200);
324 components
325 },
326 level: None,
327 },
328 Hydrogen => FactoryRecipe {
329 amount: 500,
330 cooldown: 20,
331 components: {
332 let mut components = HashMap::new();
333 components.insert(Reductant, 100);
334 components.insert(Energy, 200);
335 components
336 },
337 level: None,
338 },
339 Purifier => FactoryRecipe {
340 amount: 100,
341 cooldown: 20,
342 components: {
343 let mut components = HashMap::new();
344 components.insert(Catalyst, 500);
345 components.insert(Energy, 200);
346 components
347 },
348 level: None,
349 },
350 Catalyst => FactoryRecipe {
351 amount: 500,
352 cooldown: 20,
353 components: {
354 let mut components = HashMap::new();
355 components.insert(Purifier, 100);
356 components.insert(Energy, 200);
357 components
358 },
359 level: None,
360 },
361 Battery => FactoryRecipe {
362 amount: 50,
363 cooldown: 10,
364 components: {
365 let mut components = HashMap::new();
366 components.insert(Energy, 600);
367 components
368 },
369 level: None,
370 },
371 Energy => FactoryRecipe {
372 amount: 500,
373 cooldown: 10,
374 components: {
375 let mut components = HashMap::new();
376 components.insert(Battery, 50);
377 components
378 },
379 level: None,
380 },
381 Composite => FactoryRecipe {
382 amount: 20,
383 cooldown: 50,
384 components: {
385 let mut components = HashMap::new();
386 components.insert(UtriumBar, 20);
387 components.insert(ZynthiumBar, 20);
388 components.insert(Energy, 20);
389 components
390 },
391 level: Some(1),
392 },
393 Crystal => FactoryRecipe {
394 amount: 6,
395 cooldown: 21,
396 components: {
397 let mut components = HashMap::new();
398 components.insert(LemergiumBar, 6);
399 components.insert(KeaniumBar, 6);
400 components.insert(Purifier, 6);
401 components.insert(Energy, 45);
402 components
403 },
404 level: Some(2),
405 },
406 Liquid => FactoryRecipe {
407 amount: 12,
408 cooldown: 60,
409 components: {
410 let mut components = HashMap::new();
411 components.insert(Oxidant, 12);
412 components.insert(Reductant, 12);
413 components.insert(GhodiumMelt, 12);
414 components.insert(Energy, 90);
415 components
416 },
417 level: Some(3),
418 },
419 Wire => FactoryRecipe {
420 amount: 20,
421 cooldown: 8,
422 components: {
423 let mut components = HashMap::new();
424 components.insert(UtriumBar, 20);
425 components.insert(Silicon, 100);
426 components.insert(Energy, 40);
427 components
428 },
429 level: None,
430 },
431 Switch => FactoryRecipe {
432 amount: 5,
433 cooldown: 70,
434 components: {
435 let mut components = HashMap::new();
436 components.insert(Wire, 40);
437 components.insert(Oxidant, 95);
438 components.insert(UtriumBar, 35);
439 components.insert(Energy, 20);
440 components
441 },
442 level: Some(1),
443 },
444 Transistor => FactoryRecipe {
445 amount: 1,
446 cooldown: 59,
447 components: {
448 let mut components = HashMap::new();
449 components.insert(Switch, 4);
450 components.insert(Wire, 15);
451 components.insert(Reductant, 85);
452 components.insert(Energy, 8);
453 components
454 },
455 level: Some(2),
456 },
457 Microchip => FactoryRecipe {
458 amount: 1,
459 cooldown: 250,
460 components: {
461 let mut components = HashMap::new();
462 components.insert(Transistor, 2);
463 components.insert(Composite, 50);
464 components.insert(Wire, 117);
465 components.insert(Purifier, 25);
466 components.insert(Energy, 16);
467 components
468 },
469 level: Some(3),
470 },
471 Circuit => FactoryRecipe {
472 amount: 1,
473 cooldown: 800,
474 components: {
475 let mut components = HashMap::new();
476 components.insert(Microchip, 1);
477 components.insert(Transistor, 5);
478 components.insert(Switch, 4);
479 components.insert(Oxidant, 115);
480 components.insert(Energy, 32);
481 components
482 },
483 level: Some(4),
484 },
485 Device => FactoryRecipe {
486 amount: 1,
487 cooldown: 600,
488 components: {
489 let mut components = HashMap::new();
490 components.insert(Circuit, 1);
491 components.insert(Microchip, 3);
492 components.insert(Crystal, 110);
493 components.insert(GhodiumMelt, 150);
494 components.insert(Energy, 64);
495 components
496 },
497 level: Some(5),
498 },
499 Cell => FactoryRecipe {
500 amount: 20,
501 cooldown: 8,
502 components: {
503 let mut components = HashMap::new();
504 components.insert(LemergiumBar, 20);
505 components.insert(Biomass, 100);
506 components.insert(Energy, 40);
507 components
508 },
509 level: None,
510 },
511 Phlegm => FactoryRecipe {
512 amount: 2,
513 cooldown: 35,
514 components: {
515 let mut components = HashMap::new();
516 components.insert(Cell, 20);
517 components.insert(Oxidant, 36);
518 components.insert(LemergiumBar, 16);
519 components.insert(Energy, 8);
520 components
521 },
522 level: Some(1),
523 },
524 Tissue => FactoryRecipe {
525 amount: 2,
526 cooldown: 164,
527 components: {
528 let mut components = HashMap::new();
529 components.insert(Phlegm, 10);
530 components.insert(Cell, 10);
531 components.insert(Reductant, 110);
532 components.insert(Energy, 16);
533 components
534 },
535 level: Some(2),
536 },
537 Muscle => FactoryRecipe {
538 amount: 1,
539 cooldown: 250,
540 components: {
541 let mut components = HashMap::new();
542 components.insert(Tissue, 3);
543 components.insert(Phlegm, 3);
544 components.insert(ZynthiumBar, 50);
545 components.insert(Reductant, 50);
546 components.insert(Energy, 16);
547 components
548 },
549 level: Some(3),
550 },
551 Organoid => FactoryRecipe {
552 amount: 1,
553 cooldown: 800,
554 components: {
555 let mut components = HashMap::new();
556 components.insert(Muscle, 1);
557 components.insert(Tissue, 5);
558 components.insert(Purifier, 208);
559 components.insert(Oxidant, 256);
560 components.insert(Energy, 32);
561 components
562 },
563 level: Some(4),
564 },
565 Organism => FactoryRecipe {
566 amount: 1,
567 cooldown: 600,
568 components: {
569 let mut components = HashMap::new();
570 components.insert(Organoid, 1);
571 components.insert(Liquid, 150);
572 components.insert(Tissue, 6);
573 components.insert(Cell, 310);
574 components.insert(Energy, 64);
575 components
576 },
577 level: Some(5),
578 },
579 Alloy => FactoryRecipe {
580 amount: 20,
581 cooldown: 8,
582 components: {
583 let mut components = HashMap::new();
584 components.insert(ZynthiumBar, 20);
585 components.insert(Metal, 100);
586 components.insert(Energy, 40);
587 components
588 },
589 level: None,
590 },
591 Tube => FactoryRecipe {
592 amount: 2,
593 cooldown: 45,
594 components: {
595 let mut components = HashMap::new();
596 components.insert(Alloy, 40);
597 components.insert(ZynthiumBar, 16);
598 components.insert(Energy, 8);
599 components
600 },
601 level: Some(1),
602 },
603 Fixtures => FactoryRecipe {
604 amount: 1,
605 cooldown: 115,
606 components: {
607 let mut components = HashMap::new();
608 components.insert(Composite, 20);
609 components.insert(Alloy, 41);
610 components.insert(Oxidant, 161);
611 components.insert(Energy, 8);
612 components
613 },
614 level: Some(2),
615 },
616 Frame => FactoryRecipe {
617 amount: 1,
618 cooldown: 125,
619 components: {
620 let mut components = HashMap::new();
621 components.insert(Fixtures, 2);
622 components.insert(Tube, 4);
623 components.insert(Reductant, 330);
624 components.insert(ZynthiumBar, 31);
625 components.insert(Energy, 16);
626 components
627 },
628 level: Some(3),
629 },
630 Hydraulics => FactoryRecipe {
631 amount: 1,
632 cooldown: 800,
633 components: {
634 let mut components = HashMap::new();
635 components.insert(Liquid, 150);
636 components.insert(Fixtures, 3);
637 components.insert(Tube, 15);
638 components.insert(Purifier, 208);
639 components.insert(Energy, 32);
640 components
641 },
642 level: Some(4),
643 },
644 Machine => FactoryRecipe {
645 amount: 1,
646 cooldown: 600,
647 components: {
648 let mut components = HashMap::new();
649 components.insert(Hydraulics, 1);
650 components.insert(Frame, 2);
651 components.insert(Fixtures, 3);
652 components.insert(Tube, 12);
653 components.insert(Energy, 64);
654 components
655 },
656 level: Some(5),
657 },
658 Condensate => FactoryRecipe {
659 amount: 20,
660 cooldown: 8,
661 components: {
662 let mut components = HashMap::new();
663 components.insert(KeaniumBar, 20);
664 components.insert(Mist, 100);
665 components.insert(Energy, 40);
666 components
667 },
668 level: None,
669 },
670 Concentrate => FactoryRecipe {
671 amount: 3,
672 cooldown: 41,
673 components: {
674 let mut components = HashMap::new();
675 components.insert(Condensate, 30);
676 components.insert(KeaniumBar, 15);
677 components.insert(Reductant, 54);
678 components.insert(Energy, 12);
679 components
680 },
681 level: Some(1),
682 },
683 Extract => FactoryRecipe {
684 amount: 2,
685 cooldown: 128,
686 components: {
687 let mut components = HashMap::new();
688 components.insert(Concentrate, 10);
689 components.insert(Condensate, 30);
690 components.insert(Oxidant, 60);
691 components.insert(Energy, 16);
692 components
693 },
694 level: Some(2),
695 },
696 Spirit => FactoryRecipe {
697 amount: 1,
698 cooldown: 200,
699 components: {
700 let mut components = HashMap::new();
701 components.insert(Extract, 2);
702 components.insert(Concentrate, 6);
703 components.insert(Reductant, 90);
704 components.insert(Purifier, 20);
705 components.insert(Energy, 16);
706 components
707 },
708 level: Some(3),
709 },
710 Emanation => FactoryRecipe {
711 amount: 1,
712 cooldown: 800,
713 components: {
714 let mut components = HashMap::new();
715 components.insert(Spirit, 2);
716 components.insert(Extract, 2);
717 components.insert(Concentrate, 3);
718 components.insert(KeaniumBar, 112);
719 components.insert(Energy, 32);
720 components
721 },
722 level: Some(4),
723 },
724 Essence => FactoryRecipe {
725 amount: 1,
726 cooldown: 600,
727 components: {
728 let mut components = HashMap::new();
729 components.insert(Emanation, 1);
730 components.insert(Spirit, 3);
731 components.insert(Crystal, 110);
732 components.insert(GhodiumMelt, 150);
733 components.insert(Energy, 64);
734 components
735 },
736 level: Some(5),
737 },
738 _ => return None,
740 };
741 Some(recipe)
742 }
743}