pub struct StoneInventory {
pub trigger_stones: Vec<Stone>,
pub effect_stones: Vec<Stone>,
}Expand description
Everything a character owns in the stone system: the two collections, kept apart, plus the socket assignments carried by the stones themselves.
Fields§
§trigger_stones: Vec<Stone>§effect_stones: Vec<Stone>Implementations§
Source§impl StoneInventory
impl StoneInventory
pub fn collection(&self, kind: StoneKind) -> &Vec<Stone>
pub fn collection_mut(&mut self, kind: StoneKind) -> &mut Vec<Stone>
pub fn all(&self) -> impl Iterator<Item = (StoneKind, &Stone)>
Sourcepub fn kind_of(&self, template_id: StoneTemplateId) -> Option<StoneKind>
pub fn kind_of(&self, template_id: StoneTemplateId) -> Option<StoneKind>
Which collection holds template_id, if any. The lookup runs across
both collections precisely so a caller cannot address a Trigger Stone as
if it were an Effect Stone; the two catalogs share no template id, so
the answer is unambiguous.
pub fn get(&self, template_id: StoneTemplateId) -> Option<&Stone>
Sourcepub fn grant(
&mut self,
kind: StoneKind,
template_id: StoneTemplateId,
tier: StoneTier,
)
pub fn grant( &mut self, kind: StoneKind, template_id: StoneTemplateId, tier: StoneTier, )
Banks one raw copy of template_id in kind’s collection.
The first copy becomes the instance (level 1, nothing banked); every
later one increments Stone::copies. This is the only way a stone
enters the inventory, which is what keeps “one instance per template”
an invariant rather than a convention — a second row for a template the
player already owns is unreachable.
Sourcepub fn socketed(&self, key: StoneSocketKey) -> Option<&Stone>
pub fn socketed(&self, key: StoneSocketKey) -> Option<&Stone>
The stone currently sitting in key, if any.
Sourcepub fn insert(
&mut self,
template_id: StoneTemplateId,
key: StoneSocketKey,
unlocked: bool,
) -> Result<(), StoneError>
pub fn insert( &mut self, template_id: StoneTemplateId, key: StoneSocketKey, unlocked: bool, ) -> Result<(), StoneError>
Inserts the player’s instance of template_id into a socket.
unlocked decides whether the socket is available yet — the schedule
itself lives in config, so this type stays free of chapter arithmetic.
A template has exactly one instance, so socketing it twice is refused
with StoneError::AlreadySocketed. An occupied socket is swapped, not
refused: the sitting stone returns whole to the collection.
Stones may be changed at any time, including mid-fight, so there is no combat gate here or in the callers.
Sourcepub fn remove(
&mut self,
template_id: StoneTemplateId,
) -> Result<StoneSocketKey, StoneError>
pub fn remove( &mut self, template_id: StoneTemplateId, ) -> Result<StoneSocketKey, StoneError>
Clears a stone’s socket. The stone is not moved, copied or re-created — it was in its collection all along — so nothing about it can be lost. Returns the socket it was freed from.
Sourcepub fn quick_equip(
&mut self,
item_type: ItemType,
is_unlocked: &dyn Fn(StoneSocketSlot) -> bool,
catalog_order: &dyn Fn(StoneKind) -> Vec<StoneTemplateId>,
) -> Vec<(StoneSocketSlot, StoneTemplateId)>
pub fn quick_equip( &mut self, item_type: ItemType, is_unlocked: &dyn Fn(StoneSocketSlot) -> bool, catalog_order: &dyn Fn(StoneKind) -> Vec<StoneTemplateId>, ) -> Vec<(StoneSocketSlot, StoneTemplateId)>
Fills every open and empty socket of item_type with the best stone
the player is not already wearing, and returns the sockets it filled.
The caller supplies is_unlocked because the unlock schedule lives in
config and this type stays free of chapter arithmetic.
Locked sockets are skipped and occupied ones are left alone — quick
equip fills gaps, it does not re-shuffle a build. Only unsocketed stones
are candidates, so quick-equipping one item never strips another, and
the pool comes from StoneSocketSlot::accepts, which makes a
wrong-collection pick inexpressible. An empty pool leaves the socket
empty and is not an error.
Only EMPTY open sockets are filled, each with the BEST usable stone the
player owns loose: highest Stone::quality — tier first, then level.
catalog_order is the canonical catalog sequence, pre-filtered to active
templates by the caller; it decides which templates are eligible at all
and breaks ties between two stones of identical quality, so the pick is
deterministic. An instance already socketed elsewhere is never taken.
Sourcepub fn upgrade_all(
&mut self,
kind: StoneKind,
max_level: i64,
cost: &dyn Fn(i64) -> Option<i64>,
) -> Vec<(StoneTemplateId, i64, i64)>
pub fn upgrade_all( &mut self, kind: StoneKind, max_level: i64, cost: &dyn Fn(i64) -> Option<i64>, ) -> Vec<(StoneTemplateId, i64, i64)>
Raises every stone of kind as far as its banked copies reach, and
returns (template, level before, level after) for each stone that moved.
This is the whole of UpgradeAllTriggerStones /
UpgradeAllEffectStones (design v0.2 §9). cost is the ladder rung for
a level (None past the cap), supplied by the caller for the same reason
as quick_equip’s is_unlocked.
One catalog per call: the screen’s button raises the tab the player is looking at, so a Trigger upgrade must not quietly spend the copies banked against Effect stones.
One stone is taken up as many levels as it can afford in one call — the ladder is cheap at the bottom, so a fresh pile of copies is often worth several levels and stopping after one would make the button lie. Socketed and loose stones are treated identically: an upgrade never touches the socket.
Sourcepub fn upgrade(
&mut self,
template_id: StoneTemplateId,
required: i64,
max_level: i64,
) -> Result<i64, StoneError>
pub fn upgrade( &mut self, template_id: StoneTemplateId, required: i64, max_level: i64, ) -> Result<i64, StoneError>
Spends required banked copies to take template_id up one level.
required is the rung of the config ladder for the level being bought
(StonesSettings::upgrade_copies_required) — the cost is per level and
this type never guesses it.
Copies are a count, so a copy earned at level 1 pays for level 4 like
any other. Only level and copies move, leaving template_id, tier
and socket untouched, so a socketed stone upgrades in place. Every
refusal returns before the first mutation, so a short bank is left
exactly as it was.
Trait Implementations§
Source§impl Clone for StoneInventory
impl Clone for StoneInventory
Source§fn clone(&self) -> StoneInventory
fn clone(&self) -> StoneInventory
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for StoneInventory
impl Debug for StoneInventory
Source§impl Default for StoneInventory
impl Default for StoneInventory
Source§fn default() -> StoneInventory
fn default() -> StoneInventory
Source§impl<'de> Deserialize<'de> for StoneInventory
impl<'de> Deserialize<'de> for StoneInventory
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl From<StoneInventory> for JsValuewhere
StoneInventory: Serialize,
impl From<StoneInventory> for JsValuewhere
StoneInventory: Serialize,
Source§fn from(value: StoneInventory) -> Self
fn from(value: StoneInventory) -> Self
Source§impl FromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
impl FromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
Source§impl IntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
impl IntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
Source§impl JsonSchema for StoneInventory
impl JsonSchema for StoneInventory
Source§fn schema_name() -> String
fn schema_name() -> String
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
§fn is_referenceable() -> bool
fn is_referenceable() -> bool
$ref keyword. Read moreSource§impl OptionFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
impl OptionFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
Source§impl OptionIntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
impl OptionIntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
Source§impl PartialEq for StoneInventory
impl PartialEq for StoneInventory
Source§impl RefFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
impl RefFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
Source§type Abi = <JsType as RefFromWasmAbi>::Abi
type Abi = <JsType as RefFromWasmAbi>::Abi
Self are recovered from.Source§type Anchor = SelfOwner<StoneInventory>
type Anchor = SelfOwner<StoneInventory>
Self for the duration of the
invocation of the function that has an &Self parameter. This is
required to ensure that the lifetimes don’t persist beyond one function
call, and so that they remain anonymous.Source§impl Serialize for StoneInventory
impl Serialize for StoneInventory
Source§impl Tsify for StoneInventory
impl Tsify for StoneInventory
const DECL: &'static str = "/**\n * Everything a character owns in the stone system: the two collections, kept\n * apart, plus the socket assignments carried by the stones themselves.\n */\nexport interface StoneInventory {\n trigger_stones: Stone[];\n effect_stones: Stone[];\n}"
const SERIALIZATION_CONFIG: SerializationConfig
type JsType = JsType
fn into_js(&self) -> Result<Self::JsType, Error>where
Self: Serialize,
fn from_js<T>(js: T) -> Result<Self, Error>
Source§impl VectorFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
impl VectorFromWasmAbi for StoneInventorywhere
Self: DeserializeOwned,
type Abi = <JsType as VectorFromWasmAbi>::Abi
unsafe fn vector_from_abi(js: Self::Abi) -> Box<[Self]>
Source§impl VectorIntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
impl VectorIntoWasmAbi for StoneInventorywhere
StoneInventory: Serialize,
type Abi = <JsType as VectorIntoWasmAbi>::Abi
fn vector_into_abi(vector: Box<[Self]>) -> Self::Abi
Source§impl WasmDescribeVector for StoneInventory
impl WasmDescribeVector for StoneInventory
impl Eq for StoneInventory
impl StructuralPartialEq for StoneInventory
Auto Trait Implementations§
impl Freeze for StoneInventory
impl RefUnwindSafe for StoneInventory
impl Send for StoneInventory
impl Sync for StoneInventory
impl Unpin for StoneInventory
impl UnwindSafe for StoneInventory
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> ReturnWasmAbi for Twhere
T: IntoWasmAbi,
impl<T> ReturnWasmAbi for Twhere
T: IntoWasmAbi,
Source§type Abi = <T as IntoWasmAbi>::Abi
type Abi = <T as IntoWasmAbi>::Abi
IntoWasmAbi::AbiSource§fn return_abi(self) -> <T as ReturnWasmAbi>::Abi
fn return_abi(self) -> <T as ReturnWasmAbi>::Abi
IntoWasmAbi::into_abi, except that it may throw and never
return in the case of Err.