This commit is contained in:
parent
108aeaa49d
commit
3a163fd6e7
@ -19,7 +19,7 @@ nursery = "warn"
|
|||||||
# server
|
# server
|
||||||
tokio = { version = "1.43", features = ["net", "macros", "rt-multi-thread"] }
|
tokio = { version = "1.43", features = ["net", "macros", "rt-multi-thread"] }
|
||||||
axum = { version = "0.8", features = ["http2", "multipart", "ws"] }
|
axum = { version = "0.8", features = ["http2", "multipart", "ws"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive", "rc"] }
|
||||||
|
|
||||||
# logging
|
# logging
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
use std::sync::atomic::{AtomicU32, Ordering};
|
use std::sync::{
|
||||||
|
atomic::{AtomicU32, Ordering},
|
||||||
|
Arc,
|
||||||
|
};
|
||||||
|
|
||||||
use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
|
use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
|
||||||
|
|
||||||
@ -9,7 +12,7 @@ use battlesnake::types::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
fn create_start_snake(coord: Coord) -> Battlesnake {
|
fn create_start_snake(coord: Coord) -> Battlesnake {
|
||||||
let id = format!("{coord:?}");
|
let id: Arc<str> = format!("{coord:?}").into();
|
||||||
Battlesnake {
|
Battlesnake {
|
||||||
id: id.clone(),
|
id: id.clone(),
|
||||||
name: id.clone(),
|
name: id.clone(),
|
||||||
@ -18,7 +21,7 @@ fn create_start_snake(coord: Coord) -> Battlesnake {
|
|||||||
latency: "0".into(),
|
latency: "0".into(),
|
||||||
head: coord,
|
head: coord,
|
||||||
length: 3,
|
length: 3,
|
||||||
shout: String::new(),
|
shout: None,
|
||||||
squad: id,
|
squad: id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ use std::{
|
|||||||
fmt::Display,
|
fmt::Display,
|
||||||
num::NonZeroUsize,
|
num::NonZeroUsize,
|
||||||
ops::{Deref, DerefMut},
|
ops::{Deref, DerefMut},
|
||||||
|
sync::Arc,
|
||||||
};
|
};
|
||||||
|
|
||||||
use bitvec::prelude::*;
|
use bitvec::prelude::*;
|
||||||
@ -70,6 +71,7 @@ pub struct Board {
|
|||||||
free: SmallBitBox,
|
free: SmallBitBox,
|
||||||
snakes: Vec<Snake>,
|
snakes: Vec<Snake>,
|
||||||
constrictor: bool,
|
constrictor: bool,
|
||||||
|
id_map: Arc<[(u8, Arc<str>)]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&Request> for Board {
|
impl From<&Request> for Board {
|
||||||
@ -77,6 +79,18 @@ impl From<&Request> for Board {
|
|||||||
let width = value.board.width;
|
let width = value.board.width;
|
||||||
let height = value.board.height;
|
let height = value.board.height;
|
||||||
let fields = usize::from(width) * usize::from(height);
|
let fields = usize::from(width) * usize::from(height);
|
||||||
|
let id_map = value
|
||||||
|
.board
|
||||||
|
.snakes
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(|(i, snake)| {
|
||||||
|
u8::try_from(i)
|
||||||
|
.inspect_err(|e| warn!("unable to convert id to u8: {e}"))
|
||||||
|
.ok()
|
||||||
|
.map(|i| (i, snake.id.clone()))
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
let mut board = Self {
|
let mut board = Self {
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
@ -88,7 +102,8 @@ impl From<&Request> for Board {
|
|||||||
hazard: SmallBitBox::new(false, fields),
|
hazard: SmallBitBox::new(false, fields),
|
||||||
free: SmallBitBox::new(true, fields),
|
free: SmallBitBox::new(true, fields),
|
||||||
snakes: Vec::with_capacity(value.board.snakes.len()),
|
snakes: Vec::with_capacity(value.board.snakes.len()),
|
||||||
constrictor: value.game.ruleset.name == "constrictor",
|
constrictor: &*value.game.ruleset.name == "constrictor",
|
||||||
|
id_map: id_map.into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
for &food in &value.board.food {
|
for &food in &value.board.food {
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::{Coord, Direction};
|
use super::{Coord, Direction};
|
||||||
@ -17,11 +19,11 @@ pub struct Request {
|
|||||||
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
||||||
pub struct Game {
|
pub struct Game {
|
||||||
/// A unique identifier for this Game.
|
/// A unique identifier for this Game.
|
||||||
pub id: String,
|
pub id: Arc<str>,
|
||||||
/// Information about the ruleset being used to run this Game.
|
/// Information about the ruleset being used to run this Game.
|
||||||
pub ruleset: Ruleset,
|
pub ruleset: Ruleset,
|
||||||
/// The name of the map being played on.
|
/// The name of the map being played on.
|
||||||
pub map: String,
|
pub map: Arc<str>,
|
||||||
/// How much time your snake has to respond to requests for this Game.
|
/// How much time your snake has to respond to requests for this Game.
|
||||||
pub timeout: u16,
|
pub timeout: u16,
|
||||||
/// The source of this Game.
|
/// The source of this Game.
|
||||||
@ -31,15 +33,15 @@ pub struct Game {
|
|||||||
/// - arena
|
/// - arena
|
||||||
/// - challenge
|
/// - challenge
|
||||||
/// - custom
|
/// - custom
|
||||||
pub source: String,
|
pub source: Arc<str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
||||||
pub struct Ruleset {
|
pub struct Ruleset {
|
||||||
/// Name of the ruleset being used to run this game.
|
/// Name of the ruleset being used to run this game.
|
||||||
pub name: String,
|
pub name: Arc<str>,
|
||||||
/// The release version of the Rules module used in this game.
|
/// The release version of the Rules module used in this game.
|
||||||
pub version: String,
|
pub version: Arc<str>,
|
||||||
/// A collection of specific settings being used by the current game that control how the rules
|
/// A collection of specific settings being used by the current game that control how the rules
|
||||||
/// are applied.
|
/// are applied.
|
||||||
pub settings: Settings,
|
pub settings: Settings,
|
||||||
@ -84,9 +86,9 @@ pub struct Board {
|
|||||||
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
|
||||||
pub struct Battlesnake {
|
pub struct Battlesnake {
|
||||||
/// Unique identifier for this Battlesnake in the context of the current Game.
|
/// Unique identifier for this Battlesnake in the context of the current Game.
|
||||||
pub id: String,
|
pub id: Arc<str>,
|
||||||
/// Name given to this Battlesnake by its author
|
/// Name given to this Battlesnake by its author
|
||||||
pub name: String,
|
pub name: Arc<str>,
|
||||||
/// Health value of this Battlesnake, between 0 and 100
|
/// Health value of this Battlesnake, between 0 and 100
|
||||||
pub health: u8,
|
pub health: u8,
|
||||||
/// Array of coordinates representing the Battlesnake's location on the game board.
|
/// Array of coordinates representing the Battlesnake's location on the game board.
|
||||||
@ -94,7 +96,7 @@ pub struct Battlesnake {
|
|||||||
pub body: Vec<Coord>,
|
pub body: Vec<Coord>,
|
||||||
/// The previous response time of this Battlesnake, in milliseconds.
|
/// The previous response time of this Battlesnake, in milliseconds.
|
||||||
/// If the Battlesnake timed out and failed to respond, the game timeout will be returned
|
/// If the Battlesnake timed out and failed to respond, the game timeout will be returned
|
||||||
pub latency: String,
|
pub latency: Arc<str>,
|
||||||
/// Coordinates for this Battlesnake's head.
|
/// Coordinates for this Battlesnake's head.
|
||||||
/// Equivalent to the first element of the body array.
|
/// Equivalent to the first element of the body array.
|
||||||
pub head: Coord,
|
pub head: Coord,
|
||||||
@ -102,10 +104,10 @@ pub struct Battlesnake {
|
|||||||
/// Equivalent to the length of the body array.
|
/// Equivalent to the length of the body array.
|
||||||
pub length: u16,
|
pub length: u16,
|
||||||
/// Message shouted by this Battlesnake on the previous turn
|
/// Message shouted by this Battlesnake on the previous turn
|
||||||
pub shout: String,
|
pub shout: Option<Arc<str>>,
|
||||||
/// The squad that the Battlesnake belongs to.
|
/// The squad that the Battlesnake belongs to.
|
||||||
/// Used to identify squad members in Squad Mode games.
|
/// Used to identify squad members in Squad Mode games.
|
||||||
pub squad: String,
|
pub squad: Arc<str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Serialize)]
|
#[derive(Debug, PartialEq, Eq, Clone, Serialize)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user