screeps/constants/
recipes.rs

1use std::collections::HashMap;
2
3use crate::constants::ResourceType;
4
5/// Returned values from [`ResourceType::commodity_recipe`] representing a
6/// commodity that can be produced in factories.
7#[derive(Clone, Debug)]
8pub struct FactoryRecipe {
9    /// Amount of the component that this recipe creates
10    pub amount: u32,
11    /// Cooldown of the factory after creating this recipe
12    pub cooldown: u32,
13    /// Components - resource type and amount
14    pub components: HashMap<ResourceType, u32>,
15    /// Required factory level to be able to create this commodity, if
16    /// restricted
17    pub level: Option<u32>,
18}
19
20impl ResourceType {
21    /// Translates the `REACTIONS` constant.
22    #[inline]
23    pub const fn reaction_components(self) -> Option<[ResourceType; 2]> {
24        use ResourceType::*;
25        let components = match self {
26            // OH: O + H,
27            Hydroxide => [Oxygen, Hydrogen],
28            // ZK: Z + K,
29            ZynthiumKeanite => [Zynthium, Keanium],
30            // UL: U + L,
31            UtriumLemergite => [Utrium, Lemergium],
32            // G: UL + ZK,
33            Ghodium => [UtriumLemergite, ZynthiumKeanite],
34            // UH: U + H,
35            UtriumHydride => [Utrium, Hydrogen],
36            // UH2O: UH + OH,
37            UtriumAcid => [UtriumHydride, Hydroxide],
38            // XUH2O: UH20 + X,
39            CatalyzedUtriumAcid => [UtriumAcid, Catalyst],
40            // UO: U + O,
41            UtriumOxide => [Utrium, Oxygen],
42            // UHO2: UO + OH,
43            UtriumAlkalide => [UtriumOxide, Hydroxide],
44            // XUHO2: UHO2 + X,
45            CatalyzedUtriumAlkalide => [UtriumAlkalide, Catalyst],
46            // KH: K + H,
47            KeaniumHydride => [Keanium, Hydrogen],
48            // KH2O: KH + OH,
49            KeaniumAcid => [KeaniumHydride, Hydroxide],
50            // XKH2O: KH2O + X,
51            CatalyzedKeaniumAcid => [KeaniumAcid, Catalyst],
52            // KO: K + O,
53            KeaniumOxide => [Keanium, Oxygen],
54            // KHO2: KO + OH,
55            KeaniumAlkalide => [KeaniumOxide, Hydroxide],
56            // XKHO2: KHO2 + X,
57            CatalyzedKeaniumAlkalide => [KeaniumAlkalide, Catalyst],
58            // LH: L + H,
59            LemergiumHydride => [Lemergium, Hydrogen],
60            // LH2O: LH + OH,
61            LemergiumAcid => [LemergiumHydride, Hydroxide],
62            // XLH2O: LH2O + X,
63            CatalyzedLemergiumAcid => [LemergiumAcid, Catalyst],
64            // LO: L + O,
65            LemergiumOxide => [Lemergium, Oxygen],
66            // LHO2: LO + OH,
67            LemergiumAlkalide => [LemergiumOxide, Hydroxide],
68            // XLHO2: LHO2 + X,
69            CatalyzedLemergiumAlkalide => [LemergiumAlkalide, Catalyst],
70            // ZH: Z + H,
71            ZynthiumHydride => [Zynthium, Hydrogen],
72            // ZH2O: ZH + OH,
73            ZynthiumAcid => [ZynthiumHydride, Hydroxide],
74            // XZH2O: ZH2O + Z,
75            CatalyzedZynthiumAcid => [ZynthiumAcid, Catalyst],
76            // ZO: Z + O,
77            ZynthiumOxide => [Zynthium, Oxygen],
78            // ZHO2: ZO + OH,
79            ZynthiumAlkalide => [ZynthiumOxide, Hydroxide],
80            // XZHO2: ZHO2 + X,
81            CatalyzedZynthiumAlkalide => [ZynthiumAlkalide, Catalyst],
82            // GH: G + H,
83            GhodiumHydride => [Ghodium, Hydrogen],
84            // GH2O: GH + OH,
85            GhodiumAcid => [GhodiumHydride, Hydroxide],
86            // XGH2O: GH2O + X,
87            CatalyzedGhodiumAcid => [GhodiumAcid, Catalyst],
88            // GO: G + O,
89            GhodiumOxide => [Ghodium, Oxygen],
90            // GHO2: GO + OH,
91            GhodiumAlkalide => [GhodiumOxide, Hydroxide],
92            // XGHO2: GHO2 + X,
93            CatalyzedGhodiumAlkalide => [GhodiumAlkalide, Catalyst],
94            // non-molecule resources
95            _ => return None,
96        };
97        Some(components)
98    }
99
100    /// Translates the `REACTION_TIME` constant.
101    #[inline]
102    pub const fn reaction_time(self) -> Option<u32> {
103        use ResourceType::*;
104        let time = match self {
105            // these comments copied directly from JavaScript 'constants.js' file.
106            // OH: 20,
107            Hydroxide => 20,
108            // ZK: 5,
109            ZynthiumKeanite => 5,
110            // UL: 5,
111            UtriumLemergite => 5,
112            // G: 5,
113            Ghodium => 5,
114            // UH: 10,
115            UtriumHydride => 10,
116            // UH2O: 5,
117            UtriumAcid => 5,
118            // XUH2O: 60,
119            CatalyzedUtriumAcid => 60,
120            // UO: 10,
121            UtriumOxide => 10,
122            // UHO2: 5,
123            UtriumAlkalide => 5,
124            // XUHO2: 60,
125            CatalyzedUtriumAlkalide => 60,
126            // KH: 10,
127            KeaniumHydride => 10,
128            // KH2O: 5,
129            KeaniumAcid => 5,
130            // XKH2O: 60,
131            CatalyzedKeaniumAcid => 60,
132            // KO: 10,
133            KeaniumOxide => 10,
134            // KHO2: 5,
135            KeaniumAlkalide => 5,
136            // XKHO2: 60,
137            CatalyzedKeaniumAlkalide => 60,
138            // LH: 15,
139            LemergiumHydride => 15,
140            // LH2O: 10,
141            LemergiumAcid => 10,
142            // XLH2O: 65,
143            CatalyzedLemergiumAcid => 65,
144            // LO: 10,
145            LemergiumOxide => 10,
146            // LHO2: 5,
147            LemergiumAlkalide => 5,
148            // XLHO2: 60,
149            CatalyzedLemergiumAlkalide => 60,
150            // ZH: 20,
151            ZynthiumHydride => 20,
152            // ZH2O: 40,
153            ZynthiumAcid => 40,
154            // XZH2O: 160,
155            CatalyzedZynthiumAcid => 160,
156            // ZO: 10,
157            ZynthiumOxide => 10,
158            // ZHO2: 5,
159            ZynthiumAlkalide => 5,
160            // XZHO2: 60,
161            CatalyzedZynthiumAlkalide => 60,
162            // GH: 10,
163            GhodiumHydride => 10,
164            // GH2O: 15,
165            GhodiumAcid => 15,
166            // XGH2O: 80,
167            CatalyzedGhodiumAcid => 80,
168            // GO: 10,
169            GhodiumOxide => 10,
170            // GHO2: 30,
171            GhodiumAlkalide => 30,
172            // XGHO2: 150,
173            CatalyzedGhodiumAlkalide => 150,
174            // non-molecule resources
175            _ => return None,
176        };
177        Some(time)
178    }
179
180    /// Translates the `COMMODITIES` constant to recipes that can be used by a
181    /// factory to make each commodity
182    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            // non-factory resources
739            _ => return None,
740        };
741        Some(recipe)
742    }
743}