forgot to add room.rs
This commit is contained in:
parent
3fd89664d7
commit
a2b86f2996
148
src/ship/room.rs
Normal file
148
src/ship/room.rs
Normal file
@ -0,0 +1,148 @@
|
||||
use std::convert::{From, Into, TryFrom, TryInto};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum RoomCreationError {
|
||||
InvalidMode,
|
||||
InvalidEpisode(u8),
|
||||
InvalidDifficulty(u8),
|
||||
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Episode {
|
||||
One,
|
||||
Two,
|
||||
Four,
|
||||
}
|
||||
|
||||
impl TryFrom<u8> for Episode {
|
||||
type Error = RoomCreationError;
|
||||
|
||||
fn try_from(value: u8) -> Result<Episode, RoomCreationError> {
|
||||
match value {
|
||||
0 => Ok(Episode::One),
|
||||
1 => Ok(Episode::Two),
|
||||
2 => Ok(Episode::Four),
|
||||
_ => Err(RoomCreationError::InvalidEpisode(value))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<u8> for Episode {
|
||||
fn into(self) -> u8 {
|
||||
match self {
|
||||
Episode::One => 1,
|
||||
Episode::Two => 2,
|
||||
Episode::Four => 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Difficulty {
|
||||
Normal,
|
||||
Hard,
|
||||
VeryHard,
|
||||
Ultimate,
|
||||
}
|
||||
|
||||
impl TryFrom<u8> for Difficulty {
|
||||
type Error = RoomCreationError;
|
||||
|
||||
fn try_from(value: u8) -> Result<Difficulty, RoomCreationError> {
|
||||
match value {
|
||||
0 => Ok(Difficulty::Normal),
|
||||
1 => Ok(Difficulty::Hard),
|
||||
2 => Ok(Difficulty::VeryHard),
|
||||
3 => Ok(Difficulty::Ultimate),
|
||||
_ => Err(RoomCreationError::InvalidDifficulty(value))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<u8> for Difficulty {
|
||||
fn into(self) -> u8 {
|
||||
match self {
|
||||
Difficulty::Normal => 0,
|
||||
Difficulty::Hard => 1,
|
||||
Difficulty::VeryHard => 2,
|
||||
Difficulty::Ultimate => 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum RoomMode {
|
||||
Single {
|
||||
episode: Episode,
|
||||
difficulty: Difficulty,
|
||||
},
|
||||
Multi {
|
||||
episode: Episode,
|
||||
difficulty: Difficulty,
|
||||
},
|
||||
Challenge {
|
||||
episode: Episode,
|
||||
},
|
||||
Battle {
|
||||
episode: Episode,
|
||||
difficulty: Difficulty,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RoomState {
|
||||
mode: RoomMode,
|
||||
name: [u16; 16],
|
||||
password: [u16; 16],
|
||||
pub maps: [u32; 0x20],
|
||||
// drop_table
|
||||
// items on ground
|
||||
// enemy info
|
||||
}
|
||||
|
||||
impl RoomState {
|
||||
/*fn new(mode: RoomMode) -> Room {
|
||||
Room {
|
||||
mode: mode,
|
||||
}
|
||||
}*/
|
||||
|
||||
pub fn from_create_room(create_room: &libpso::packet::ship::CreateRoom) -> Result<RoomState, RoomCreationError> {
|
||||
if [create_room.battle, create_room.challenge, create_room.single_player].iter().sum::<u8>() > 1 {
|
||||
return Err(RoomCreationError::InvalidMode)
|
||||
}
|
||||
|
||||
let room_mode = if create_room.battle == 1 {
|
||||
RoomMode::Battle {
|
||||
episode: create_room.episode.try_into()?,
|
||||
difficulty: create_room.difficulty.try_into()?,
|
||||
}
|
||||
}
|
||||
else if create_room.challenge == 1 {
|
||||
RoomMode::Challenge {
|
||||
episode: create_room.episode.try_into()?,
|
||||
}
|
||||
}
|
||||
else if create_room.single_player == 1 {
|
||||
RoomMode::Single {
|
||||
episode: create_room.episode.try_into()?,
|
||||
difficulty: create_room.difficulty.try_into()?,
|
||||
}
|
||||
}
|
||||
else { // normal multimode
|
||||
RoomMode::Multi {
|
||||
episode: create_room.episode.try_into()?,
|
||||
difficulty: create_room.difficulty.try_into()?,
|
||||
}
|
||||
};
|
||||
|
||||
Ok(RoomState {
|
||||
mode: room_mode,
|
||||
name: create_room.name,
|
||||
password: create_room.password,
|
||||
maps: [0; 0x20],
|
||||
})
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user