Skip to content

Commit f78d544

Browse files
add RESOURCES_ALL constant and StoreObject::resource_types (#499)
1 parent c9abd31 commit f78d544

File tree

4 files changed

+209
-5
lines changed

4 files changed

+209
-5
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ Unreleased
1717
- Add `RoomCoordinate::is_room_edge`, `RoomXY::is_room_edge`, and `Position::is_room_edge`
1818
- Add new extra constant `constants::extra::CONTROLLER_DOWNGRADE_PROGRESS_RATIO`, which is
1919
the percentage toward the previous level that a downgrading controller's progress is set to
20-
- Add new extra constants `constants::extra::MOVE_COST_PLAIN`, `MOVE_COST_ROAD`, `MOVE_COST_SWAMP`
20+
- Add new extra constants `constants::extra::{MOVE_COST_PLAIN, MOVE_COST_ROAD, MOVE_COST_SWAMP}`
21+
- Add constant `screeps::constants::resources::RESOURCES_ALL` (also accessible as
22+
`screeps::RESOURCES_ALL`) that contains every resource type
23+
- Add function `StoreObject::resource_types` to get the types of resources that a store can hold
24+
- This can be used with a `StructureObject` as `StoreObject::try_from(structure_object).map(|store| store.resource_types())`
25+
which returns a `Result<&'static [ResourceType], StoreObjectConversionError>`
26+
- Add missing `StoreObject::Reactor` to the `seasonal-season-5` feature.
2127

2228
0.20.1 (2024-01-09)
2329
===================

src/constants.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,10 @@ pub mod observer {
256256
///
257257
/// [`Resource`]: crate::objects::Resource
258258
pub mod resource {
259-
pub use super::{numbers::ENERGY_DECAY, types::ResourceType};
259+
pub use super::{
260+
numbers::ENERGY_DECAY,
261+
types::{ResourceType, RESOURCES_ALL},
262+
};
260263
}
261264

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

src/constants/types.rs

Lines changed: 142 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,146 @@ 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: &[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+
#[cfg(feature = "seasonal-season-2")]
621+
ResourceType::SymbolSin,
622+
#[cfg(feature = "seasonal-season-2")]
623+
ResourceType::SymbolTaw,
624+
#[cfg(feature = "seasonal-season-5")]
625+
ResourceType::Thorium,
626+
];
627+
488628
/// Returned values from [`ResourceType::boost`] representing the effect of
489629
/// boosting a creep with the given resource.
490630
#[derive(Copy, Clone, Debug)]

src/enums.rs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use enum_dispatch::enum_dispatch;
66
use wasm_bindgen::{JsCast, JsValue};
77

8-
use crate::{objects::*, prelude::*};
8+
use crate::{objects::*, prelude::*, ResourceType, RESOURCES_ALL};
99

1010
#[enum_dispatch(Attackable)]
1111
pub enum AttackableObject {
@@ -165,6 +165,8 @@ pub enum ObjectWithPosition {
165165
pub enum StoreObject {
166166
Creep,
167167
PowerCreep,
168+
#[cfg(feature = "seasonal-season-5")]
169+
Reactor,
168170
Ruin,
169171
#[cfg(feature = "seasonal-season-1")]
170172
ScoreCollector,
@@ -186,6 +188,59 @@ pub enum StoreObject {
186188
Tombstone,
187189
}
188190

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+
/// # Example
199+
/// Assuming that `store_object` is a [`StoreObject::StructureExtension`]:
200+
/// ```no_run
201+
/// # use screeps::{ResourceType, StoreObject};
202+
/// # let store_object: StoreObject = todo!();
203+
/// assert_eq!(store_object.resource_types(), &[ResourceType::Energy]);
204+
/// ```
205+
/// To access this property from a [`StructureObject`], use the following
206+
/// conversion:
207+
/// ```no_run
208+
/// # use screeps::{ResourceType, StoreObject, StoreObjectConversionError, StructureObject};
209+
/// # let structure_object: StructureObject = todo!();
210+
/// let ty: Result<&[ResourceType], StoreObjectConversionError> =
211+
/// StoreObject::try_from(structure_object).map(|store_obj| store_obj.resource_types());
212+
/// ```
213+
///
214+
/// Data collected on 2024-02-29 from <https://github.com/screeps/engine/tree/97c9d12385fed686655c13b09f5f2457dd83a2bf>
215+
pub const fn resource_types(&self) -> &'static [ResourceType] {
216+
match self {
217+
StoreObject::Creep(_) => RESOURCES_ALL,
218+
StoreObject::PowerCreep(_) => RESOURCES_ALL,
219+
#[cfg(feature = "seasonal-season-5")]
220+
StoreObject::Reactor(_) => &[ResourceType::Thorium],
221+
StoreObject::Ruin(_) => RESOURCES_ALL,
222+
#[cfg(feature = "seasonal-season-1")]
223+
StoreObject::ScoreCollector(_) => &[ResourceType::Score],
224+
#[cfg(feature = "seasonal-season-1")]
225+
StoreObject::ScoreContainer(_) => &[ResourceType::Score],
226+
StoreObject::StructureContainer(_) => RESOURCES_ALL,
227+
StoreObject::StructureExtension(_) => &[ResourceType::Energy],
228+
StoreObject::StructureFactory(_) => RESOURCES_ALL,
229+
StoreObject::StructureLab(_) => RESOURCES_ALL,
230+
StoreObject::StructureLink(_) => &[ResourceType::Energy],
231+
StoreObject::StructureNuker(_) => &[ResourceType::Energy, ResourceType::Ghodium],
232+
StoreObject::StructurePowerSpawn(_) => &[ResourceType::Energy, ResourceType::Power],
233+
StoreObject::StructureSpawn(_) => &[ResourceType::Energy],
234+
StoreObject::StructureStorage(_) => RESOURCES_ALL,
235+
StoreObject::StructureTerminal(_) => RESOURCES_ALL,
236+
StoreObject::StructureTower(_) => &[ResourceType::Energy],
237+
#[cfg(feature = "seasonal-season-2")]
238+
StoreObject::SymbolContainer(_) => &crate::constants::seasonal::season_2::SYMBOLS,
239+
StoreObject::Tombstone(_) => RESOURCES_ALL,
240+
}
241+
}
242+
}
243+
189244
/// Enum used for converting a [`Structure`] into a typed object of its specific
190245
/// structure type.
191246
#[enum_dispatch(OwnedStructureProperties)]

0 commit comments

Comments
 (0)