Skip to content

Commit ba2b20c

Browse files
committed
add RESOURCES_ALL and StoreObject::resource_types
1 parent a8c9df4 commit ba2b20c

File tree

4 files changed

+183
-4
lines changed

4 files changed

+183
-4
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ Unreleased
1212
- Add function `game::market::orders_jsstring` to get the object as `JsHashMap<JsString, MyOrder>`
1313
- Add function `name_jsstring` to `SharedCreepProperties` trait, `Flag`, and `StructureSpawn`
1414
- Add function `raw_memory::segments_jsstring` to get the object as `JsHashMap<u8, JsString>`
15+
- Add constant `screeps::constants::resources::RESOURCES_ALL` (also accessible as
16+
`screeps::RESOURCES_ALL`) that contains every resource type.
17+
- Add function `StoreObject::resource_types` to get the types of resources that a store can hold.
18+
- This can be used with a `StructureObject` as `StoreObject::try_from(structure_object).map(|store| store.resource_types())`
19+
which returns a `Result<&'static [ResourceType], StoreObjectConversionError>`.
1520

1621
0.20.1 (2024-01-09)
1722
===================

src/constants.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,10 @@ pub mod observer {
242242
///
243243
/// [`Resource`]: crate::objects::Resource
244244
pub mod resource {
245-
pub use super::{numbers::ENERGY_DECAY, types::ResourceType};
245+
pub use super::{
246+
numbers::ENERGY_DECAY,
247+
types::{ResourceType, RESOURCES_ALL},
248+
};
246249
}
247250

248251
/// Re-export of all constants related to [`Tombstone`]s.

src/constants/types.rs

Lines changed: 144 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,8 @@ pub enum IntershardResourceType {
199199

200200
named_enum_serialize_deserialize!(IntershardResourceType);
201201

202-
/// Translates `RESOURCES_ALL` constant, representing all possible in-game
203-
/// (non-intershard) resources.
202+
/// Translates the values of the `RESOURCES_ALL` constant, representing all
203+
/// possible in-game (non-intershard) resources.
204204
#[wasm_bindgen]
205205
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Sequence)]
206206
pub enum ResourceType {
@@ -485,6 +485,148 @@ impl ResourceType {
485485
}
486486
}
487487

