From b23642d7b735d6a1af45c2c2ea0594beef2a29ef Mon Sep 17 00:00:00 2001 From: Bastien Sevajol Date: Wed, 15 May 2024 20:48:42 +0200 Subject: [PATCH] feat: update textures and adjust fight --- .vscode/launch.json | 282 ++++++++++++++++++ Cargo.lock | 1 + battle_core/src/behavior/mod.rs | 3 +- battle_core/src/config.rs | 12 +- battle_core/src/entity/soldier.rs | 17 ++ battle_core/src/map/terrain.rs | 26 +- battle_core/src/physics/coverage.rs | 29 +- battle_core/src/physics/visibility.rs | 145 +++++++-- battle_core/src/state/battle/mod.rs | 22 +- battle_core/src/state/battle/visibility.rs | 3 +- battle_gui/src/engine/debug/gui/config.rs | 16 +- battle_gui/src/engine/mod.rs | 6 + battle_gui/src/engine/network.rs | 6 + battle_gui/src/graphics/map.rs | 5 +- battle_gui/src/main.rs | 1 + battle_gui/src/run.rs | 3 + battle_gui/src/server/mod.rs | 5 +- battle_server/src/runner/fight/choose.rs | 82 +++-- battle_server/src/runner/gesture/engage.rs | 9 +- battle_server/src/runner/gesture/fire.rs | 47 +-- battle_server/src/runner/gesture/suppress.rs | 2 +- battle_server/src/runner/mod.rs | 6 +- battle_server/src/runner/physics/bullet.rs | 32 +- examples/Cargo.toml | 1 + examples/src/bin/face_to_face1.rs | 8 +- examples/src/bin/face_to_face2.rs | 8 +- examples/src/bin/face_to_face3.rs | 8 +- examples/src/bin/face_to_face_opaque1.rs | 20 ++ examples/src/bin/face_to_face_opaque2.rs | 20 ++ .../face_to_face_with_one_side_brickwall1.rs | 20 ++ .../face_to_face_with_one_side_brickwall2.rs | 20 ++ .../face_to_face_with_one_side_brickwall3.rs | 20 ++ .../bin/running_with_one_side_brickwall1.rs | 41 +++ .../bin/walking_with_one_side_brickwall1.rs | 42 +++ .../bin/walking_with_one_side_brickwall2.rs | 42 +++ .../bin/walking_with_one_side_brickwall3.rs | 46 +++ examples/src/map/flat.rs | 32 +- examples/src/map/generator.rs | 25 +- examples/src/map/mod.rs | 13 +- examples/src/runner.rs | 42 ++- examples/src/scenarios/face_to_face.rs | 54 +++- resources/ui.png | Bin 39494 -> 52609 bytes resources/ui.xcf | Bin 100191 -> 168917 bytes 43 files changed, 1039 insertions(+), 183 deletions(-) create mode 100644 examples/src/bin/face_to_face_opaque1.rs create mode 100644 examples/src/bin/face_to_face_opaque2.rs create mode 100644 examples/src/bin/face_to_face_with_one_side_brickwall1.rs create mode 100644 examples/src/bin/face_to_face_with_one_side_brickwall2.rs create mode 100644 examples/src/bin/face_to_face_with_one_side_brickwall3.rs create mode 100644 examples/src/bin/running_with_one_side_brickwall1.rs create mode 100644 examples/src/bin/walking_with_one_side_brickwall1.rs create mode 100644 examples/src/bin/walking_with_one_side_brickwall2.rs create mode 100644 examples/src/bin/walking_with_one_side_brickwall3.rs diff --git a/.vscode/launch.json b/.vscode/launch.json index 83497e5..532bc93 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -899,6 +899,27 @@ "RUST_BACKTRACE": "1" } }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face1", + "cargo": { + "args": [ + "build", + "--bin=face_to_face1", + "--package=examples", + ], + "filter": { + "name": "face_to_face1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, { "type": "lldb", "request": "launch", @@ -943,5 +964,266 @@ "RUST_BACKTRACE": "1" } }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face_with_one_side_brickwall1 --release", + "cargo": { + "args": [ + "build", + "--bin=face_to_face_with_one_side_brickwall1", + "--package=examples", + "--release" + ], + "filter": { + "name": "face_to_face_with_one_side_brickwall1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face_with_one_side_brickwall2 --release", + "cargo": { + "args": [ + "build", + "--bin=face_to_face_with_one_side_brickwall2", + "--package=examples", + "--release" + ], + "filter": { + "name": "face_to_face_with_one_side_brickwall2", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face_with_one_side_brickwall3 --release", + "cargo": { + "args": [ + "build", + "--bin=face_to_face_with_one_side_brickwall3", + "--package=examples", + "--release" + ], + "filter": { + "name": "face_to_face_with_one_side_brickwall3", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face_opaque1 --release", + "cargo": { + "args": [ + "build", + "--bin=face_to_face_opaque1", + "--package=examples", + "--release" + ], + "filter": { + "name": "face_to_face_opaque1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "face_to_face_opaque2 --release", + "cargo": { + "args": [ + "build", + "--bin=face_to_face_opaque2", + "--package=examples", + "--release" + ], + "filter": { + "name": "face_to_face_opaque2", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "running_with_one_side_brickwall1 --release", + "cargo": { + "args": [ + "build", + "--bin=running_with_one_side_brickwall1", + "--package=examples", + "--release" + ], + "filter": { + "name": "running_with_one_side_brickwall1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall1 --release", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall1", + "--package=examples", + "--release" + ], + "filter": { + "name": "walking_with_one_side_brickwall1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall1", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall1", + "--package=examples", + ], + "filter": { + "name": "walking_with_one_side_brickwall1", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall2 --release", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall2", + "--package=examples", + "--release" + ], + "filter": { + "name": "walking_with_one_side_brickwall2", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall2", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall2", + "--package=examples" + ], + "filter": { + "name": "walking_with_one_side_brickwall2", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall3 --release", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall3", + "--package=examples", + "--release" + ], + "filter": { + "name": "walking_with_one_side_brickwall3", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, + { + "type": "lldb", + "request": "launch", + "name": "walking_with_one_side_brickwall3", + "cargo": { + "args": [ + "build", + "--bin=walking_with_one_side_brickwall3", + "--package=examples" + ], + "filter": { + "name": "walking_with_one_side_brickwall3", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_BACKTRACE": "1" + } + }, ] } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index bced448..2cd2e73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1482,6 +1482,7 @@ dependencies = [ "battle_gui", "battle_server", "battle_tools", + "glam 0.22.0", "oc_core", "thiserror", ] diff --git a/battle_core/src/behavior/mod.rs b/battle_core/src/behavior/mod.rs index dd6b243..ca07f41 100644 --- a/battle_core/src/behavior/mod.rs +++ b/battle_core/src/behavior/mod.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; pub mod feeling; pub mod gesture; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum Body { StandUp, Crouched, @@ -148,6 +148,7 @@ impl Behavior { pub fn posture(&self) -> Posture { // TODO : posture can be different on same behavior (like with SuppressFire, EngageSoldier) + // FIXME: Clarify which usage with `Body` !! match self { Behavior::MoveTo(_) | Behavior::MoveFastTo(_) | Behavior::Idle(_) => Posture::StandUp, Behavior::Defend(_) diff --git a/battle_core/src/config.rs b/battle_core/src/config.rs index 7830f6c..bbf28c7 100644 --- a/battle_core/src/config.rs +++ b/battle_core/src/config.rs @@ -12,6 +12,7 @@ use strum::IntoEnumIterator; pub const DEFAULT_SERVER_REP_ADDRESS: &str = "tcp://0.0.0.0:4255"; pub const DEFAULT_SERVER_PUB_ADDRESS: &str = "tcp://0.0.0.0:4256"; /// +pub const TARGET_CYCLE_DURATION_US: u64 = 16666; pub const TARGET_FPS: u64 = 60; pub const SOLDIER_UPDATE_FREQ: u64 = 1; pub const FLAGS_UPDATE_FREQ: u64 = 120; @@ -41,7 +42,7 @@ pub const VISIBILITY_DEAD_MODIFIER: f32 = 0.0; pub const VISIBILITY_UNCONSCIOUS_MODIFIER: f32 = 0.0; /// pub const TILE_TYPE_OPACITY_SHORT_GRASS: f32 = 0.0; -pub const TILE_TYPE_OPACITY_MIDDLE_GRASS: f32 = 0.008; +pub const TILE_TYPE_OPACITY_MIDDLE_GRASS: f32 = 0.002; pub const TILE_TYPE_OPACITY_HIGH_GRASS: f32 = 0.1; pub const TILE_TYPE_OPACITY_DIRT: f32 = 0.0; pub const TILE_TYPE_OPACITY_CONCRETE: f32 = 0.0; @@ -87,6 +88,7 @@ pub const COVER_DISTANCE: i32 = 6; // Visibility computing must consider firsts tiles differently pub const VISIBILITY_FIRSTS: usize = 6; pub const VISIBLE_STARTS_AT: f32 = 0.5; +pub const TARGET_ALTERATION_BY_OPACITY_FACTOR: f32 = 8.; // When compute visibility, configure here each pixels step of line which me considered pub const VISIBILITY_PIXEL_STEPS: usize = 5; // When compute coverage, configure here each pixels step of line which me considered @@ -103,6 +105,7 @@ pub const CAN_STANDUP_AFTER: u64 = TARGET_FPS * 60 * 10; #[derive(Debug, Clone)] pub struct ServerConfig { pub send_debug_points: bool, + pub target_cycle_duration_us: u64, pub flags_update_freq: u64, pub soldier_update_freq: u64, pub soldier_animate_freq: u64, @@ -115,6 +118,7 @@ pub struct ServerConfig { pub feeling_decreasing_freq: u64, pub visibility_firsts: usize, pub visible_starts_at: f32, + pub target_alteration_by_opacity_factor: f32, pub visibility_idle_standup_modifier: f32, pub visibility_idle_crouch_modifier: f32, pub visibility_idle_lying_modifier: f32, @@ -167,6 +171,7 @@ impl Default for ServerConfig { Self { send_debug_points: false, + target_cycle_duration_us: TARGET_CYCLE_DURATION_US, /// Frequency of flags update flags_update_freq: FLAGS_UPDATE_FREQ, /// Frequency of soldier update : @@ -194,6 +199,7 @@ impl Default for ServerConfig { /// visibility_firsts: VISIBILITY_FIRSTS, visible_starts_at: VISIBLE_STARTS_AT, + target_alteration_by_opacity_factor: TARGET_ALTERATION_BY_OPACITY_FACTOR, visibility_idle_standup_modifier: VISIBILITY_IDLE_STANDUP_MODIFIER, visibility_idle_crouch_modifier: VISIBILITY_IDLE_CROUCH_MODIFIER, @@ -317,7 +323,7 @@ impl ServerConfig { match tile_type { TileType::ShortGrass => self.tile_type_opacity_short_grass, TileType::MiddleGrass => self.tile_type_opacity_middle_grass, - TileType::HighGrass => self.tile_type_opacity_middle_grass, + TileType::HighGrass => self.tile_type_opacity_high_grass, TileType::Dirt => self.tile_type_opacity_dirt, TileType::Concrete => self.tile_type_opacity_concrete, TileType::Mud => self.tile_type_opacity_mud, @@ -337,6 +343,7 @@ impl ServerConfig { pub fn react(&mut self, message: &ChangeConfigMessage) { match message { ChangeConfigMessage::SendDebugPoints(v) => self.send_debug_points = *v, + ChangeConfigMessage::TargetCycleDuration(v) => self.target_cycle_duration_us = *v, ChangeConfigMessage::SoldierUpdateFreq(v) => self.soldier_update_freq = *v, ChangeConfigMessage::SoldierAnimateFreq(v) => self.soldier_animate_freq = *v, ChangeConfigMessage::InteriorsUpdateFreq(v) => self.interiors_update_freq = *v, @@ -410,6 +417,7 @@ impl Default for GuiConfig { #[derive(Debug, Serialize, Deserialize, Clone)] pub enum ChangeConfigMessage { SendDebugPoints(bool), + TargetCycleDuration(u64), SoldierUpdateFreq(u64), SoldierAnimateFreq(u64), InteriorsUpdateFreq(u64), diff --git a/battle_core/src/entity/soldier.rs b/battle_core/src/entity/soldier.rs index 29fadfd..936e729 100644 --- a/battle_core/src/entity/soldier.rs +++ b/battle_core/src/entity/soldier.rs @@ -296,6 +296,23 @@ impl Soldier { let weapon_animation_type = WeaponAnimationType::from(&animation_type); (animation_type, weapon_animation_type) } + + pub fn body(&self) -> Body { + match self.behavior { + Behavior::MoveTo(_) => Body::StandUp, + Behavior::MoveFastTo(_) => Body::StandUp, + Behavior::SneakTo(_) => Body::Lying, + Behavior::DriveTo(_) => Body::Crouched, + Behavior::RotateTo(_) => Body::Crouched, + Behavior::Idle(body) => body, + Behavior::Defend(_) => Body::Lying, + Behavior::Hide(_) => Body::Lying, + Behavior::Dead => Body::Lying, + Behavior::Unconscious => Body::Lying, + Behavior::SuppressFire(_) => Body::Lying, + Behavior::EngageSoldier(_) => Body::Lying, + } + } } impl From<&SoldierDeployment> for Soldier { diff --git a/battle_core/src/map/terrain.rs b/battle_core/src/map/terrain.rs index 77625df..2fdaa50 100644 --- a/battle_core/src/map/terrain.rs +++ b/battle_core/src/map/terrain.rs @@ -2,7 +2,7 @@ use std::{fmt::Display, str::FromStr}; use crate::{game::posture::Posture, types::Coverage}; -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum TileType { ShortGrass, MiddleGrass, @@ -113,17 +113,37 @@ impl TileType { TileType::Mud => Some(Coverage(0.3)), TileType::Concrete => None, TileType::BrickWall => Some(Coverage(0.8)), - TileType::Trunk => Some(Coverage(0.9)), + TileType::Trunk => Some(Coverage(0.7)), TileType::Water => None, TileType::DeepWater => None, TileType::Underbrush => None, TileType::LightUnderbrush => None, TileType::MiddleWoodLogs => Some(Coverage(0.7)), TileType::Hedge => Some(Coverage(0.15)), - TileType::MiddleRock => Some(Coverage(0.9)), + TileType::MiddleRock => Some(Coverage(0.75)), }, } } + + pub fn block_bullet(&self) -> bool { + match self { + TileType::ShortGrass => false, + TileType::MiddleGrass => false, + TileType::HighGrass => false, + TileType::Dirt => false, + TileType::Mud => false, + TileType::Concrete => false, + TileType::BrickWall => true, + TileType::Trunk => true, + TileType::Water => false, + TileType::DeepWater => false, + TileType::Underbrush => false, + TileType::LightUnderbrush => false, + TileType::MiddleWoodLogs => false, // true ? + TileType::Hedge => false, + TileType::MiddleRock => false, // true ? + } + } } #[derive(Debug)] diff --git a/battle_core/src/physics/coverage.rs b/battle_core/src/physics/coverage.rs index ff7eb38..ee64906 100644 --- a/battle_core/src/physics/coverage.rs +++ b/battle_core/src/physics/coverage.rs @@ -25,18 +25,37 @@ impl<'a> SoldierCovered<'a> { } } - pub fn compute(&self) -> bool { + pub fn compute(&self, force_target_tile: bool) -> bool { + // Make bullet path from the end to get target soldier tiles let pixels = Bresenham::new( - ( - self.bullet_fire.from().x as isize, - self.bullet_fire.from().y as isize, - ), ( self.bullet_fire.to().x as isize, self.bullet_fire.to().y as isize, ), + ( + self.bullet_fire.from().x as isize, + self.bullet_fire.from().y as isize, + ), ); + if force_target_tile { + let target_grid_point = self + .map + .grid_point_from_world_point(&self.soldier.world_point()); + + if let Some(tile) = self + .map + .terrain_tiles() + .get((target_grid_point.y * self.map.width() as i32 + target_grid_point.x) as usize) + { + if let Some(coverage) = tile.type_().coverage(&self.soldier.behavior().posture()) { + let mut rng = rand::thread_rng(); + let value: f32 = rng.gen(); + return value <= coverage.0; + } + } + } + let mut visited_grid_points = vec![]; for (pixel_x, pixel_y) in pixels.step_by(COVERAGE_PIXEL_STEPS) { let grid_point = self diff --git a/battle_core/src/physics/visibility.rs b/battle_core/src/physics/visibility.rs index 3dc3fec..a886c61 100644 --- a/battle_core/src/physics/visibility.rs +++ b/battle_core/src/physics/visibility.rs @@ -1,19 +1,20 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use bresenham::Bresenham; +use glam::Vec2; +use rand::Rng; use serde::{Deserialize, Serialize}; use crate::{ config::{ServerConfig, VISIBILITY_FIRSTS, VISIBILITY_PIXEL_STEPS}, entity::soldier::Soldier, + game::Side, map::Map, types::{Distance, GridPath, SoldierIndex, WorldPoint}, }; use super::utils::distance_between_points; -pub const VISIBLE_OPACITY_LIMIT: f32 = 0.5; - #[derive(Debug, Serialize, Deserialize, Clone, Default)] pub struct Visibilities { visibilities: HashMap<(SoldierIndex, SoldierIndex), Visibility>, @@ -30,15 +31,29 @@ impl Visibilities { self.visibilities.get(soldiers) } - pub fn visibles_soldiers_by_soldier(&self, soldier: &Soldier) -> Vec<&Visibility> { + pub fn visibles_soldiers_by_side(&self, side: &Side) -> Vec { self.visibilities .values() - .filter(|v| { - v.from_soldier == Some(soldier.uuid()) && v.to_soldier.is_some() && v.visible + .filter(|v| v.from_side == Some(*side) && v.to_soldier.is_some() && v.visible) + .map(|v| { + v.to_soldier + .expect("Previous line must test v.to_soldier.is_some()") }) .collect() } + pub fn visibles_soldiers_by_soldiers(&self, soldiers: Vec) -> Vec { + self.visibilities + .values() + .filter(|v| v.from_soldier.is_some() && v.to_soldier.is_some()) + .filter(|v| soldiers.contains(&v.from_soldier.expect("Must be filtered previous line"))) + .filter(|v| v.visible) + .map(|v| v.to_soldier.expect("Must be filtered previous line")) + .collect::>() + .into_iter() + .collect() + } + pub fn visibles_soldiers(&self) -> Vec<&Visibility> { self.visibilities .values() @@ -59,12 +74,17 @@ impl Visibilities { pub struct Visibility { pub from: WorldPoint, pub from_soldier: Option, + pub from_side: Option, pub to: WorldPoint, pub to_soldier: Option, + pub altered_to: WorldPoint, pub path_final_opacity: f32, pub to_scene_item_opacity: f32, pub opacity_segments: Vec<(WorldPoint, f32)>, pub visible: bool, + /// true if something will (probably) intercept bullets + /// before final point (wall, trunk, etc) + pub blocked: bool, pub distance: Distance, pub break_point: Option, } @@ -78,12 +98,15 @@ impl Visibility { Self { from: from_point, from_soldier: Some(from_soldier.uuid()), + from_side: Some(*from_soldier.side()), to: to_point, + altered_to: to_point, to_soldier: Some(to_soldier.uuid()), opacity_segments: vec![], path_final_opacity: 999., to_scene_item_opacity: 999., visible: false, + blocked: false, distance, break_point: Some(from_point), } @@ -101,7 +124,6 @@ impl Visibility { let last_shoot_frame_i = to_soldier.last_shoot_frame_i(); let by_behavior_modifier: f32 = config.visibility_behavior_modifier(to_soldier.behavior()); - let exclude_lasts = if last_shoot_frame_i + config.visibility_by_last_frame_shoot >= frame_i { config.visibility_by_last_frame_shoot_distance @@ -109,15 +131,21 @@ impl Visibility { 0 }; - let (mut to_soldier_item_opacity, opacity_segments, path_final_opacity, break_point) = - Self::between_points_raw( - config, - &from_point, - &to_point, - map, - config.visibility_firsts, - exclude_lasts, - ); + let ( + mut to_soldier_item_opacity, + opacity_segments, + path_final_opacity, + break_point, + blocked, + altered_to, + ) = Self::between_points_raw( + config, + &from_point, + &to_point, + map, + config.visibility_firsts, + exclude_lasts, + ); to_soldier_item_opacity -= by_behavior_modifier; let visible = to_soldier_item_opacity < config.visible_starts_at; @@ -127,12 +155,15 @@ impl Visibility { Self { from: from_point, from_soldier: Some(from_soldier.uuid()), + from_side: Some(*from_soldier.side()), to: to_point, to_soldier: Some(to_soldier.uuid()), + altered_to, opacity_segments, path_final_opacity, to_scene_item_opacity: to_soldier_item_opacity, visible, + blocked, distance, break_point, } @@ -147,27 +178,36 @@ impl Visibility { ) -> Self { let from_point = from_soldier.world_point(); - let (to_soldier_item_opacity, opacity_segments, path_final_opacity, break_point) = - Self::between_points_raw( - config, - &from_point, - to_point, - map, - VISIBILITY_FIRSTS, - exclude_lasts, - ); + let ( + to_soldier_item_opacity, + opacity_segments, + path_final_opacity, + break_point, + blocked, + altered_to, + ) = Self::between_points_raw( + config, + &from_point, + to_point, + map, + VISIBILITY_FIRSTS, + exclude_lasts, + ); - let visible = to_soldier_item_opacity < VISIBLE_OPACITY_LIMIT; + let visible = to_soldier_item_opacity < config.visible_starts_at; let distance = distance_between_points(&from_point, to_point); Self { from: from_point, from_soldier: Some(from_soldier.uuid()), + from_side: Some(*from_soldier.side()), to: *to_point, to_soldier: None, + altered_to, opacity_segments, path_final_opacity, to_scene_item_opacity: to_soldier_item_opacity, visible, + blocked, distance, break_point, } @@ -179,20 +219,29 @@ impl Visibility { to_point: &WorldPoint, map: &Map, ) -> Self { - let (to_soldier_item_opacity, opacity_segments, path_final_opacity, break_point) = - Self::between_points_raw(config, from_point, to_point, map, VISIBILITY_FIRSTS, 0); + let ( + to_soldier_item_opacity, + opacity_segments, + path_final_opacity, + break_point, + blocked, + altered_to, + ) = Self::between_points_raw(config, from_point, to_point, map, VISIBILITY_FIRSTS, 0); - let visible = to_soldier_item_opacity < 0.5; + let visible = to_soldier_item_opacity < config.visible_starts_at; let distance = distance_between_points(from_point, to_point); Self { from: *from_point, from_soldier: None, + from_side: None, to: *to_point, to_soldier: None, + altered_to, opacity_segments, path_final_opacity, to_scene_item_opacity: to_soldier_item_opacity, visible, + blocked, distance, break_point, } @@ -206,11 +255,20 @@ impl Visibility { map: &Map, exclude_firsts: usize, exclude_lasts: usize, - ) -> (f32, Vec<(WorldPoint, f32)>, f32, Option) { + ) -> ( + f32, + Vec<(WorldPoint, f32)>, + f32, + Option, + bool, + WorldPoint, + ) { + let mut rng = rand::thread_rng(); let mut opacity_segments: Vec<(WorldPoint, f32)> = vec![]; let mut path_final_opacity: f32 = 0.0; let mut to_opacity: f32 = 0.0; let mut break_point = None; + let mut blocked = false; let _visible_by_bullet_fire = false; // Compute line pixels @@ -221,7 +279,7 @@ impl Visibility { let mut grid_path: GridPath = GridPath::new(); let mut other: Vec<(WorldPoint, f32)> = vec![]; - for (pixel_x, pixel_y) in pixels.step_by(VISIBILITY_PIXEL_STEPS) { + for (i, (pixel_x, pixel_y)) in pixels.step_by(VISIBILITY_PIXEL_STEPS).enumerate() { let grid_point = map.grid_point_from_world_point(&WorldPoint::new(pixel_x as f32, pixel_y as f32)); if !grid_path.contains(&grid_point) { @@ -239,6 +297,10 @@ impl Visibility { } else { config.terrain_tile_opacity(&terrain_tile.type_) }; + if i >= exclude_firsts && terrain_tile.type_().block_bullet() { + // FIXME BS NOW: defend and move etc. must change their order only if visible and not !blocked ! + blocked = true + } grid_path.push(grid_point); other.push(( WorldPoint::new(pixel_x as f32, pixel_y as f32), @@ -247,6 +309,11 @@ impl Visibility { } } + let exclude_lasts = if grid_path.len() < exclude_lasts { + grid_path.len() + } else { + exclude_lasts + }; let exclude_opacity_starts_at = grid_path.len() - exclude_lasts; for (i, (_, (world_point, opacity))) in grid_path.points.iter().zip(other).enumerate() { // Disable to_scene_item firsts if seen because firing @@ -258,16 +325,30 @@ impl Visibility { path_final_opacity += opacity; to_opacity += opacity; opacity_segments.push((world_point, path_final_opacity)); - if path_final_opacity > VISIBLE_OPACITY_LIMIT && break_point.is_none() { + if path_final_opacity > config.visible_starts_at && break_point.is_none() { break_point = Some(world_point); } } + // Compute a target point altered by opacity + let altered_to = { + let range = path_final_opacity * config.target_alteration_by_opacity_factor; + if range > 0. { + let x_change = rng.gen_range(-range..range); + let y_change = rng.gen_range(-range..range); + to_point.apply(Vec2::new(x_change, y_change)) + } else { + *to_point + } + }; + ( to_opacity, opacity_segments, path_final_opacity, break_point, + blocked, + altered_to, ) } } diff --git a/battle_core/src/state/battle/mod.rs b/battle_core/src/state/battle/mod.rs index 3e4573a..2ba4c8c 100644 --- a/battle_core/src/state/battle/mod.rs +++ b/battle_core/src/state/battle/mod.rs @@ -12,12 +12,13 @@ use crate::{ physics::{ event::{bullet::BulletFire, cannon_blast::CannonBlast, explosion::Explosion}, path::{Direction, PathMode}, + utils::distance_between_points, visibility::Visibilities, }, sync::BattleStateCopy, types::{ - SoldierBoard, SoldierIndex, SoldiersOnBoard, SquadComposition, SquadUuid, VehicleBoard, - VehicleIndex, + Distance, SoldierBoard, SoldierIndex, SoldiersOnBoard, SquadComposition, SquadUuid, + VehicleBoard, VehicleIndex, WorldPoint, }, utils::{vehicle_board_from_soldiers_on_board, WorldShape}, }; @@ -404,6 +405,23 @@ impl BattleState { pub fn b_morale(&self) -> &Morale { &self.b_morale } + + pub fn get_circle_side_soldiers_able_to_see( + &self, + side: &Side, + point: &WorldPoint, + distance: &Distance, + ) -> Vec<&Soldier> { + self.soldiers + .iter() + .filter(|s| s.can_seek()) + .filter(|s| s.side() == side) + .filter(|s| { + distance_between_points(&s.world_point(), &point).millimeters() + <= distance.millimeters() + }) + .collect() + } } #[derive(Debug)] diff --git a/battle_core/src/state/battle/visibility.rs b/battle_core/src/state/battle/visibility.rs index 13a3ad6..639559f 100644 --- a/battle_core/src/state/battle/visibility.rs +++ b/battle_core/src/state/battle/visibility.rs @@ -69,8 +69,7 @@ impl BattleState { soldier: &Soldier, point: &WorldPoint, exclude_lasts: usize, - ) -> bool { + ) -> Visibility { Visibility::between_soldier_and_point(config, soldier, point, self.map(), exclude_lasts) - .visible } } diff --git a/battle_gui/src/engine/debug/gui/config.rs b/battle_gui/src/engine/debug/gui/config.rs index d1dc4e5..595c8ba 100644 --- a/battle_gui/src/engine/debug/gui/config.rs +++ b/battle_gui/src/engine/debug/gui/config.rs @@ -3,9 +3,9 @@ use ggez::Context; use battle_core::config::{ ChangeConfigMessage, FEELING_DECREASING_FREQ, INTERIORS_UPDATE_FREQ, SOLDIER_ANIMATE_FREQ, - SOLDIER_UPDATE_FREQ, TARGET_FPS, TILE_TYPE_OPACITY_BRICK_WALL, TILE_TYPE_OPACITY_CONCRETE, - TILE_TYPE_OPACITY_DEEP_WATER, TILE_TYPE_OPACITY_DIRT, TILE_TYPE_OPACITY_HEDGE, - TILE_TYPE_OPACITY_HIGH_GRASS, TILE_TYPE_OPACITY_LIGHT_UNDERBRUSH, + SOLDIER_UPDATE_FREQ, TARGET_CYCLE_DURATION_US, TARGET_FPS, TILE_TYPE_OPACITY_BRICK_WALL, + TILE_TYPE_OPACITY_CONCRETE, TILE_TYPE_OPACITY_DEEP_WATER, TILE_TYPE_OPACITY_DIRT, + TILE_TYPE_OPACITY_HEDGE, TILE_TYPE_OPACITY_HIGH_GRASS, TILE_TYPE_OPACITY_LIGHT_UNDERBRUSH, TILE_TYPE_OPACITY_MIDDLE_GRASS, TILE_TYPE_OPACITY_MIDDLE_ROCK, TILE_TYPE_OPACITY_MIDDLE_WOOD_LOGS, TILE_TYPE_OPACITY_MUD, TILE_TYPE_OPACITY_SHORT_GRASS, TILE_TYPE_OPACITY_TRUNK, TILE_TYPE_OPACITY_UNDERBRUSH, TILE_TYPE_OPACITY_WATER, @@ -38,6 +38,14 @@ impl Engine { .striped(true) .show(ui, |ui| { for (name, value, min, max, default, message) in [ + ( + "TARGET_CYCLE_DURATION_US", + &mut self.server_config.target_cycle_duration_us, + 0, + TARGET_CYCLE_DURATION_US * 5, + TARGET_CYCLE_DURATION_US, + ChangeConfigMessage::TargetCycleDuration, + ), ( "SOLDIER_UPDATE_FREQ", &mut self.server_config.soldier_update_freq, @@ -79,7 +87,7 @@ impl Engine { ChangeConfigMessage::FeelingDecreasingFreq, ), ] - as [(_, _, _, _, _, fn(_) -> _); 5] + as [(_, _, _, _, _, fn(_) -> _); 6] { ui.label(name); if ui.button("reset").clicked() { diff --git a/battle_gui/src/engine/mod.rs b/battle_gui/src/engine/mod.rs index 2404c1a..9ec923b 100644 --- a/battle_gui/src/engine/mod.rs +++ b/battle_gui/src/engine/mod.rs @@ -69,6 +69,9 @@ pub struct Engine { hud: Hud, a_control: MapControl, b_control: MapControl, + // + first_copy_loaded: bool, + when_first_copy_messages: Vec, } impl Engine { @@ -87,6 +90,7 @@ impl Engine { a_control: MapControl, b_control: MapControl, apply: Vec, + when_first_copy_apply: Vec, ) -> GameResult { let mut gui_state = GuiState::new(*side, battle_state.map()); gui_state.set_saves( @@ -112,6 +116,8 @@ impl Engine { hud, a_control, b_control, + first_copy_loaded: false, + when_first_copy_messages: when_first_copy_apply, }; engine.react(apply, ctx)?; diff --git a/battle_gui/src/engine/network.rs b/battle_gui/src/engine/network.rs index 5d48e6f..f4913b2 100644 --- a/battle_gui/src/engine/network.rs +++ b/battle_gui/src/engine/network.rs @@ -36,6 +36,12 @@ impl Engine { self.sync_required.swap(false, Ordering::Relaxed); self.battle_state = battle_state; + + if !self.first_copy_loaded { + self.first_copy_loaded = true; + self.react(self.when_first_copy_messages.clone(), ctx)?; + self.when_first_copy_messages = vec![]; + } } OutputMessage::BattleState(battle_state_message) => { if self.gui_state.debug_physics_areas { diff --git a/battle_gui/src/graphics/map.rs b/battle_gui/src/graphics/map.rs index 0c331d4..62cc4a8 100644 --- a/battle_gui/src/graphics/map.rs +++ b/battle_gui/src/graphics/map.rs @@ -1,4 +1,7 @@ -use std::path::{Path, PathBuf}; +use std::{ + any::Any, + path::{Path, PathBuf}, +}; use battle_core::{config::ServerConfig, map::Map, types::WorldPoint}; use ggez::{ diff --git a/battle_gui/src/main.rs b/battle_gui/src/main.rs index 0a76257..a7fd943 100644 --- a/battle_gui/src/main.rs +++ b/battle_gui/src/main.rs @@ -44,5 +44,6 @@ fn main() -> Result<(), GuiError> { false, vec![], vec![], + vec![], ) } diff --git a/battle_gui/src/run.rs b/battle_gui/src/run.rs index e2031e7..5561018 100644 --- a/battle_gui/src/run.rs +++ b/battle_gui/src/run.rs @@ -117,6 +117,7 @@ pub fn run( force_server_map: bool, inputs: Vec, engine_apply: Vec, + engine_when_first_copy_apply: Vec, ) -> Result<(), GuiError> { let sync_required = Arc::new(AtomicBool::new(true)); let stop_required: Arc = Arc::new(AtomicBool::new(false)); @@ -132,6 +133,7 @@ pub fn run( let (output_sender, output_receiver) = unbounded(); if let Err(error) = EmbeddedServer::new( + server_config.clone(), &resources.lib(), input_receiver, output_sender, @@ -219,6 +221,7 @@ pub fn run( a_control, b_control, engine_apply, + engine_when_first_copy_apply, )?; // FIXME BS NOW : Closing GUI don't close thread correctly and keep process running diff --git a/battle_gui/src/server/mod.rs b/battle_gui/src/server/mod.rs index 9f4762f..84ff8f9 100644 --- a/battle_gui/src/server/mod.rs +++ b/battle_gui/src/server/mod.rs @@ -55,6 +55,7 @@ impl Display for EmbeddedServerError { } pub struct EmbeddedServer { + config: ServerConfig, resources: PathBuf, map_name: Option, force_map: Option, @@ -67,12 +68,14 @@ pub struct EmbeddedServer { impl EmbeddedServer { pub fn new( + config: ServerConfig, resources: &Path, gui_input_receiver: Receiver>, gui_output_sender: Sender>, stop_required: Arc, ) -> Self { Self { + config, resources: resources.to_path_buf(), map_name: None, force_map: None, @@ -112,7 +115,7 @@ impl EmbeddedServer { .map_name .as_ref() .ok_or(EmbeddedServerError::MissingMapName)?; - let config = ServerConfig::default(); + let config = self.config.clone(); let map = if let Some(map) = &self.force_map { map.clone() diff --git a/battle_server/src/runner/fight/choose.rs b/battle_server/src/runner/fight/choose.rs index 33fafac..3767070 100644 --- a/battle_server/src/runner/fight/choose.rs +++ b/battle_server/src/runner/fight/choose.rs @@ -15,36 +15,21 @@ pub enum ChooseMethod { RandomFromNearest, } impl ChooseMethod { - fn choose( - &self, - battle_state: &BattleState, - visibles: Vec<&Visibility>, - ) -> Option { + fn choose(&self, battle_state: &BattleState, soldiers: Vec<&Soldier>) -> Option { match self { - Self::RandomFromNearest => self.choose_random_from_nearest(battle_state, visibles), + Self::RandomFromNearest => self.choose_random_from_nearest(battle_state, soldiers), } } fn choose_random_from_nearest( &self, - battle_state: &BattleState, - visibles: Vec<&Visibility>, + _battle_state: &BattleState, + soldiers: Vec<&Soldier>, ) -> Option { - if let Some(visibility) = visibles.first() { - let soldier = battle_state.soldier( - visibility - .to_soldier - .expect("visibles_soldiers_by must returned with to_soldier"), - ); + if let Some(soldier) = soldiers.first() { let soldier_position = soldier.world_point(); - let near_soldiers: Vec<&Soldier> = visibles - .iter() - .map(|v| { - battle_state.soldier( - v.to_soldier - .expect("visibles_soldiers_by must returned with to_soldier"), - ) - }) + let near_soldiers: Vec<&Soldier> = soldiers + .into_iter() .filter(|s| { distance_between_points(&soldier_position, &s.world_point()) < Distance::from_meters(NEAR_SOLDIERS_DISTANCE_METERS) @@ -68,40 +53,49 @@ impl Runner { &self, soldier: &Soldier, squad_index: Option<&SquadUuid>, - method: &ChooseMethod, + choose_method: &ChooseMethod, ) -> Option<&Soldier> { - let mut visibles = self + let around_soldiers: Vec = self + .battle_state + .get_circle_side_soldiers_able_to_see( + soldier.side(), + &soldier.world_point(), + &Distance::from_meters(20), + ) + .iter() + .map(|s| s.uuid()) + .collect(); + let mut visibles: Vec<&Soldier> = self .battle_state .visibilities() - .visibles_soldiers_by_soldier(soldier); + // FIXME BS NOW: !!! visible by near soldiers instead of all side + .visibles_soldiers_by_soldiers(around_soldiers) + .iter() + .map(|s| self.battle_state.soldier(*s)) + .collect(); - visibles.retain(|v| { - self.battle_state - .soldier(v.to_soldier.expect("filtered previously")) - .can_be_designed_as_target() - }); + visibles.retain(|s| s.can_be_designed_as_target()); if let Some(squad_index) = squad_index { - visibles.retain(|v| { - self.battle_state - .soldier(v.to_soldier.expect("filtered previously")) - .squad_uuid() - == *squad_index - }) + visibles.retain(|s| s.squad_uuid() == *squad_index) } - visibles.sort_by(|a, b| { - a.distance - .millimeters() - .partial_cmp(&b.distance.millimeters()) - .expect("Must be i64") - }); + // Why this sort ? + // visibles.sort_by(|a, b| { + // a.distance + // .millimeters() + // .partial_cmp(&b.distance.millimeters()) + // .expect("Must be i64") + // }); if soldier.behavior().is_hide() { - visibles.retain(|v| v.distance <= self.config.hide_maximum_rayon) + visibles.retain(|s| { + distance_between_points(&soldier.world_point(), &s.world_point()) + <= self.config.hide_maximum_rayon + }) } - method + choose_method .choose(&self.battle_state, visibles) .map(|i| self.battle_state.soldier(i)) } diff --git a/battle_server/src/runner/gesture/engage.rs b/battle_server/src/runner/gesture/engage.rs index 4e25700..30fa4e5 100644 --- a/battle_server/src/runner/gesture/engage.rs +++ b/battle_server/src/runner/gesture/engage.rs @@ -13,9 +13,12 @@ impl Runner { let target_soldier = self.battle_state.soldier(*engaged_soldier_index); if target_soldier.can_be_designed_as_target() { - let point = target_soldier.world_point(); - if let Some(weapon) = self.soldier_able_to_fire_on_point(soldier, &point) { - let (gesture_context, gesture) = self.engage_point_gesture(soldier, &point, weapon); + let target_soldier_point = target_soldier.world_point(); + + if let Some(engagement) = + self.soldier_able_to_fire_on_point(soldier, &target_soldier_point) + { + let (gesture_context, gesture) = self.engage_point_gesture(soldier, engagement); return GestureResult::Handled(gesture_context, gesture); } } diff --git a/battle_server/src/runner/gesture/fire.rs b/battle_server/src/runner/gesture/fire.rs index d707dcd..83cec01 100644 --- a/battle_server/src/runner/gesture/fire.rs +++ b/battle_server/src/runner/gesture/fire.rs @@ -15,24 +15,32 @@ impl Runner { &'a self, soldier: &'a Soldier, point: &WorldPoint, - ) -> Option<(WeaponClass, &Weapon)> { - if !self.battle_state.point_is_visible_by_soldier( + ) -> Option<(WeaponClass, &Weapon, WorldPoint)> { + // FIXME BS NOW: aut. tir si: + // - visible + // - ou visible par soldat a proximité + // - FIXME BS NOW: pk path_final_opacity differents de '2 see {}' + // Algo pas le même ... ajouter une notion que on shoot un soldat vu donc c bon + // ne bloquer le tir que si obstacle avant la fin ? + let visibility = self.battle_state.point_is_visible_by_soldier( &self.config, soldier, point, // Shoot a hidden point is possible (like fire through a wall) self.config.visibility_by_last_frame_shoot_distance, - ) { + ); + + if visibility.blocked { return None; } if let Some((weapon_class, weapon)) = self.soldier_weapon_for_point(soldier, point) { if weapon.can_fire() || weapon.can_reload() { - return Some((weapon_class, weapon)); + return Some((weapon_class, weapon, visibility.altered_to)); } if self.soldier_can_reload_with(soldier, weapon).is_some() { - return Some((weapon_class, weapon)); + return Some((weapon_class, weapon, visibility.altered_to)); } } @@ -42,31 +50,33 @@ impl Runner { pub fn engage_point_gesture( &self, soldier: &Soldier, - point: &WorldPoint, - weapon: (WeaponClass, &Weapon), + engagement: (WeaponClass, &Weapon, WorldPoint), ) -> (GestureContext, Gesture) { let frame_i = self.battle_state.frame_i(); let current = soldier.gesture(); - + let (weapon_class, weapon, point) = engagement; let gesture = match current { Gesture::Idle => { // Gesture::Reloading( - self.soldier_reloading_end(soldier, weapon.1), - weapon.0.clone(), + self.soldier_reloading_end(soldier, weapon), + weapon_class.clone(), ) } Gesture::Reloading(_, _) => { // current.next( *frame_i, - Gesture::Aiming(self.soldier_aiming_end(soldier, weapon.1), weapon.0.clone()), + Gesture::Aiming( + self.soldier_aiming_end(soldier, weapon), + weapon_class.clone(), + ), ) } Gesture::Aiming(_, _) => { // - let end = self.soldier_firing_end(soldier, weapon.1); - current.next(*frame_i, Gesture::Firing(end, weapon.0.clone())) + let end = self.soldier_firing_end(soldier, weapon); + current.next(*frame_i, Gesture::Firing(end, weapon_class.clone())) } Gesture::Firing(_, _) => { // @@ -74,7 +84,7 @@ impl Runner { } }; - let final_point = self.soldier_fire_point(soldier, &weapon.0, point); + let final_point = self.soldier_fire_point(soldier, &weapon_class, &point); (GestureContext::Firing(final_point, None), gesture) } @@ -87,9 +97,9 @@ impl Runner { ) -> WorldPoint { let mut rng = rand::thread_rng(); // TODO : change precision according to weapon, stress, distance, etc - let range = 1.5 - * (distance_between_points(&soldier.world_point(), target_point).meters() as f32 - / 500.); + let factor_by_meter = 0.075; + let distance = distance_between_points(&soldier.world_point(), target_point); + let range = distance.meters() as f32 * factor_by_meter; if range == 0. { eprintln!( @@ -101,8 +111,7 @@ impl Runner { let x_change = rng.gen_range(-range..range); let y_change = rng.gen_range(-range..range); - let final_point = target_point.apply(Vec2::new(x_change, y_change)); - final_point + target_point.apply(Vec2::new(x_change, y_change)) } } diff --git a/battle_server/src/runner/gesture/suppress.rs b/battle_server/src/runner/gesture/suppress.rs index ff3871e..30c58f0 100644 --- a/battle_server/src/runner/gesture/suppress.rs +++ b/battle_server/src/runner/gesture/suppress.rs @@ -7,7 +7,7 @@ use super::GestureResult; impl Runner { pub fn suppress_fire_gesture(&self, soldier: &Soldier, point: &WorldPoint) -> GestureResult { if let Some(weapon) = self.soldier_able_to_fire_on_point(soldier, point) { - let (gesture_context, gesture) = self.engage_point_gesture(soldier, point, weapon); + let (gesture_context, gesture) = self.engage_point_gesture(soldier, weapon); return GestureResult::Handled(gesture_context, gesture); } diff --git a/battle_server/src/runner/mod.rs b/battle_server/src/runner/mod.rs index 0cac69d..bba28d7 100644 --- a/battle_server/src/runner/mod.rs +++ b/battle_server/src/runner/mod.rs @@ -35,8 +35,6 @@ mod vehicle; mod victory; mod visibility; -const TARGET_CYCLE_DURATION_US: u64 = 16666; - pub struct Runner { config: ServerConfig, input: Receiver>, @@ -87,10 +85,10 @@ impl Runner { fn sleep_duration(&self) -> Duration { let elapsed = self.last.elapsed().as_micros() as u64; - if elapsed > TARGET_CYCLE_DURATION_US { + if elapsed > self.config.target_cycle_duration_us { Duration::from_micros(0) } else { - Duration::from_micros(TARGET_CYCLE_DURATION_US - elapsed) + Duration::from_micros(self.config.target_cycle_duration_us - elapsed) } } } diff --git a/battle_server/src/runner/physics/bullet.rs b/battle_server/src/runner/physics/bullet.rs index 57ea82b..4c3c13a 100644 --- a/battle_server/src/runner/physics/bullet.rs +++ b/battle_server/src/runner/physics/bullet.rs @@ -1,5 +1,6 @@ use battle_core::{ audio::Sound, + behavior::Body, entity::soldier::Soldier, physics::{ coverage::SoldierCovered, event::bullet::BulletFire, utils::distance_between_points, @@ -8,7 +9,6 @@ use battle_core::{ types::Distance, }; use rand::seq::SliceRandom; -use rand::Rng; use crate::runner::{message::RunnerMessage, Runner}; @@ -49,25 +49,25 @@ impl Runner { continue; } + let cover = SoldierCovered::new(self.battle_state.map(), bullet_fire, soldier); let from = &soldier.world_point(); let distance = distance_between_points(from, point); - - if distance.meters() < 1 - && SoldierCovered::new(self.battle_state.map(), bullet_fire, soldier).compute() - { + // FIXME these values in config + let body_surface = match soldier.body() { + Body::StandUp => 1000, + Body::Crouched => 700, + Body::Lying => 600, + }; + let body_impact = distance.millimeters() <= body_surface; + let covered = distance.meters() < 1 && cover.compute(body_impact); + let proximity = !body_impact && distance.meters() < 30; + + if covered { messages.extend(self.covered_bullet_effects(soldier)); messages.extend(self.proximity_bullet_effects(soldier, &distance)) - } else if distance.millimeters() < 500 { - let mut rng = rand::thread_rng(); - let value: u8 = rng.gen(); - if value < 10 { - messages.extend(self.killing_bullet_effects(soldier)) - } else if value < 50 { - messages.extend(self.injuring_bullet_effects(soldier)) - } else { - messages.extend(self.proximity_bullet_effects(soldier, &distance)) - } - } else if distance.meters() < 30 { + } else if body_impact { + messages.extend(self.killing_bullet_effects(soldier)) + } else if proximity { messages.extend(self.proximity_bullet_effects(soldier, &distance)) } } diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 4a0e496..dcf84de 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -11,3 +11,4 @@ battle_server = { path = "../battle_server" } battle_tools = { path = "../battle_tools" } battle_gui = { path = "../battle_gui" } thiserror = "1.0.39" +glam = { version = "0.22.0", features = ["mint"]} diff --git a/examples/src/bin/face_to_face1.rs b/examples/src/bin/face_to_face1.rs index 78f13e4..0a5016f 100644 --- a/examples/src/bin/face_to_face1.rs +++ b/examples/src/bin/face_to_face1.rs @@ -1,17 +1,19 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; use examples::{ runner::{Runner, RunnerError}, scenarios::face_to_face::face_to_face, }; fn main() -> Result<(), RunnerError> { - let (map, deployment) = face_to_face(300.); + let (map, deployment) = face_to_face(TileType::ShortGrass, 1500., None); - // FIXME BS NOW disable victory by morale Runner::new(map) - .expire(Some(60 * 60)) // FIXME BS NOW implement .deployment(deployment) .begin(true) .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) .run()?; Ok(()) diff --git a/examples/src/bin/face_to_face2.rs b/examples/src/bin/face_to_face2.rs index b1f2e64..2f062a4 100644 --- a/examples/src/bin/face_to_face2.rs +++ b/examples/src/bin/face_to_face2.rs @@ -1,17 +1,19 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; use examples::{ runner::{Runner, RunnerError}, scenarios::face_to_face::face_to_face, }; fn main() -> Result<(), RunnerError> { - let (map, deployment) = face_to_face(100.); + let (map, deployment) = face_to_face(TileType::ShortGrass, 500., None); - // FIXME BS NOW disable victory by morale Runner::new(map) - .expire(Some(60 * 60)) // FIXME BS NOW implement .deployment(deployment) .begin(true) .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) .run()?; Ok(()) diff --git a/examples/src/bin/face_to_face3.rs b/examples/src/bin/face_to_face3.rs index d67b968..d9af423 100644 --- a/examples/src/bin/face_to_face3.rs +++ b/examples/src/bin/face_to_face3.rs @@ -1,17 +1,19 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; use examples::{ runner::{Runner, RunnerError}, scenarios::face_to_face::face_to_face, }; fn main() -> Result<(), RunnerError> { - let (map, deployment) = face_to_face(50.); + let (map, deployment) = face_to_face(TileType::ShortGrass, 75., None); - // FIXME BS NOW disable victory by morale Runner::new(map) - .expire(Some(60 * 60)) // FIXME BS NOW implement .deployment(deployment) .begin(true) .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) .run()?; Ok(()) diff --git a/examples/src/bin/face_to_face_opaque1.rs b/examples/src/bin/face_to_face_opaque1.rs new file mode 100644 index 0000000..efb6383 --- /dev/null +++ b/examples/src/bin/face_to_face_opaque1.rs @@ -0,0 +1,20 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::MiddleGrass, 1500., None); + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/face_to_face_opaque2.rs b/examples/src/bin/face_to_face_opaque2.rs new file mode 100644 index 0000000..0c370ab --- /dev/null +++ b/examples/src/bin/face_to_face_opaque2.rs @@ -0,0 +1,20 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::MiddleGrass, 750., None); + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/face_to_face_with_one_side_brickwall1.rs b/examples/src/bin/face_to_face_with_one_side_brickwall1.rs new file mode 100644 index 0000000..766136b --- /dev/null +++ b/examples/src/bin/face_to_face_with_one_side_brickwall1.rs @@ -0,0 +1,20 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::ShortGrass, 1500., Some(TileType::BrickWall)); + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/face_to_face_with_one_side_brickwall2.rs b/examples/src/bin/face_to_face_with_one_side_brickwall2.rs new file mode 100644 index 0000000..f7171de --- /dev/null +++ b/examples/src/bin/face_to_face_with_one_side_brickwall2.rs @@ -0,0 +1,20 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::ShortGrass, 500., Some(TileType::BrickWall)); + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/face_to_face_with_one_side_brickwall3.rs b/examples/src/bin/face_to_face_with_one_side_brickwall3.rs new file mode 100644 index 0000000..7320015 --- /dev/null +++ b/examples/src/bin/face_to_face_with_one_side_brickwall3.rs @@ -0,0 +1,20 @@ +use battle_core::{config::TARGET_CYCLE_DURATION_US, map::terrain::TileType}; +use battle_gui::debug::DebugTerrain; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::ShortGrass, 75., Some(TileType::BrickWall)); + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/running_with_one_side_brickwall1.rs b/examples/src/bin/running_with_one_side_brickwall1.rs new file mode 100644 index 0000000..2a0a3df --- /dev/null +++ b/examples/src/bin/running_with_one_side_brickwall1.rs @@ -0,0 +1,41 @@ +use battle_core::{ + config::TARGET_CYCLE_DURATION_US, + map::terrain::TileType, + order::Order, + state::battle::message::{BattleStateMessage, SoldierMessage}, + types::{Angle, SoldierIndex, WorldPath, WorldPaths, WorldPoint}, +}; +use battle_gui::{debug::DebugTerrain, engine::message::EngineMessage}; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::ShortGrass, 500., Some(TileType::BrickWall)); + + let messages = vec![ + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(0), + SoldierMessage::SetOrder(Order::MoveFastTo( + WorldPaths::new(vec![WorldPath::new(vec![WorldPoint::new(500., 50.)])]), + None, + )), + )), + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(5), + SoldierMessage::SetOrder(Order::Hide(Angle(0.75))), + )), + ]; + + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .when_first_copy_apply(messages) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/walking_with_one_side_brickwall1.rs b/examples/src/bin/walking_with_one_side_brickwall1.rs new file mode 100644 index 0000000..4754a1d --- /dev/null +++ b/examples/src/bin/walking_with_one_side_brickwall1.rs @@ -0,0 +1,42 @@ +use battle_core::{ + config::TARGET_CYCLE_DURATION_US, + map::terrain::TileType, + order::Order, + state::battle::message::{BattleStateMessage, SoldierMessage}, + types::{Angle, SoldierIndex, WorldPath, WorldPaths, WorldPoint}, +}; +use battle_gui::{debug::DebugTerrain, engine::message::EngineMessage}; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::MiddleGrass, 1200., Some(TileType::BrickWall)); + + let messages = vec![ + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(0), + SoldierMessage::SetOrder(Order::MoveTo( + WorldPaths::new(vec![WorldPath::new(vec![WorldPoint::new(1250., 50.)])]), + None, + )), + )), + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(5), + SoldierMessage::SetOrder(Order::Hide(Angle(0.75))), + )), + ]; + + // FIXME BS NOW: side B is not hided at start, why ? + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .when_first_copy_apply(messages) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/walking_with_one_side_brickwall2.rs b/examples/src/bin/walking_with_one_side_brickwall2.rs new file mode 100644 index 0000000..430a031 --- /dev/null +++ b/examples/src/bin/walking_with_one_side_brickwall2.rs @@ -0,0 +1,42 @@ +use battle_core::{ + config::TARGET_CYCLE_DURATION_US, + map::terrain::TileType, + order::Order, + state::battle::message::{BattleStateMessage, SoldierMessage}, + types::{Angle, SoldierIndex, WorldPath, WorldPaths, WorldPoint}, +}; +use battle_gui::{debug::DebugTerrain, engine::message::EngineMessage}; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::MiddleGrass, 700., Some(TileType::BrickWall)); + + let messages = vec![ + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(0), + SoldierMessage::SetOrder(Order::MoveTo( + WorldPaths::new(vec![WorldPath::new(vec![WorldPoint::new(750., 50.)])]), + None, + )), + )), + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(5), + SoldierMessage::SetOrder(Order::Hide(Angle(0.75))), + )), + ]; + + // FIXME BS NOW: side B is not hided at start, why ? + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .when_first_copy_apply(messages) + .run()?; + + Ok(()) +} diff --git a/examples/src/bin/walking_with_one_side_brickwall3.rs b/examples/src/bin/walking_with_one_side_brickwall3.rs new file mode 100644 index 0000000..4cd293f --- /dev/null +++ b/examples/src/bin/walking_with_one_side_brickwall3.rs @@ -0,0 +1,46 @@ +use battle_core::{ + config::TARGET_CYCLE_DURATION_US, + map::terrain::TileType, + order::Order, + state::battle::message::{BattleStateMessage, SoldierMessage}, + types::{Angle, SoldierIndex, WorldPath, WorldPaths, WorldPoint}, +}; +use battle_gui::{debug::DebugTerrain, engine::message::EngineMessage}; +use examples::{ + runner::{Runner, RunnerError}, + scenarios::face_to_face::face_to_face, +}; +use glam::Vec2; + +fn main() -> Result<(), RunnerError> { + let (map, deployment) = face_to_face(TileType::HighGrass, 300., Some(TileType::BrickWall)); + + let messages = vec![ + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(0), + SoldierMessage::SetOrder(Order::MoveTo( + WorldPaths::new(vec![WorldPath::new(vec![WorldPoint::new(350., 50.)])]), + None, + )), + )), + EngineMessage::BattleState(BattleStateMessage::Soldier( + SoldierIndex(5), + SoldierMessage::SetOrder(Order::Hide(Angle::from_points( + &Vec2::new(0.0, 0.0), + &Vec2::new(1.0, 0.0), + ))), + )), + ]; + + // FIXME BS NOW: side B is not hided at start, why ? + Runner::new(map) + .deployment(deployment) + .begin(true) + .debug_physics(true) + .target_cycle_duration(TARGET_CYCLE_DURATION_US / 3) + .debug_terrain(DebugTerrain::Opacity) + .when_first_copy_apply(messages) + .run()?; + + Ok(()) +} diff --git a/examples/src/map/flat.rs b/examples/src/map/flat.rs index 86e2a65..952a215 100644 --- a/examples/src/map/flat.rs +++ b/examples/src/map/flat.rs @@ -1,10 +1,13 @@ -use battle_core::map::terrain::{TerrainTile, TileType}; +use battle_core::{ + map::terrain::{TerrainTile, TileType}, + types::GridPoint, +}; use super::MapModel; -pub struct FlatAndEmpty; +pub struct Flat; -impl MapModel for FlatAndEmpty { +impl MapModel for Flat { fn terrain_tile_size(&self) -> u32 { 5 } @@ -13,24 +16,33 @@ impl MapModel for FlatAndEmpty { &self, width: u32, height: u32, + default_tile_type: TileType, + placed: &[(GridPoint, TileType)], ) -> Vec { let mut terrain_tiles = vec![]; let terrain_tile_size: u32 = 5; let columns = width / terrain_tile_size; let lines = height / terrain_tile_size; - for x in 0..lines { - for y in 0..columns { - let tile_x = x; // TODO: not sure at all here ... - let tile_y = y; // TODO: not sure at all here ... + for line in 0..lines { + for column in 0..columns { + let tile_x = column; // TODO: not sure at all here ... + let tile_y = line; // TODO: not sure at all here ... + + let tile_type = placed + .iter() + .find(|x| x.0 == GridPoint::new(column as i32, line as i32)) + .map(|x| x.1.clone()) + .unwrap_or(default_tile_type.clone()); + terrain_tiles.push(TerrainTile::new( - TileType::ShortGrass, + tile_type, terrain_tile_size, terrain_tile_size, 1.0, 1.0, - x, - y, + column, + line, tile_x, tile_y, )) diff --git a/examples/src/map/generator.rs b/examples/src/map/generator.rs index 1e95557..3e30c2e 100644 --- a/examples/src/map/generator.rs +++ b/examples/src/map/generator.rs @@ -1,8 +1,8 @@ use std::path::Path; use battle_core::{ - map::{decor::Decor, Map}, - types::Offset, + map::{decor::Decor, terrain::TileType, Map}, + types::{GridPoint, Offset}, }; use super::MapModel; @@ -11,6 +11,8 @@ pub struct MapGenerator { model: T, width: u32, height: u32, + default_tile_type: TileType, + placed: Vec<(GridPoint, TileType)>, } impl MapGenerator { @@ -19,6 +21,8 @@ impl MapGenerator { model, width: Default::default(), height: Default::default(), + default_tile_type: TileType::ShortGrass, + placed: vec![], } } @@ -32,8 +36,23 @@ impl MapGenerator { self } + pub fn place(mut self, value: Vec<(GridPoint, TileType)>) -> Self { + self.placed.extend(value); + self + } + + pub fn default_tile_type(mut self, value: TileType) -> Self { + self.default_tile_type = value; + self + } + pub fn generate(&self) -> Map { - let terrain_tiles = self.model.terrain_tiles(self.width, self.height); + let terrain_tiles = self.model.terrain_tiles( + self.width, + self.height, + self.default_tile_type.clone(), + &self.placed, + ); let terrain_tile_size = self.model.terrain_tile_size(); Map::new( diff --git a/examples/src/map/mod.rs b/examples/src/map/mod.rs index 826a5f3..aba89de 100644 --- a/examples/src/map/mod.rs +++ b/examples/src/map/mod.rs @@ -1,9 +1,18 @@ -use battle_core::map::terrain::TerrainTile; +use battle_core::{ + map::terrain::{TerrainTile, TileType}, + types::GridPoint, +}; pub mod flat; pub mod generator; pub trait MapModel { - fn terrain_tiles(&self, width: u32, height: u32) -> Vec; + fn terrain_tiles( + &self, + width: u32, + height: u32, + default_tile_type: TileType, + placed: &[(GridPoint, TileType)], + ) -> Vec; fn terrain_tile_size(&self) -> u32; } diff --git a/examples/src/runner.rs b/examples/src/runner.rs index 44f9ce4..9a54d38 100644 --- a/examples/src/runner.rs +++ b/examples/src/runner.rs @@ -1,5 +1,8 @@ use battle_core::{ - config::{GuiConfig, ServerConfig, DEFAULT_SERVER_PUB_ADDRESS, DEFAULT_SERVER_REP_ADDRESS}, + config::{ + GuiConfig, ServerConfig, DEFAULT_SERVER_PUB_ADDRESS, DEFAULT_SERVER_REP_ADDRESS, + TARGET_CYCLE_DURATION_US, + }, deployment::Deployment, game::{control::MapControl, Side}, map::Map, @@ -7,6 +10,7 @@ use battle_core::{ state::battle::{message::BattleStateMessage, BattleState}, }; use battle_gui::{ + debug::DebugTerrain, engine::message::{EngineMessage, GuiStateMessage}, run::{run, RunSettings}, GuiError, @@ -20,10 +24,12 @@ use thiserror::Error; pub struct Runner { map: Map, - expire: Option, // FIXME BS NOW: use it deployment: Deployment, begin: bool, + target_cycle_duration: u64, debug_physics: bool, + debug_terrain: DebugTerrain, + when_first_copy_apply: Vec, } impl Runner { @@ -39,7 +45,8 @@ impl Runner { target_fps: 60, interiors_update_freq: 60, }; - let server_config = ServerConfig::default(); + let mut server_config = ServerConfig::default(); + server_config.target_cycle_duration_us = self.target_cycle_duration; let (a_control, b_control) = ( MapControl::new(vec![SpawnZoneName::All]), MapControl::new(vec![SpawnZoneName::All]), @@ -66,6 +73,10 @@ impl Runner { )]) } + engine_apply.push(EngineMessage::GuiState(GuiStateMessage::SetDebugTerrain( + self.debug_terrain.clone(), + ))); + run( settings, config, @@ -79,6 +90,7 @@ impl Runner { true, inputs, engine_apply, + self.when_first_copy_apply, )?; Ok(()) @@ -87,18 +99,15 @@ impl Runner { pub fn new(map: Map) -> Self { Self { map, - expire: None, deployment: Deployment::empty(), begin: false, + target_cycle_duration: TARGET_CYCLE_DURATION_US, debug_physics: false, + debug_terrain: DebugTerrain::None, + when_first_copy_apply: vec![], } } - pub fn expire(mut self, value: Option) -> Self { - self.expire = value; - self - } - pub fn deployment(mut self, value: Deployment) -> Self { self.deployment = value; self @@ -113,6 +122,21 @@ impl Runner { self.debug_physics = value; self } + + pub fn debug_terrain(mut self, value: DebugTerrain) -> Self { + self.debug_terrain = value; + self + } + + pub fn target_cycle_duration(mut self, value: u64) -> Self { + self.target_cycle_duration = value; + self + } + + pub fn when_first_copy_apply(mut self, value: Vec) -> Self { + self.when_first_copy_apply = value; + self + } } #[derive(Error, Debug)] diff --git a/examples/src/scenarios/face_to_face.rs b/examples/src/scenarios/face_to_face.rs index 761de29..7be05af 100644 --- a/examples/src/scenarios/face_to_face.rs +++ b/examples/src/scenarios/face_to_face.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use crate::{ deployment::soldier::ManualSoldiersGenerator, - map::{flat::FlatAndEmpty, generator::MapGenerator}, + map::{flat::Flat, generator::MapGenerator, MapModel}, }; use battle_core::{ deployment::Deployment, @@ -10,8 +10,8 @@ use battle_core::{ weapon::{Magazine, Weapon}, Side, }, - map::Map, - types::{SquadUuid, WorldPoint}, + map::{terrain::TileType, Map}, + types::{GridPoint, SquadUuid, WorldPoint}, }; fn mosin_nagant() -> Weapon { @@ -37,27 +37,61 @@ fn mauser_magazines() -> Vec { Magazine::full(Magazine::Mauser(0)), Magazine::full(Magazine::Mauser(0)), Magazine::full(Magazine::Mauser(0)), + Magazine::full(Magazine::Mauser(0)), + Magazine::full(Magazine::Mauser(0)), ] } -pub fn face_to_face(distance: f32) -> (Map, Deployment) { + +pub fn face_to_face( + default_tile_type: TileType, + distance: f32, + hide: Option, +) -> (Map, Deployment) { let original_x = 75.; - let map = MapGenerator::new(FlatAndEmpty) - .width(500) + let original_y = 50.; + let y_increment = 5.; + let squad_members = 5; + + let place = if let Some(tile_type) = hide { + let mut place = vec![]; + for i in 0..squad_members { + let x = original_x + distance; + let y = original_y + y_increment * i as f32; + let column = x as u32 / Flat.terrain_tile_size(); + let line = y as u32 / Flat.terrain_tile_size(); + place.push(( + GridPoint::new(column as i32, line as i32), + tile_type.clone(), + )); + } + place + } else { + vec![] + }; + + let map = MapGenerator::new(Flat) + .width(1600) .height(150) + .default_tile_type(default_tile_type) + .place(place) .generate(); let soldiers = ManualSoldiersGenerator::default() .side(Side::A) .squad(SquadUuid(0)) .main_weapon(Some(mosin_nagant())) .magazines(mosin_nagant_magazines()) - .world_point(WorldPoint::new(original_x, 50.0)) - .place(5, |p: WorldPoint| p.apply(WorldPoint::new(0., 5.).into())) + .world_point(WorldPoint::new(original_x, original_y)) + .place(squad_members, |p: WorldPoint| { + p.apply(WorldPoint::new(0., y_increment).into()) + }) .side(Side::B) .squad(SquadUuid(1)) .main_weapon(Some(mauser())) .magazines(mauser_magazines()) - .world_point(WorldPoint::new(original_x + distance, 50.0)) - .place(5, |p: WorldPoint| p.apply(WorldPoint::new(0., 5.).into())) + .world_point(WorldPoint::new(original_x + distance, original_y)) + .place(squad_members, |p: WorldPoint| { + p.apply(WorldPoint::new(0., y_increment).into()) + }) .collect(); (map, Deployment::new(soldiers, vec![], HashMap::new())) } diff --git a/resources/ui.png b/resources/ui.png index d264893546c3e0ef63abf52e0b666641b5018de8..e0b1513c8f7f7bec29137e0d5c4db9441ac926fb 100644 GIT binary patch literal 52609 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 KP@(Pk^8W(af|FeU literal 39494 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 Ms~t&JJa_$n1FlG_7XSbN diff --git a/resources/ui.xcf b/resources/ui.xcf index 9040f4b2e4559d82f8ce4e6130740446014c0a6f..ba51b677744cdb9f66568b36f52d73580c00a311 100644 GIT binary patch delta 77171 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
Ec8_d3)6N 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 m1a@?y8@=d94MP~g7$z}|Sny(j