aboutsummaryrefslogtreecommitdiff
path: root/server/src/benchmark.rs
blob: 216cf0a8263bc8cbf99feebedc2d44adbd6f04d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
    Hurry Curry! - a game about cooking
    Copyright (C) 2025 Hurry Curry! Contributors

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, version 3 of the License only.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

*/

use crate::{
    entity::bot::BotDriver,
    server::{Server, ServerConfig},
};
use anyhow::Result;
use hurrycurry_bot::algos::Simple;
use hurrycurry_data::build_gamedata;
use hurrycurry_protocol::{Character, PacketC, PlayerClass};
use log::debug;
use std::{path::PathBuf, time::Instant};
use tokio::sync::broadcast;

pub fn benchmark(data_path: PathBuf) -> Result<()> {
    let mut server = Server::new(
        ServerConfig {
            data_path,
            ..Default::default()
        },
        broadcast::channel(1024).0,
    )?;

    server.load(build_gamedata(&server.config.data_path, "junior", true)?, None);

    server.entities.push(Box::new(BotDriver::new(
        "player".to_string(),
        Character::default(),
        PlayerClass::Chef,
        |p| Box::new(Simple::new(p)),
    )));

    let start = Instant::now();
    let mut packets = 0;
    let mut packets_movement = 0;
    loop {
        if server.tick(1. / 50.).is_some() {
            break;
        }
        while let Some(p) = server.packet_out.pop_front() {
            packets += 1;
            if let PacketC::Movement { .. } = &p {
                packets_movement += 1;
            }
        }
    }

    debug!("points: {}", server.game.score.points);
    println!("simulation took {:?}", start.elapsed());
    println!(
        "packets broadcast: {packets} ({packets_movement} movement, {} other)",
        packets - packets_movement
    );

    Ok(())
}