Skip to content

Commit 428f7e8

Browse files
committed
add RESOURCES_ALL and StoreObject::resource_types
1 parent c9abd31 commit 428f7e8

File tree

4 files changed

+184
-5
lines changed

4 files changed

+184
-5
lines changed

CHANGELOG.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ 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>`
2126

2227
0.20.1 (2024-01-09)
2328
===================

src/constants.rs

+4-1
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

+144-2
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

+30-1
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 {
@@ -186,6 +186,35 @@ pub enum StoreObject {
186186
Tombstone,
187187
}
188188

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

0 commit comments

Comments
 (0)