Skip to main content

tengu_api/state/
barracks.rs

1use super::{shogun::BARRACKS_SLOT_EMPTY, DojosAccount};
2use steel::*;
3
4/// Pack (rarity, element, level, prestige) into u64. BARRACKS_SLOT_EMPTY = u64::MAX.
5#[inline]
6pub fn pack_slot(rarity: u64, element: u64, level: u64, prestige: u64) -> u64 {
7    (rarity & 0xFF)
8        | ((element & 0xFF) << 8)
9        | ((level.min(0xFFFF) & 0xFFFF) << 16)
10        | ((prestige.min(0xFF) & 0xFF) << 32)
11}
12
13#[inline]
14pub fn unpack_slot(v: u64) -> (u64, u64, u64, u64) {
15    (
16        v & 0xFF,
17        (v >> 8) & 0xFF,
18        (v >> 16) & 0xFFFF,
19        (v >> 32) & 0xFF,
20    )
21}
22
23/// Ore-relevant cache per slot. Updated by seat/replace/dine/level_up; read by claim_shards.
24#[repr(C)]
25#[derive(Clone, Copy, Debug, PartialEq, Default, bytemuck::Pod, bytemuck::Zeroable)]
26pub struct SlotCache {
27    pub spirit_power: u64,
28    pub chakra_remaining: u64,
29    pub last_used_slot: u64,
30}
31
32#[repr(C)]
33#[derive(Clone, Copy, Debug, PartialEq, bytemuck::Pod, bytemuck::Zeroable)]
34pub struct Barracks {
35    pub dojo: Pubkey,
36    pub level: u64, // 1-4
37    /// Packed: rarity|element|level|prestige. BARRACKS_SLOT_EMPTY = empty.
38    pub slots: [u64; 12],
39    /// Ore-relevant state per slot. Kept in sync by seat/replace/dine/level_up.
40    pub slot_cache: [SlotCache; 12],
41}
42
43account!(DojosAccount, Barracks);
44
45impl Barracks {
46    pub fn max_slots(&self) -> u64 {
47        self.level * crate::consts::SLOTS_PER_LEVEL
48    }
49
50    pub fn is_slot_valid(&self, slot: u64) -> bool {
51        slot < self.max_slots()
52    }
53
54    pub fn is_slot_empty(&self, i: usize) -> bool {
55        self.slots[i] == BARRACKS_SLOT_EMPTY
56    }
57}