dzura/server/src/protocol/packet/game_message.rs
2024-10-05 12:57:13 -07:00

129 lines
3.3 KiB
Rust

use crate::{
util::pack::{
pack_u64,
unpack_u64,
},
protocol::*,
};
use super::Packet;
#[derive(Clone, Copy)]
pub enum GameMessageData {
Error,
PlayMove(u16, u8, u8),
PlayDrop(u16, u8, u8),
PlayAlt(u16, u8, u8),
Online(u8, u32),
Undo(u16, u8),
Resign,
Reaction(u16),
}
#[derive(Clone)]
pub struct PacketGameMessage {
pub data:GameMessageData,
}
impl PacketGameMessage {
pub fn new() -> Self
{
Self {
data:GameMessageData::Error,
}
}
}
impl Packet for PacketGameMessage {
type Data = Self;
fn decode(data:&Vec<u8>, index:&mut usize) -> Result<Self::Data, ()>
{
let mut result = Self::new();
if data.len() - *index >= 8 {
let data = unpack_u64(data, index);
result.data = match (data & 0xFF) as u8 {
GMSG_PLAY_MOVE => GameMessageData::PlayMove(
((data >> 8) & 0xFFFF) as u16,
((data >> 24) & 0x3F) as u8,
((data >> 30) & 0x3F) as u8,
),
GMSG_PLAY_DROP => GameMessageData::PlayDrop(
((data >> 8) & 0xFFFF) as u16,
((data >> 24) & 0x3F) as u8,
((data >> 30) & 0x3F) as u8,
),
GMSG_PLAY_ALT => GameMessageData::PlayAlt(
((data >> 8) & 0xFFFF) as u16,
((data >> 24) & 0x3F) as u8,
((data >> 30) & 0x3F) as u8,
),
GMSG_UNDO => GameMessageData::Undo(
((data >> 8) & 0xFFFF) as u16,
((data >> 24) & 0x1) as u8,
),
GMSG_RETIRE => GameMessageData::Resign,
GMSG_REACTION => GameMessageData::Reaction(
((data >> 8) & 0xFFFF) as u16,
),
_ => GameMessageData::Error,
}
}
Ok(result)
}
fn encode(&self) -> Vec<u8>
{
pack_u64(match self.data {
GameMessageData::PlayMove(turn, from, to) => {
GMSG_PLAY_MOVE as u64
| ((turn as u64) << 8)
| ((from as u64) << 24)
| ((to as u64) << 30)
}
GameMessageData::PlayDrop(turn, piece, to) => {
GMSG_PLAY_DROP as u64
| ((turn as u64) << 8)
| ((piece as u64) << 24)
| ((to as u64) << 30)
}
GameMessageData::PlayAlt(turn, from, to) => {
GMSG_PLAY_ALT as u64
| ((turn as u64) << 8)
| ((from as u64) << 24)
| ((to as u64) << 30)
}
GameMessageData::Online(client, state) => {
GMSG_ONLINE as u64
| ((client as u64) << 8)
| ((state as u64) << 10)
}
GameMessageData::Undo(turn, state) => {
GMSG_UNDO as u64
| ((turn as u64) << 8)
| ((state as u64) << 24)
}
GameMessageData::Resign => {
GMSG_RETIRE as u64
}
GameMessageData::Reaction(index) => {
GMSG_REACTION as u64
| ((index as u64) << 8)
}
_ => { 0 }
})
}
}