Skip to main content

curseofrust_msg/
client.rs

1use 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                // This make sure that the (x, y) indexes are valid for the data message.
36                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}