eolib/packet/
sequencer.rs1use std::cmp;
2
3use rand::Rng;
4
5use crate::data::CHAR_MAX;
6
7#[derive(Debug)]
8pub struct Sequencer {
20 start: i32,
21 counter: i32,
22}
23
24impl Sequencer {
25 pub fn new(start: i32) -> Self {
27 Self { start, counter: 0 }
28 }
29
30 pub fn next_sequence(&mut self) -> i32 {
32 self.counter = (self.counter + 1) % 10;
33 self.start + self.counter
34 }
35
36 pub fn set_start(&mut self, start: i32) {
38 self.start = start;
39 }
40
41 pub fn get_start(&self) -> i32 {
43 self.start
44 }
45}
46
47pub fn generate_sequence_start() -> i32 {
49 let mut rng = rand::thread_rng();
50 rng.gen_range(0..=CHAR_MAX - 10)
51}
52
53pub fn get_init_sequence_bytes(start: i32) -> [i32; 2] {
57 let mut rng = rand::thread_rng();
58 let seq1_min = cmp::max(0, (start - (CHAR_MAX - 1) + 13 + 6) / 7);
59 let seq1_max = (start + 13) / 7;
60 let seq1 = rng.gen_range(0..=seq1_max - seq1_min) + seq1_min;
61 let seq2 = start - seq1 * 7 + 13;
62 [seq1, seq2]
63}
64
65pub fn get_init_sequence_start(s1: i32, s2: i32) -> i32 {
69 s1 * 7 + s2 - 13
70}
71
72pub fn get_ping_sequence_bytes(start: i32) -> [i32; 2] {
76 let mut rng = rand::thread_rng();
77 let seq1_max = start + 252;
78 let seq1_min = start;
79 let seq1 = rng.gen_range(seq1_min..=seq1_max);
80 let seq2 = seq1 - start;
81 [seq1, seq2]
82}
83
84pub fn get_ping_sequence_start(s1: i32, s2: i32) -> i32 {
88 s1 - s2
89}