488+
/// A collection of all resource types. This is a direct translation of the
489+
/// `RESOURCES_ALL` constant in game using the rust `ResourceType` enum.
490+
///
491+
/// Feature-specific resources are included in this list when the appropriate
492+
/// feature is enabled.
493+
pub const RESOURCES_ALL: &'static [ResourceType] = &[
494+
ResourceType::Power,
495+
ResourceType::Energy,
496+
ResourceType::Hydrogen,
497+
ResourceType::Oxygen,
498+
ResourceType::Utrium,
499+
ResourceType::Lemergium,
500+
ResourceType::Keanium,
501+
ResourceType::Zynthium,
502+
ResourceType::Catalyst,
503+
ResourceType::Ghodium,
504+
ResourceType::Silicon,
505+
ResourceType::Metal,
506+
ResourceType::Biomass,
507+
ResourceType::Mist,
508+
ResourceType::Hydroxide,
509+
ResourceType::ZynthiumKeanite,
510+
ResourceType::UtriumLemergite,
511+
ResourceType::UtriumHydride,
512+
ResourceType::UtriumOxide,
513+
ResourceType::KeaniumHydride,
514+
ResourceType::KeaniumOxide,
515+
ResourceType::LemergiumHydride,
516+
ResourceType::LemergiumOxide,
517+
ResourceType::ZynthiumHydride,
518+
ResourceType::ZynthiumOxide,
519+
ResourceType::GhodiumHydride,
520+
ResourceType::GhodiumOxide,
521+
ResourceType::UtriumAcid,
522+
ResourceType::UtriumAlkalide,
523+
ResourceType::KeaniumAcid,
524+
ResourceType::KeaniumAlkalide,
525+
ResourceType::LemergiumAcid,
526+
ResourceType::LemergiumAlkalide,
527+
ResourceType::ZynthiumAcid,
528+
ResourceType::ZynthiumAlkalide,
529+
ResourceType::GhodiumAcid,
530+
ResourceType::GhodiumAlkalide,
531+
ResourceType::CatalyzedUtriumAcid,
532+
ResourceType::CatalyzedUtriumAlkalide,
533+
ResourceType::CatalyzedKeaniumAcid,
534+
ResourceType::CatalyzedKeaniumAlkalide,
535+
ResourceType::CatalyzedLemergiumAcid,
536+
ResourceType::CatalyzedLemergiumAlkalide,
537+
ResourceType::CatalyzedZynthiumAcid,
538+
ResourceType::CatalyzedZynthiumAlkalide,
539+
ResourceType::CatalyzedGhodiumAcid,
540+
ResourceType::CatalyzedGhodiumAlkalide,
541+
ResourceType::Ops,
542+
ResourceType::UtriumBar,
543+
ResourceType::LemergiumBar,
544+
ResourceType::ZynthiumBar,
545+
ResourceType::KeaniumBar,
546+
ResourceType::GhodiumMelt,
547+
ResourceType::Oxidant,
548+
ResourceType::Reductant,
549+
ResourceType::Purifier,
550+
ResourceType::Battery,
551+
ResourceType::Composite,
552+
ResourceType::Crystal,
553+
ResourceType::Liquid,
554+
ResourceType::Wire,
555+
ResourceType::Switch,
556+
ResourceType::Transistor,
557+
ResourceType::Microchip,
558+
ResourceType::Circuit,
559+
ResourceType::Device,
560+
ResourceType::Cell,
561+
ResourceType::Phlegm,
562+
ResourceType::Tissue,
563+
ResourceType::Muscle,
564+
ResourceType::Organoid,
565+
ResourceType::Organism,
566+
ResourceType::Alloy,
567+
ResourceType::Tube,
568+
ResourceType::Fixtures,
569+
ResourceType::Frame,
570+
ResourceType::Hydraulics,
571+
ResourceType::Machine,
572+
ResourceType::Condensate,
573+
ResourceType::Concentrate,
574+
ResourceType::Extract,
575+
ResourceType::Spirit,
576+
ResourceType::Emanation,
577+
ResourceType::Essence,
578+
#[cfg(feature = "seasonal-season-1")]
579+
ResourceType::Score,
580+
#[cfg(feature = "seasonal-season-2")]
581+
ResourceType::SymbolAleph,
582+
#[cfg(feature = "seasonal-season-2")]
583+
ResourceType::SymbolBeth,
584+
#[cfg(feature = "seasonal-season-2")]
585+
ResourceType::SymbolGimmel,
586+
#[cfg(feature = "seasonal-season-2")]
587+
ResourceType::SymbolDaleth,
588+
#[cfg(feature = "seasonal-season-2")]
589+
ResourceType::SymbolHe,
590+
#[cfg(feature = "seasonal-season-2")]
591+
ResourceType::SymbolWaw,
592+
#[cfg(feature = "seasonal-season-2")]
593+
ResourceType::SymbolZayin,
594+
#[cfg(feature = "seasonal-season-2")]
595+
ResourceType::SymbolHeth,
596+
#[cfg(feature = "seasonal-season-2")]
597+
ResourceType::SymbolTeth,
598+
#[cfg(feature = "seasonal-season-2")]
599+
ResourceType::SymbolYodh,
600+
#[cfg(feature = "seasonal-season-2")]
601+
ResourceType::SymbolKaph,
602+
#[cfg(feature = "seasonal-season-2")]
603+
ResourceType::SymbolLamedh,
604+
#[cfg(feature = "seasonal-season-2")]
605+
ResourceType::SymbolMem,
606+
#[cfg(feature = "seasonal-season-2")]
607+
ResourceType::SymbolNun,
608+
#[cfg(feature = "seasonal-season-2")]
609+
ResourceType::SymbolSamekh,
610+
#[cfg(feature = "seasonal-season-2")]
611+
ResourceType::SymbolAyin,
612+
#[cfg(feature = "seasonal-season-2")]
613+
ResourceType::SymbolPe,
614+
#[cfg(feature = "seasonal-season-2")]
615+
ResourceType::SymbolTsade,
616+
#[cfg(feature = "seasonal-season-2")]
617+
ResourceType::SymbolQoph,
618+
#[cfg(feature = "seasonal-season-2")]
619+
ResourceType::SymbolRes,
620+
// sin/sim mismatch is intended here - see official mod:
621+
// https://github.com/screeps/mod-season2/blob/3dfaa8f6214b2610dbe2a700c6287a10e7960ae8/src/resources.js#L23
622+
#[cfg(feature = "seasonal-season-2")]
623+
ResourceType::SymbolSin,
624+
#[cfg(feature = "seasonal-season-2")]
625+
ResourceType::SymbolTaw,
626+
#[cfg(feature = "seasonal-season-5")]
627+
ResourceType::Thorium,
628+
];
629+
488630
/// Returned values from [`ResourceType::boost`] representing the effect of
489631
/// boosting a creep with the given resource.
490632
#[derive(Copy, Clone, Debug)]

