aboutsummaryrefslogtreecommitdiff
path: root/server/bot/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/bot/src')
-rw-r--r--server/bot/src/algos/mod.rs30
-rw-r--r--server/bot/src/algos/simple.rs17
-rw-r--r--server/bot/src/algos/test.rs17
-rw-r--r--server/bot/src/algos/waiter.rs17
-rw-r--r--server/bot/src/lib.rs19
-rw-r--r--server/bot/src/main.rs48
6 files changed, 109 insertions, 39 deletions
diff --git a/server/bot/src/algos/mod.rs b/server/bot/src/algos/mod.rs
index 8b006700..7b165da4 100644
--- a/server/bot/src/algos/mod.rs
+++ b/server/bot/src/algos/mod.rs
@@ -1,8 +1,30 @@
-mod simple;
-pub use simple::Simple;
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
-mod test;
-pub use test::Test;
+ 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/>.
+*/
+mod simple;
+mod test;
mod waiter;
+
+pub use simple::Simple;
+pub use test::Test;
pub use waiter::Waiter;
+
+pub const ALGO_CONSTRUCTORS: &'static [(&'static str, fn() -> Box<dyn crate::BotAlgo>)] = &[
+ ("test", || Box::new(Test::default())),
+ ("simple", || Box::new(Simple::default())),
+ ("waiter", || Box::new(Waiter::default())),
+];
diff --git a/server/bot/src/algos/simple.rs b/server/bot/src/algos/simple.rs
index 1288aaaf..22ed50bd 100644
--- a/server/bot/src/algos/simple.rs
+++ b/server/bot/src/algos/simple.rs
@@ -1,3 +1,20 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ 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::{
pathfinding::{find_path_to_neighbour, Path},
BotAlgo, BotInput,
diff --git a/server/bot/src/algos/test.rs b/server/bot/src/algos/test.rs
index d17b079d..d56aa00b 100644
--- a/server/bot/src/algos/test.rs
+++ b/server/bot/src/algos/test.rs
@@ -1,3 +1,20 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ 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::{
pathfinding::{find_path_to_neighbour, Path},
BotAlgo, BotInput,
diff --git a/server/bot/src/algos/waiter.rs b/server/bot/src/algos/waiter.rs
index 364f26c8..7a25108b 100644
--- a/server/bot/src/algos/waiter.rs
+++ b/server/bot/src/algos/waiter.rs
@@ -1,3 +1,20 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ 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 super::simple::State;
use crate::{algos::simple::Context, pathfinding::Path, BotAlgo, BotInput};
use hurrycurry_client_lib::Game;
diff --git a/server/bot/src/lib.rs b/server/bot/src/lib.rs
new file mode 100644
index 00000000..e8f05fd6
--- /dev/null
+++ b/server/bot/src/lib.rs
@@ -0,0 +1,19 @@
+#![feature(isqrt)]
+pub mod algos;
+pub mod pathfinding;
+
+use hurrycurry_client_lib::Game;
+use hurrycurry_protocol::{
+ glam::{IVec2, Vec2},
+ PlayerID,
+};
+
+#[derive(Default, Clone, Copy)]
+pub struct BotInput {
+ pub direction: Vec2,
+ pub boost: bool,
+ pub interact: Option<IVec2>,
+}
+pub trait BotAlgo {
+ fn tick(&mut self, me: PlayerID, game: &Game, dt: f32) -> BotInput;
+}
diff --git a/server/bot/src/main.rs b/server/bot/src/main.rs
index 1ebe0b88..9e3fbee1 100644
--- a/server/bot/src/main.rs
+++ b/server/bot/src/main.rs
@@ -15,36 +15,26 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#![feature(isqrt)]
-pub mod algos;
-pub mod pathfinding;
-
use anyhow::Result;
+use bot::{algos::ALGO_CONSTRUCTORS, BotAlgo, BotInput};
use clap::Parser;
use hurrycurry_client_lib::{network::sync::Network, Game};
-use hurrycurry_protocol::{
- glam::{IVec2, Vec2},
- PacketC, PacketS, PlayerID,
-};
+use hurrycurry_protocol::{PacketC, PacketS, PlayerID};
use log::warn;
use std::{thread::sleep, time::Duration};
-#[derive(Default, Clone, Copy)]
-pub struct BotInput {
- direction: Vec2,
- boost: bool,
- interact: Option<IVec2>,
-}
-pub trait BotAlgo {
- fn tick(&mut self, me: PlayerID, game: &Game, dt: f32) -> BotInput;
-}
-
#[derive(Parser)]
struct Args {
algo: String,
address: String,
}
+pub struct BotDriver {
+ pub interacting: bool,
+ id: PlayerID,
+ state: Box<dyn BotAlgo>,
+}
+
fn main() -> Result<()> {
env_logger::init_from_env("LOG");
rustls::crypto::ring::default_provider()
@@ -53,16 +43,6 @@ fn main() -> Result<()> {
let args = Args::parse();
- let algo = args.algo.to_owned();
- let init_algo = move || -> Box<dyn BotAlgo> {
- match algo.as_str() {
- "test" => Box::new(algos::Test::default()),
- "simple" => Box::new(algos::Simple::default()),
- "waiter" => Box::new(algos::Waiter::default()),
- _ => panic!("unknown algo {algo:?}"),
- }
- };
-
let mut network = Network::connect(&args.address)?;
let mut game = Game::default();
@@ -84,7 +64,11 @@ fn main() -> Result<()> {
PacketC::Joined { id } => bots.push(BotDriver {
id: *id,
interacting: false,
- state: init_algo(),
+ state: ALGO_CONSTRUCTORS
+ .iter()
+ .find(|(n, _)| n == &args.algo)
+ .map(|(_, c)| c())
+ .expect(&format!("unknown algo {:?}", args.algo)),
}),
PacketC::Error { message } => {
warn!("server error message: {message}");
@@ -118,9 +102,3 @@ fn main() -> Result<()> {
sleep(Duration::from_secs_f32(dt));
}
}
-
-pub struct BotDriver {
- pub interacting: bool,
- id: PlayerID,
- state: Box<dyn BotAlgo>,
-}