basic srank structs and functions
This commit is contained in:
		
							parent
							
								
									47071c0d6f
								
							
						
					
					
						commit
						5ba9908b50
					
				
							
								
								
									
										221
									
								
								src/entity/item/esweapon.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								src/entity/item/esweapon.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,221 @@
 | 
				
			|||||||
 | 
					// TODO: actually use this
 | 
				
			||||||
 | 
					pub enum SrankError {
 | 
				
			||||||
 | 
					    InvalidSrankType,
 | 
				
			||||||
 | 
					    InvalidSrankSpecial,
 | 
				
			||||||
 | 
					    InvalidSrankName,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub enum SrankType {
 | 
				
			||||||
 | 
					    Saber = 0,
 | 
				
			||||||
 | 
					    Sword,
 | 
				
			||||||
 | 
					    Blade,
 | 
				
			||||||
 | 
					    Partisan,
 | 
				
			||||||
 | 
					    Slicer,
 | 
				
			||||||
 | 
					    Gun,
 | 
				
			||||||
 | 
					    Rifle,
 | 
				
			||||||
 | 
					    Mechgun,
 | 
				
			||||||
 | 
					    Shot,
 | 
				
			||||||
 | 
					    Can,
 | 
				
			||||||
 | 
					    Rod,
 | 
				
			||||||
 | 
					    Wand,
 | 
				
			||||||
 | 
					    Twin,
 | 
				
			||||||
 | 
					    Claw,
 | 
				
			||||||
 | 
					    Bazooka,
 | 
				
			||||||
 | 
					    Needle,
 | 
				
			||||||
 | 
					    Scythe,
 | 
				
			||||||
 | 
					    Hammer,
 | 
				
			||||||
 | 
					    Moon,
 | 
				
			||||||
 | 
					    Psychogun,
 | 
				
			||||||
 | 
					    Punch,
 | 
				
			||||||
 | 
					    Windmill,
 | 
				
			||||||
 | 
					    Harisen,
 | 
				
			||||||
 | 
					    Katana,
 | 
				
			||||||
 | 
					    JCutter,
 | 
				
			||||||
 | 
					    Swords,
 | 
				
			||||||
 | 
					    Launcher,
 | 
				
			||||||
 | 
					    Cards,
 | 
				
			||||||
 | 
					    Knuckle,
 | 
				
			||||||
 | 
					    Axe,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl SrankType {
 | 
				
			||||||
 | 
					    pub fn to_value(&self) -> u8 {
 | 
				
			||||||
 | 
					        *self as u8
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_value(value: u8) -> Result<SrankType, SRankError>  {
 | 
				
			||||||
 | 
					        match value {
 | 
				
			||||||
 | 
					            0 => Ok(SrankType::Saber),
 | 
				
			||||||
 | 
					            1 => Ok(SrankType::Sword),
 | 
				
			||||||
 | 
					            2 => Ok(SrankType::Blade),
 | 
				
			||||||
 | 
					            3 => Ok(SrankType::Partisan),
 | 
				
			||||||
 | 
					            4 => Ok(SrankType::Slicer),
 | 
				
			||||||
 | 
					            5 => Ok(SrankType::Gun),
 | 
				
			||||||
 | 
					            6 => Ok(SrankType::Rifle),
 | 
				
			||||||
 | 
					            7 => Ok(SrankType::Mechgun),
 | 
				
			||||||
 | 
					            8 => Ok(SrankType::Shot),
 | 
				
			||||||
 | 
					            9 => Ok(SrankType::Can),
 | 
				
			||||||
 | 
					            10 => Ok(SrankType::Rod),
 | 
				
			||||||
 | 
					            11 => Ok(SrankType::Wand),
 | 
				
			||||||
 | 
					            12 => Ok(SrankType::Twin),
 | 
				
			||||||
 | 
					            13 => Ok(SrankType::Claw),
 | 
				
			||||||
 | 
					            14 => Ok(SrankType::Bazooka),
 | 
				
			||||||
 | 
					            15 => Ok(SrankType::Needle),
 | 
				
			||||||
 | 
					            16 => Ok(SrankType::Scythe),
 | 
				
			||||||
 | 
					            17 => Ok(SrankType::Hammer),
 | 
				
			||||||
 | 
					            18 => Ok(SrankType::Moon),
 | 
				
			||||||
 | 
					            19 => Ok(SrankType::Psychogun),
 | 
				
			||||||
 | 
					            20 => Ok(SrankType::Punch),
 | 
				
			||||||
 | 
					            21 => Ok(SrankType::Windmill),
 | 
				
			||||||
 | 
					            22 => Ok(SrankType::Harisen),
 | 
				
			||||||
 | 
					            23 => Ok(SrankType::Katana),
 | 
				
			||||||
 | 
					            24 => Ok(SrankType::JCutter),
 | 
				
			||||||
 | 
					            25 => Ok(SrankType::Swords),
 | 
				
			||||||
 | 
					            26 => Ok(SrankType::Launcher),
 | 
				
			||||||
 | 
					            27 => Ok(SrankType::Cards),
 | 
				
			||||||
 | 
					            28 => Ok(SrankType::Knuckle),
 | 
				
			||||||
 | 
					            29 => Ok(SrankType::Axe),
 | 
				
			||||||
 | 
					            _ => Err(SrankError::InvalidSrankype),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub enum SrankSpecial {
 | 
				
			||||||
 | 
					    Jellen = 0,
 | 
				
			||||||
 | 
					    Zalure,
 | 
				
			||||||
 | 
					    HPRegen,
 | 
				
			||||||
 | 
					    TPRegen,
 | 
				
			||||||
 | 
					    Burning,
 | 
				
			||||||
 | 
					    Tempest,
 | 
				
			||||||
 | 
					    Blizzard,
 | 
				
			||||||
 | 
					    Arrest,
 | 
				
			||||||
 | 
					    Chaos,
 | 
				
			||||||
 | 
					    Hell,
 | 
				
			||||||
 | 
					    Spirit,
 | 
				
			||||||
 | 
					    Berserk,
 | 
				
			||||||
 | 
					    Demons,
 | 
				
			||||||
 | 
					    Gush,
 | 
				
			||||||
 | 
					    Geist,
 | 
				
			||||||
 | 
					    Kings,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl SrankSpecial {
 | 
				
			||||||
 | 
					    pub fn to_value(&self) -> u8 {
 | 
				
			||||||
 | 
					        *self as u8
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_value(value: u8) -> Result<SrankSpecial, SrankError> {
 | 
				
			||||||
 | 
					        match value{
 | 
				
			||||||
 | 
					            0 => Ok(SrankSpecial::Jellen),
 | 
				
			||||||
 | 
					            1 => Ok(SrankSpecial::Zalure),
 | 
				
			||||||
 | 
					            2 => Ok(SrankSpecial::HPRegen),
 | 
				
			||||||
 | 
					            3 => Ok(SrankSpecial::TPRegen),
 | 
				
			||||||
 | 
					            4 => Ok(SrankSpecial::Burning),
 | 
				
			||||||
 | 
					            5 => Ok(SrankSpecial::Tempest),
 | 
				
			||||||
 | 
					            6 => Ok(SrankSpecial::Blizzard),
 | 
				
			||||||
 | 
					            7 => Ok(SrankSpecial::Arrest),
 | 
				
			||||||
 | 
					            8 => Ok(SrankSpecial::Chaos),
 | 
				
			||||||
 | 
					            9 => Ok(SrankSpecial::Hell),
 | 
				
			||||||
 | 
					            10 => Ok(SrankSpecial::Spirit),
 | 
				
			||||||
 | 
					            11 => Ok(SrankSpecial::Berserk),
 | 
				
			||||||
 | 
					            12 => Ok(SrankSpecial::Demons),
 | 
				
			||||||
 | 
					            13 => Ok(SrankSpecial::Gush),
 | 
				
			||||||
 | 
					            14 => Ok(SrankSpecial::Geist),
 | 
				
			||||||
 | 
					            15 => Ok(SrankSpecial::Kings),
 | 
				
			||||||
 | 
					            _ => Err(SrankError::InvalidSrankSpecial),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct SRankWeapon {
 | 
				
			||||||
 | 
					    pub type: SrankType,
 | 
				
			||||||
 | 
					    pub special: Option<SrankSpecial>,
 | 
				
			||||||
 | 
					    pub name: String,
 | 
				
			||||||
 | 
					    pub grind: u8,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl SRankWeapon {
 | 
				
			||||||
 | 
					    pub fn new(t: SrankType) -> SRankWeapon {
 | 
				
			||||||
 | 
					        SRankWeapon {
 | 
				
			||||||
 | 
					            type: t,
 | 
				
			||||||
 | 
					            special: None,
 | 
				
			||||||
 | 
					            name: "".to_owned(),
 | 
				
			||||||
 | 
					            grind: 0,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn bytes_from_name(&self) -> [u8; 6] {
 | 
				
			||||||
 | 
					        let mut result = [0u16; 3];
 | 
				
			||||||
 | 
					        let mut letters = [0u8; 8];
 | 
				
			||||||
 | 
					        letters[0..self.name.len()].clone_from_slice(&self.name.to_uppercase().clone().into_bytes());
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for letter in letters.iter_mut() {
 | 
				
			||||||
 | 
					            *letter = *letter & 0x3F;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        result[0] = 0x8000 + (0x20 * letters[0] as u16) + (letters[1] as u16);
 | 
				
			||||||
 | 
					        result[1] = 0x8000 + (0x400 * letters[2] as u16) + (0x20 * letters[3] as u16) + (letters[4] as u16);
 | 
				
			||||||
 | 
					        result[2] = 0x8000 + (0x400 * letters[5] as u16) + (0x20 * letters[6] as u16) + (letters[7] as u16);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        [result[0].to_be_bytes()[0], result[0].to_be_bytes()[1],
 | 
				
			||||||
 | 
					        result[1].to_be_bytes()[0], result[1].to_be_bytes()[1],
 | 
				
			||||||
 | 
					        result[2].to_be_bytes()[0], result[2].to_be_bytes()[1]]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: error handling, ensure name is never more than 8
 | 
				
			||||||
 | 
					    pub fn name_from_bytes(namebytes: &[u8]) -> String {
 | 
				
			||||||
 | 
					        let mut name: Vec<u8> = Vec::with_capacity(8);
 | 
				
			||||||
 | 
					        name.extend_from_slice(namebytes);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for _ in name.len()..name.capacity() {
 | 
				
			||||||
 | 
					            name.push(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let buf: [u16; 3] = [
 | 
				
			||||||
 | 
					            u16::from_be_bytes([namebytes[0], namebytes[1]]),
 | 
				
			||||||
 | 
					            u16::from_be_bytes([namebytes[2], namebytes[3]]),
 | 
				
			||||||
 | 
					            u16::from_be_bytes([namebytes[4], namebytes[5]]),
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        name[0] = ((buf[0] - 0x8000) / 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					        name[1] = ((buf[0] - 0x8000) % 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        name[2] = ((buf[1] - 0x8000) / 0x400 + 0x40) as u8;
 | 
				
			||||||
 | 
					        name[3] = (((buf[1] - 0x8000) % 0x400) / 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					        name[4] = (((buf[1] - 0x8000) % 0x400) % 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        name[5] = ((buf[2] - 0x8000) / 0x400 + 0x40) as u8;
 | 
				
			||||||
 | 
					        name[6] = (((buf[2] - 0x8000) % 0x400) / 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					        name[7] = (((buf[2] - 0x8000) % 0x400) % 0x20 + 0x40) as u8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        name.retain(|&x| x > 0x40 && x < 0x5B);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String::from_utf8(name).unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn as_bytes(&self) -> [u8; 16] {
 | 
				
			||||||
 | 
					        let mut result = [0u8; 16];
 | 
				
			||||||
 | 
					        result[1] = 0x70 + self.type.to_value();
 | 
				
			||||||
 | 
					        result[2] = self.special.to_value();
 | 
				
			||||||
 | 
					        result[3] = self.grind;
 | 
				
			||||||
 | 
					        //result[4] = tekked/untekked flag
 | 
				
			||||||
 | 
					        result[6..12].clone_from_slice(self.name.bytes_from_name());
 | 
				
			||||||
 | 
					        result
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: return Result<SRankWeapon, SRankError>
 | 
				
			||||||
 | 
					    pub fn from_bytes(bytes: [u8; 16]) -> SRankWeapon {
 | 
				
			||||||
 | 
					        let type = bytes[1];
 | 
				
			||||||
 | 
					        let special = bytes[2];
 | 
				
			||||||
 | 
					        let grind = bytes[3];
 | 
				
			||||||
 | 
					        let name = SRankWeapon::name_from_bytes(bytes[6..12]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        SRankWeapon {
 | 
				
			||||||
 | 
					            type: type,
 | 
				
			||||||
 | 
					            special: special,
 | 
				
			||||||
 | 
					            grind: grind,
 | 
				
			||||||
 | 
					            name: name,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user