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 pub ore_balance: u64,
12 pub shard_balance: u64, pub last_ore_claim_slot: u64,
14 pub referrer: Pubkey, pub shogun_count: u64,
16 pub recruitment_ticket_balance: u64,
17 pub recruited_count: u64,
18 pub dine_count: u64,
19 pub pity_counter: u64,
21 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 pub reserved5: u64,
28 pub reserved6: u64,
29 pub reserved7: u64,
30 pub reserved8: u64,
31}
32
33account!(DojosAccount, Dojo);
34
35impl Dojo {
36 pub fn assert_owner(&self, signer: &Pubkey) -> Result<(), ProgramError> {
37 if self.owner != *signer {
38 return Err(ProgramError::IllegalOwner);
39 }
40 Ok(())
41 }
42
43 pub fn barracks_upgrade_cost_shards(&self) -> u64 {
44 match self.barracks_level {
45 1 => crate::consts::BARRACKS_COST_1_2_SHARDS,
46 2 => crate::consts::BARRACKS_COST_2_3_SHARDS,
47 3 => crate::consts::BARRACKS_COST_3_4,
48 _ => u64::MAX,
49 }
50 }
51 pub fn barracks_upgrade_cost_sol(&self) -> u64 {
52 match self.barracks_level {
53 1 => crate::consts::BARRACKS_COST_1_2_SOL,
54 2 => crate::consts::BARRACKS_COST_2_3_SOL,
55 3 => u64::MAX, _ => u64::MAX,
57 }
58 }
59
60 pub fn add_amethyst(&mut self, amount: u64) {
61 self.amethyst_balance = self.amethyst_balance.saturating_add(amount);
62 }
63
64 pub fn sub_amethyst(&mut self, amount: u64) -> Result<(), ProgramError> {
65 if self.amethyst_balance < amount {
66 return Err(ProgramError::InsufficientFunds);
67 }
68 self.amethyst_balance -= amount;
69 Ok(())
70 }
71}