curseofrust_msg/
client.rs1use curseofrust::{grid::Tile, state::State, Player};
2
3use crate::{S2CData, TileClass};
4
5pub fn apply_s2c_msg(state: &mut State, data: S2CData) -> curseofrust::Result<()> {
6 if u32::from_be(data.time) as u64 <= state.time {
7 return Err(curseofrust::Error::DeprecatedMsg {
8 time: u32::from_be(data.time),
9 });
10 }
11
12 state.time = u32::from_be(data.time) as u64;
13 for (p1, p2) in state
14 .countries
15 .iter_mut()
16 .map(|c| &mut c.gold)
17 .zip(data.gold)
18 {
19 *p1 = u32::from_be(p2) as u64;
20 }
21 for fg in &mut state.fgs {
22 fg.width = data.width as u32;
23 fg.height = data.height as u32;
24 }
25 state.controlled = Player(data.player as u32);
26 for (x, arr) in state.grid.raw_tiles_mut().iter_mut().enumerate() {
27 for (y, tile) in arr.iter_mut().enumerate() {
28 let Some(target) = data
29 .tile
30 .get(x)
31 .and_then(|a| a.get(y))
32 .copied()
33 .map(TileClass::from)
34 else {
35 continue;
37 };
38 let mut t: Tile = target.into();
39 let owner = data.owner[x][y];
40 t.set_owner(Player(owner as u32));
41 let mut pop = 0;
42 if let Some(unit) = t.units_mut().and_then(|us| us.get_mut(owner as usize)) {
43 *unit = if owner == 0 {
44 0
45 } else {
46 u16::from_be(data.pop[x][y])
47 };
48 pop = *unit;
49 };
50 if let Some(us) = t.units_mut() {
51 us[0] = pop;
52 }
53 *tile = t;
54
55 for (p, fg) in state.fgs.iter_mut().enumerate() {
56 fg.call[x][y] = 0;
57 fg.flags[x][y] = data.flag[x][y] & (1 << p) != 0;
58 }
59 }
60 }
61
62 Ok(())
63}