src/enums.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::convert::TryFrom;
77
use enum_dispatch::enum_dispatch;
88
use wasm_bindgen::{JsCast, JsValue};
99

10-
use crate::{objects::*, prelude::*};
10+
use crate::{objects::*, prelude::*, ResourceType, RESOURCES_ALL};
1111

1212
#[enum_dispatch(Attackable)]
1313
pub enum AttackableObject {
@@ -188,6 +188,35 @@ pub enum StoreObject {
188188
Tombstone,
189189
}
190190

191+
impl StoreObject {
192+
/// All possible resources that this store may hold.
193+
///
194+
/// Note: [`StructureLab`] is slightly odd in that it can hold any possible
195+
/// resource (including non-lab resources like power), but only one
196+
/// non-energy resource at a time.
197+
///
198+
/// Data collected on 2024-02-29 from <https://github.com/screeps/engine/tree/97c9d12385fed686655c13b09f5f2457dd83a2bf>
199+
pub const fn resource_types(&self) -> &'static [ResourceType] {
200+
match self {
201+
StoreObject::Creep(_) => RESOURCES_ALL,
202+
StoreObject::PowerCreep(_) => RESOURCES_ALL,
203+
StoreObject::Ruin(_) => RESOURCES_ALL,
204+
StoreObject::StructureContainer(_) => RESOURCES_ALL,
205+
StoreObject::StructureExtension(_) => &[ResourceType::Energy],
206+
StoreObject::StructureFactory(_) => RESOURCES_ALL,
207+
StoreObject::StructureLab(_) => RESOURCES_ALL,
208+
StoreObject::StructureLink(_) => &[ResourceType::Energy],
209+
StoreObject::StructureNuker(_) => &[ResourceType::Energy, ResourceType::Ghodium],
210+
StoreObject::StructurePowerSpawn(_) => &[ResourceType::Energy, ResourceType::Power],
211+
StoreObject::StructureSpawn(_) => &[ResourceType::Energy],
212+
StoreObject::StructureStorage(_) => RESOURCES_ALL,
213+
StoreObject::StructureTerminal(_) => RESOURCES_ALL,
214+
StoreObject::StructureTower(_) => &[ResourceType::Energy],
215+
StoreObject::Tombstone(_) => RESOURCES_ALL,
216+
}
217+
}
218+
}
219+
191220
/// Enum used for converting a [`Structure`] into a typed object of its specific
192221
/// structure type.
193222
#[enum_dispatch(OwnedStructureProperties)]

0 commit comments

Comments
 (0)