Skip to main content

tengu_api/state/
dojo.rs

1use super::DojosAccount;
2use solana_program::program_error::ProgramError;
3use steel::*;
4
5#[repr(C)]
6#[derive(Clone, Copy, Debug, PartialEq, bytemuck::Pod, bytemuck::Zeroable)]
7pub struct Dojo {
8    pub owner: Pubkey,
9    pub barracks_level: u64,
10    pub forge_level: u64,
11    /// Missions started (for claim_mission_task_reward tiers).
12    pub missions_count: u64,
13    pub shard_balance: u64, // In-game shards (raw $DOJO when claimed). Refine: Ore → shards.
14    pub last_ore_claim_slot: u64,
15    pub referrer: Pubkey, // Referrer's Dojo PDA (who referred this player)
16    pub recruitment_ticket_balance: u64,
17    pub recruited_count: u64,
18    pub dine_count: u64,
19    /// Pity counter: pulls since last SR+. At 10, next pull is forced SR+. Resets on SR+.
20    pub pity_counter: u64,
21    /// Last daily reset slot (Solana slot). Used for flash_sale reset.
22    pub last_daily_reset_slot: u64,
23    pub flash_sale_count_today: u64,
24    pub last_flash_sale_reset_slot: u64,
25    pub amethyst_balance: u64,
26    pub active_scene_id: u64,
27    /// Fodder counts by element×5+rarity (0–24). Recruit adds; seat/merge/prestige consume.
28    pub fodder_counts: [u64; 25],
29}
30
31account!(DojosAccount, Dojo);
32
33impl Dojo {
34    pub fn assert_owner(&self, signer: &Pubkey) -> Result<(), ProgramError> {
35        if self.owner != *signer {
36            return Err(ProgramError::IllegalOwner);
37        }
38        Ok(())
39    }
40
41    pub fn barracks_upgrade_cost_shards(&self) -> u64 {
42        match self.barracks_level {
43            1 => crate::consts::BARRACKS_COST_1_2_SHARDS,
44            2 => crate::consts::BARRACKS_COST_2_3_SHARDS,
45            3 => crate::consts::BARRACKS_COST_3_4,
46            _ => u64::MAX,
47        }
48    }
49    pub fn barracks_upgrade_cost_sol(&self) -> u64 {
50        match self.barracks_level {
51            1 => crate::consts::BARRACKS_COST_1_2_SOL,
52            2 => crate::consts::BARRACKS_COST_2_3_SOL,
53            3 => u64::MAX, // 3→4 shards only
54            _ => u64::MAX,
55        }
56    }
57
58    pub fn add_amethyst(&mut self, amount: u64) {
59        self.amethyst_balance = self.amethyst_balance.saturating_add(amount);
60    }
61
62    pub fn sub_amethyst(&mut self, amount: u64) -> Result<(), ProgramError> {
63        if self.amethyst_balance < amount {
64            return Err(ProgramError::InsufficientFunds);
65        }
66        self.amethyst_balance -= amount;
67        Ok(())
68    }
69}