Update to latest dependency versions

This commit is contained in:
Michael Huebner 2025-03-25 12:07:45 +01:00
parent 5f509ba05b
commit b55e4fbbba
5 changed files with 347 additions and 402 deletions

View file

@ -6,8 +6,8 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
engine = { path = "../Gavania/engine", features = ["graphical"] }
engine = { git = "https://gavania.de/hodasemi/engine.git" }
assetpath = { git = "https://gavania.de/hodasemi/vulkan_lib.git" }
ecs = { git = "https://gavania.de/hodasemi/ecs.git" }
anyhow = { version = "1.0.75", features = ["backtrace"] }
anyhow = { version = "1.0.97", features = ["backtrace"] }

View file

@ -27,11 +27,15 @@ impl BoardSlot {
y: usize,
z: usize,
position: Vector2<f32>,
scene: &mut Scene,
world: &mut World,
) -> Result<Self> {
let mut marker = scene.engine().assets().empty_entity();
let mut marker = AssetHandler::create(world).empty_entity();
let meshes = vec![Self::create_mesh(&scene.engine(), Color::Black)?];
let meshes = vec![Self::create_mesh(
world.resources.get::<Context>().device(),
world.resources.get::<EngineSettings>(),
Color::Black,
)?];
let draw = Draw::new(meshes);
marker.insert_component(draw);
@ -47,7 +51,7 @@ impl BoardSlot {
state: Mutex::new(BoardSlotState::default()),
position,
slot_marker: Some(scene.add_entity(marker)?),
slot_marker: Some(world.add_entity(marker)?),
})
}
@ -63,11 +67,12 @@ impl BoardSlot {
}
}
fn create_mesh(engine: &Arc<Engine>, color: Color) -> Result<AssetMesh> {
let mut mesh = AssetMesh::new(
engine.device(),
engine.settings().graphics_info()?.render_type,
)?;
fn create_mesh(
device: &Arc<Device>,
engine_settings: &EngineSettings,
color: Color,
) -> Result<AssetMesh> {
let mut mesh = AssetMesh::new(device, engine_settings.graphics_info()?.render_type)?;
let vertex_buffer = Buffer::builder()
.set_data(&Objects::create_flat_quad([
@ -78,7 +83,7 @@ impl BoardSlot {
]))
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.build(engine.device().clone())?;
.build(device.clone())?;
let a: [f32; 3] = color.into();
@ -157,10 +162,10 @@ pub struct Board {
}
impl Board {
pub fn new(engine: &Arc<Engine>, scene: &mut SceneHandle) -> Result<Self> {
let mut board_entity = engine.assets().empty_entity();
pub fn new(world: &mut World) -> Result<Self> {
let mut board_entity = AssetHandler::create(world).empty_entity();
let meshes = vec![Self::create_board_base(&engine)?];
let meshes = vec![Self::create_board_base(&world)?];
let draw = Draw::new(meshes);
board_entity.insert_component(draw);
@ -168,102 +173,85 @@ impl Board {
let location = Location::from_entity(&mut board_entity);
board_entity.insert_component(location);
let mut board = None;
let mut slots = None;
let board = world.add_entity(board_entity)?;
scene.on_scene(|scene| {
board = Some(scene.add_entity(board_entity)?);
slots = Some([
let slots = [
[
[
[
BoardSlot::new(0, 0, 0, vec2(-15.0, -15.0), scene)?, // 0 0 0
BoardSlot::new(0, 0, 1, vec2(-10.0, -10.0), scene)?, // 0 0 1
BoardSlot::new(0, 0, 2, vec2(-5.0, -5.0), scene)?, // 0 0 2
],
[
BoardSlot::new(0, 1, 0, vec2(-15.0, 0.0), scene)?, // 0 1 0
BoardSlot::new(0, 1, 1, vec2(-10.0, 0.0), scene)?, // 0 1 1
BoardSlot::new(0, 1, 2, vec2(-5.0, 0.0), scene)?, // 0 1 2
],
[
BoardSlot::new(0, 2, 0, vec2(-15.0, 15.0), scene)?, // 0 2 0
BoardSlot::new(0, 2, 1, vec2(-10.0, 10.0), scene)?, // 0 2 1
BoardSlot::new(0, 2, 2, vec2(-5.0, 5.0), scene)?, // 0 2 2
],
BoardSlot::new(0, 0, 0, vec2(-15.0, -15.0), world)?, // 0 0 0
BoardSlot::new(0, 0, 1, vec2(-10.0, -10.0), world)?, // 0 0 1
BoardSlot::new(0, 0, 2, vec2(-5.0, -5.0), world)?, // 0 0 2
],
[
[
BoardSlot::new(1, 0, 0, vec2(0.0, -15.0), scene)?, // 1 0 0
BoardSlot::new(1, 0, 1, vec2(0.0, -10.0), scene)?, // 1 0 1
BoardSlot::new(1, 0, 2, vec2(0.0, -5.0), scene)?, // 1 0 2
],
[
BoardSlot::invalid(1, 1, 0), // 1 1 0
BoardSlot::invalid(1, 1, 1), // 1 1 1
BoardSlot::invalid(1, 1, 2), // 1 1 2
],
[
BoardSlot::new(1, 2, 0, vec2(0.0, 15.0), scene)?, // 1 2 0
BoardSlot::new(1, 2, 1, vec2(0.0, 10.0), scene)?, // 1 2 1
BoardSlot::new(1, 2, 2, vec2(0.0, 5.0), scene)?, // 1 2 2
],
BoardSlot::new(0, 1, 0, vec2(-15.0, 0.0), world)?, // 0 1 0
BoardSlot::new(0, 1, 1, vec2(-10.0, 0.0), world)?, // 0 1 1
BoardSlot::new(0, 1, 2, vec2(-5.0, 0.0), world)?, // 0 1 2
],
[
[
BoardSlot::new(2, 0, 0, vec2(15.0, -15.0), scene)?, // 2 0 0
BoardSlot::new(2, 0, 1, vec2(10.0, -10.0), scene)?, // 2 0 1
BoardSlot::new(2, 0, 2, vec2(5.0, -5.0), scene)?, // 2 0 2
],
[
BoardSlot::new(2, 1, 0, vec2(15.0, 0.0), scene)?, // 2 1 0
BoardSlot::new(2, 1, 1, vec2(10.0, 0.0), scene)?, // 2 1 1
BoardSlot::new(2, 1, 2, vec2(5.0, 0.0), scene)?, // 2 1 2
],
[
BoardSlot::new(2, 2, 0, vec2(15.0, 15.0), scene)?, // 2 2 0
BoardSlot::new(2, 2, 1, vec2(10.0, 10.0), scene)?, // 2 2 1
BoardSlot::new(2, 2, 2, vec2(5.0, 5.0), scene)?, // 2 2 2
],
BoardSlot::new(0, 2, 0, vec2(-15.0, 15.0), world)?, // 0 2 0
BoardSlot::new(0, 2, 1, vec2(-10.0, 10.0), world)?, // 0 2 1
BoardSlot::new(0, 2, 2, vec2(-5.0, 5.0), world)?, // 0 2 2
],
]);
Ok(())
})?;
],
[
[
BoardSlot::new(1, 0, 0, vec2(0.0, -15.0), world)?, // 1 0 0
BoardSlot::new(1, 0, 1, vec2(0.0, -10.0), world)?, // 1 0 1
BoardSlot::new(1, 0, 2, vec2(0.0, -5.0), world)?, // 1 0 2
],
[
BoardSlot::invalid(1, 1, 0), // 1 1 0
BoardSlot::invalid(1, 1, 1), // 1 1 1
BoardSlot::invalid(1, 1, 2), // 1 1 2
],
[
BoardSlot::new(1, 2, 0, vec2(0.0, 15.0), world)?, // 1 2 0
BoardSlot::new(1, 2, 1, vec2(0.0, 10.0), world)?, // 1 2 1
BoardSlot::new(1, 2, 2, vec2(0.0, 5.0), world)?, // 1 2 2
],
],
[
[
BoardSlot::new(2, 0, 0, vec2(15.0, -15.0), world)?, // 2 0 0
BoardSlot::new(2, 0, 1, vec2(10.0, -10.0), world)?, // 2 0 1
BoardSlot::new(2, 0, 2, vec2(5.0, -5.0), world)?, // 2 0 2
],
[
BoardSlot::new(2, 1, 0, vec2(15.0, 0.0), world)?, // 2 1 0
BoardSlot::new(2, 1, 1, vec2(10.0, 0.0), world)?, // 2 1 1
BoardSlot::new(2, 1, 2, vec2(5.0, 0.0), world)?, // 2 1 2
],
[
BoardSlot::new(2, 2, 0, vec2(15.0, 15.0), world)?, // 2 2 0
BoardSlot::new(2, 2, 1, vec2(10.0, 10.0), world)?, // 2 2 1
BoardSlot::new(2, 2, 2, vec2(5.0, 5.0), world)?, // 2 2 2
],
],
];
let distance = 20.0;
let white_start_slots = [
vec2(-16.0, distance),
vec2(-12.0, distance),
vec2(-8.0, distance),
vec2(-4.0, distance),
vec2(0.0, distance),
vec2(4.0, distance),
vec2(8.0, distance),
vec2(12.0, distance),
vec2(16.0, distance),
];
let white_start_slots = (16..=16)
.step_by(4)
.map(|x| vec2(x as f32, distance))
.collect()
.try_into()
.unwrap();
let black_start_slots = [
vec2(-16.0, -distance),
vec2(-12.0, -distance),
vec2(-8.0, -distance),
vec2(-4.0, -distance),
vec2(0.0, -distance),
vec2(4.0, -distance),
vec2(8.0, -distance),
vec2(12.0, -distance),
vec2(16.0, -distance),
];
let black_start_slots = (16..=16)
.step_by(4)
.map(|x| vec2(x as f32, -distance))
.collect()
.try_into()
.unwrap();
Ok(Self {
_board: board.unwrap(),
_board: board,
center: vec3(0.0, 0.0, 0.0),
_connection_lines: Self::create_connection_lines(scene, Color::Black)?,
_connection_lines: Self::create_connection_lines(world, Color::Black)?,
slots: slots.unwrap(),
slots,
white_start_slots,
black_start_slots,
})
@ -374,10 +362,14 @@ impl Board {
}
impl Board {
fn create_board_base(engine: &Arc<Engine>) -> Result<AssetMesh> {
fn create_board_base(world: &World) -> Result<AssetMesh> {
let mut board_base = AssetMesh::new(
engine.device(),
engine.settings().graphics_info()?.render_type,
world.resources.get::<Context>().device(),
world
.resources
.get::<EngineSettings>()
.graphics_info()?
.render_type,
)?;
let vertex_buffer = Buffer::builder()
@ -387,7 +379,7 @@ impl Board {
))
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.build(engine.device().clone())?;
.build(world.resources.get::<Context>().device().clone())?;
let color = Color::try_from("#b77b2b")?;
let a: [f32; 3] = color.into();
@ -410,185 +402,154 @@ impl Board {
Ok(board_base)
}
fn create_connection_lines(scene: &mut SceneHandle, color: Color) -> Result<Vec<Entity>> {
fn create_connection_lines(world: &mut World, color: Color) -> Result<Vec<Entity>> {
let mut entities = Vec::new();
scene.on_scene(|scene| {
let mut lines = scene.engine().assets().empty_entity();
let mut lines = AssetHandler::create(world).empty_entity();
let draw = Draw::new(vec![{
let mut mesh = AssetMesh::new(
scene.engine().device(),
scene.engine().settings().graphics_info()?.render_type,
)?;
let draw = Draw::new(vec![{
let mut mesh = AssetMesh::new(
world.resources.get::<Context>().device(),
world
.resources
.get::<EngineSettings>()
.graphics_info()?
.render_type,
)?;
let vertex_buffer = Buffer::builder()
.set_data(
&[
Objects::create_flat_quad([
vec2(-15.25, -15.25),
vec2(15.25, -15.25),
vec2(15.25, -14.75),
vec2(-15.25, -14.75),
]),
Objects::create_flat_quad([
vec2(-10.25, -10.25),
vec2(10.25, -10.25),
vec2(10.25, -9.75),
vec2(-10.25, -9.75),
]),
Objects::create_flat_quad([
vec2(-5.25, -5.25),
vec2(5.25, -5.25),
vec2(5.25, -4.75),
vec2(-5.25, -4.75),
]),
Objects::create_flat_quad([
vec2(-15.25, 14.75),
vec2(15.25, 14.75),
vec2(15.25, 15.25),
vec2(-15.25, 15.25),
]),
Objects::create_flat_quad([
vec2(-10.25, 9.75),
vec2(10.25, 9.75),
vec2(10.25, 10.25),
vec2(-10.25, 10.25),
]),
Objects::create_flat_quad([
vec2(-5.25, 4.75),
vec2(5.25, 4.75),
vec2(5.25, 5.25),
vec2(-5.25, 5.25),
]),
Objects::create_flat_quad([
vec2(-14.75, -15.25),
vec2(-14.75, 15.25),
vec2(-15.25, 15.25),
vec2(-15.25, -15.25),
]),
Objects::create_flat_quad([
vec2(-9.75, -10.25),
vec2(-9.75, 10.25),
vec2(-10.25, 10.25),
vec2(-10.25, -10.25),
]),
Objects::create_flat_quad([
vec2(-4.75, -5.25),
vec2(-4.75, 5.25),
vec2(-5.25, 5.25),
vec2(-5.25, -5.25),
]),
Objects::create_flat_quad([
vec2(15.25, -15.25),
vec2(15.25, 15.25),
vec2(14.75, 15.25),
vec2(14.75, -15.25),
]),
Objects::create_flat_quad([
vec2(10.25, -10.25),
vec2(10.25, 10.25),
vec2(9.75, 10.25),
vec2(9.75, -10.25),
]),
Objects::create_flat_quad([
vec2(5.25, -5.25),
vec2(5.25, 5.25),
vec2(4.75, 5.25),
vec2(4.75, -5.25),
]),
Objects::create_flat_quad([
vec2(0.25, -15.25),
vec2(0.25, -4.75),
vec2(-0.25, -4.75),
vec2(-0.25, -15.25),
]),
Objects::create_flat_quad([
vec2(-0.25, 15.25),
vec2(-0.25, 4.75),
vec2(0.25, 4.75),
vec2(0.25, 15.25),
]),
Objects::create_flat_quad([
vec2(-15.25, -0.25),
vec2(-4.75, -0.25),
vec2(-4.75, 0.25),
vec2(-15.25, 0.25),
]),
Objects::create_flat_quad([
vec2(15.25, 0.25),
vec2(4.75, 0.25),
vec2(4.75, -0.25),
vec2(15.25, -0.25),
]),
]
.concat(),
)
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.build(scene.engine().device().clone())?;
let vertex_buffer = Buffer::builder()
.set_data(
&[
Objects::create_flat_quad([
vec2(-15.25, -15.25),
vec2(15.25, -15.25),
vec2(15.25, -14.75),
vec2(-15.25, -14.75),
]),
Objects::create_flat_quad([
vec2(-10.25, -10.25),
vec2(10.25, -10.25),
vec2(10.25, -9.75),
vec2(-10.25, -9.75),
]),
Objects::create_flat_quad([
vec2(-5.25, -5.25),
vec2(5.25, -5.25),
vec2(5.25, -4.75),
vec2(-5.25, -4.75),
]),
Objects::create_flat_quad([
vec2(-15.25, 14.75),
vec2(15.25, 14.75),
vec2(15.25, 15.25),
vec2(-15.25, 15.25),
]),
Objects::create_flat_quad([
vec2(-10.25, 9.75),
vec2(10.25, 9.75),
vec2(10.25, 10.25),
vec2(-10.25, 10.25),
]),
Objects::create_flat_quad([
vec2(-5.25, 4.75),
vec2(5.25, 4.75),
vec2(5.25, 5.25),
vec2(-5.25, 5.25),
]),
Objects::create_flat_quad([
vec2(-14.75, -15.25),
vec2(-14.75, 15.25),
vec2(-15.25, 15.25),
vec2(-15.25, -15.25),
]),
Objects::create_flat_quad([
vec2(-9.75, -10.25),
vec2(-9.75, 10.25),
vec2(-10.25, 10.25),
vec2(-10.25, -10.25),
]),
Objects::create_flat_quad([
vec2(-4.75, -5.25),
vec2(-4.75, 5.25),
vec2(-5.25, 5.25),
vec2(-5.25, -5.25),
]),
Objects::create_flat_quad([
vec2(15.25, -15.25),
vec2(15.25, 15.25),
vec2(14.75, 15.25),
vec2(14.75, -15.25),
]),
Objects::create_flat_quad([
vec2(10.25, -10.25),
vec2(10.25, 10.25),
vec2(9.75, 10.25),
vec2(9.75, -10.25),
]),
Objects::create_flat_quad([
vec2(5.25, -5.25),
vec2(5.25, 5.25),
vec2(4.75, 5.25),
vec2(4.75, -5.25),
]),
Objects::create_flat_quad([
vec2(0.25, -15.25),
vec2(0.25, -4.75),
vec2(-0.25, -4.75),
vec2(-0.25, -15.25),
]),
Objects::create_flat_quad([
vec2(-0.25, 15.25),
vec2(-0.25, 4.75),
vec2(0.25, 4.75),
vec2(0.25, 15.25),
]),
Objects::create_flat_quad([
vec2(-15.25, -0.25),
vec2(-4.75, -0.25),
vec2(-4.75, 0.25),
vec2(-15.25, 0.25),
]),
Objects::create_flat_quad([
vec2(15.25, 0.25),
vec2(4.75, 0.25),
vec2(4.75, -0.25),
vec2(15.25, -0.25),
]),
]
.concat(),
)
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.build(world.resources.get::<Context>().device().clone())?;
let a: [f32; 3] = color.into();
let a: [f32; 3] = color.into();
mesh.add_primitive(
vertex_buffer,
None,
None,
PrimitiveMaterial {
color: [a[0], a[1], a[2], 1.0],
metallic_factor: 0.2,
emissive_factor: [0.2, 0.2, 0.2],
roughness_factor: 0.8,
alpha_mode: AlphaMode::Opaque,
alpha_cut_off: 0.5,
},
true,
)?;
mesh.add_primitive(
vertex_buffer,
None,
None,
PrimitiveMaterial {
color: [a[0], a[1], a[2], 1.0],
metallic_factor: 0.2,
emissive_factor: [0.2, 0.2, 0.2],
roughness_factor: 0.8,
alpha_mode: AlphaMode::Opaque,
alpha_cut_off: 0.5,
},
true,
)?;
mesh
}]);
lines.insert_component(draw);
mesh
}]);
lines.insert_component(draw);
let mut location = Location::from_entity(&mut lines);
location.set_offset(vec3(0.0, 0.0, MillGame::OFFSET_TO_BOARD));
lines.insert_component(location);
let mut location = Location::from_entity(&mut lines);
location.set_offset(vec3(0.0, 0.0, MillGame::OFFSET_TO_BOARD));
lines.insert_component(location);
entities.push(scene.add_entity(lines)?);
Ok(())
})?;
entities.push(world.add_entity(lines)?);
Ok(entities)
}
}
impl Map for Board {
fn name(&self) -> &str {
"MillBoard"
}
fn check_walkability(
&self,
_position: cgmath::Vector2<f32>,
_direction: cgmath::Vector2<f32>,
_radius: f32,
) -> Result<bool> {
Ok(true)
}
fn get_height(&self, _x: f32, _y: f32) -> Result<f32> {
Ok(0.0)
}
fn spawn_positions(&self) -> Result<Vec<cgmath::Vector3<f32>>> {
Ok(vec![])
}
fn leave_markers(&self) -> Result<Vec<Entity>> {
Ok(vec![])
}
fn disable(&self, _scene: &mut Scene) -> Result<()> {
unreachable!()
}
}

View file

@ -218,28 +218,22 @@ impl TurnState {
}
pub struct MillGame {
engine: Arc<Engine>,
last_turn_timing: Mutex<Duration>,
last_turn_timing: Duration,
board: Arc<Mutex<Board>>,
white_stones: Mutex<[Stone; 9]>,
black_stones: Mutex<[Stone; 9]>,
board: Board,
white_stones: [Stone; 9],
black_stones: [Stone; 9],
state: Mutex<GameState>,
current_player: Mutex<PlayerColor>,
state: GameState,
current_player: PlayerColor,
scene: Mutex<SceneHandle>,
camera_controls: Mutex<CameraControl>,
mouse_x: u32,
mouse_y: u32,
mouse_x: AtomicU32,
mouse_y: AtomicU32,
turn_finished: bool,
turn_states: Vec<TurnState>,
turn_finished: AtomicBool,
turn_states: Mutex<Vec<TurnState>>,
selected_field: Mutex<Option<(usize, usize, usize)>>,
simple_ai: SimpleAI,
selected_field: Option<(usize, usize, usize)>,
white_player_label: Arc<Label>,
black_player_label: Arc<Label>,
@ -253,79 +247,63 @@ impl MillGame {
pub const OFFSET_TO_BOARD: f32 = 0.02;
pub const TURN_WAIT_TIME: Duration = Duration::from_millis(500);
pub fn new(engine: Arc<Engine>) -> Result<Arc<Self>> {
let mut scene = SceneHandle::new(&engine)?;
let board = Board::new(&engine, &mut scene)?;
pub fn new(world: &mut World) -> Result<()> {
let board = Board::new(world)?;
let mut white_stones = None;
let mut black_stones = None;
// add light
let mut sun_light = Light::directional_light(world.resources.get::<Context>().device());
sun_light.set_direction(vec3(10.0, -4.0, -20.0))?;
sun_light.set_color(vec3(1.0, 1.0, 1.0))?;
sun_light.set_position(vec3(0.0, 0.0, 100.0))?;
sun_light.set_power(10000000000.0)?;
scene.on_scene(|scene| {
let view = scene.view_mut();
let scene = world.resources.get_mut::<Scene>();
scene.add_light(sun_light)?;
view.camera_mut().set_center(board.center());
view.update_buffer()?;
let view = scene.view_mut();
view.camera_mut().set_center(board.center());
view.update_buffer()?;
// add light
let mut sun_light = engine.new_directional_light()?;
sun_light.set_direction(vec3(10.0, -4.0, -20.0))?;
sun_light.set_color(vec3(1.0, 1.0, 1.0))?;
sun_light.set_position(vec3(0.0, 0.0, 100.0))?;
sun_light.set_power(10000000000.0)?;
let white_stones = Self::init_nine_stones(world, Color::White)?
.into_iter()
.enumerate()
.map(|(index, mut e)| {
let location = e.get_component_mut::<Location>()?;
location.set_position(board.white_start_slots()[index].extend(0.0));
scene.add_light(sun_light)?;
Ok(Stone {
stone: world.add_entity(e)?,
state: StoneState::ReadyToBePlaced,
})
})
.collect::<Result<Vec<Stone>>>()?
.try_into()
.unwrap_or_else(|_: Vec<Stone>| unreachable!("create array from vec from an array"));
white_stones = Some(
Self::init_nine_stones(&engine, Color::White)?
.into_iter()
.enumerate()
.map(|(index, mut e)| {
let location = e.get_component_mut::<Location>()?;
location.set_position(board.white_start_slots()[index].extend(0.0));
let black_stones = Self::init_nine_stones(world, Color::try_from("#2c2c2c")?)?
.into_iter()
.enumerate()
.map(|(index, mut e)| {
let location = e.get_component_mut::<Location>()?;
location.set_position(board.black_start_slots()[index].extend(0.0));
Ok(Stone {
stone: scene.add_entity(e)?,
state: StoneState::ReadyToBePlaced,
})
})
.collect::<Result<Vec<Stone>>>()?
.try_into()
.unwrap_or_else(|_: Vec<Stone>| {
unreachable!("create array from vec from an array")
}),
);
Ok(Stone {
stone: world.add_entity(e)?,
state: StoneState::ReadyToBePlaced,
})
})
.collect::<Result<Vec<Stone>>>()?
.try_into()
.unwrap_or_else(|_: Vec<Stone>| unreachable!("create array from vec from an array"));
black_stones = Some(
Self::init_nine_stones(&engine, Color::try_from("#2c2c2c")?)?
.into_iter()
.enumerate()
.map(|(index, mut e)| {
let location = e.get_component_mut::<Location>()?;
location.set_position(board.black_start_slots()[index].extend(0.0));
Ok(Stone {
stone: scene.add_entity(e)?,
state: StoneState::ReadyToBePlaced,
})
})
.collect::<Result<Vec<Stone>>>()?
.try_into()
.unwrap_or_else(|_: Vec<Stone>| {
unreachable!("create array from vec from an array")
}),
);
Ok(())
})?;
let mut camera_control = CameraControl::new(&mut scene)?;
let mut camera_control = TopDownCameraControl::new(&mut scene)?;
camera_control.set_zoom_levels(
(3..60).into_iter().rev().map(|z| z as f32).collect(),
5,
&mut scene,
)?;
scene.activate()?;
world.resources.insert(camera_control);
let gui = GuiBuilder::new(
engine.gui_handler(),
@ -340,31 +318,50 @@ impl MillGame {
let black_player_label: Arc<Label> = gui.element("black_player_label")?;
let start_button: Arc<Button> = gui.element("start")?;
gui.enable()?;
gui.enable(world.resources.get_mut::<GuiHandler>())?;
let me = Arc::new(Self {
engine: engine.clone(),
last_turn_timing: Mutex::default(),
start_button.set_callback({
let weak_grid = Arc::downgrade(&grid);
board: Arc::new(Mutex::new(board)),
white_stones: Mutex::new(white_stones.unwrap()),
black_stones: Mutex::new(black_stones.unwrap()),
move |world| {
if let Some(grid) = weak_grid.upgrade() {
grid.detach(world, 1, 0)?;
}
state: Mutex::new(GameState::Waiting),
current_player: Mutex::new(PlayerColor::White),
let now = world.now();
let me = world.resources.get_mut::<Self>();
scene: Mutex::new(scene),
camera_controls: Mutex::new(camera_control),
Self::log(" ===== START GAME =====", LogSeverity::Basic);
mouse_x: AtomicU32::new(0),
mouse_y: AtomicU32::new(0),
me.state = GameState::Placing;
me.current_player = PlayerColor::Black;
turn_finished: AtomicBool::new(false),
turn_states: Mutex::default(),
me.finish_turn();
me.last_turn_timing = now;
selected_field: Mutex::default(),
Ok(())
}
});
simple_ai: SimpleAI::new(PlayerColor::White),
world.resources.insert(SimpleAI::new(PlayerColor::White));
let me = Self {
last_turn_timing: Duration::default(),
board,
white_stones,
black_stones,
state: GameState::Waiting,
current_player: PlayerColor::White,
mouse_x: 0,
mouse_y: 0,
turn_finished: false,
turn_states: TurnState::default(),
selected_field: None,
_grid: grid.clone(),
white_player_label,
@ -372,32 +369,11 @@ impl MillGame {
_start_button: start_button.clone(),
_gui: gui,
});
};
start_button.set_callback({
let weak_grid = Arc::downgrade(&grid);
let weak_self = Arc::downgrade(&me);
world.resources.insert(me);
move || {
if let Some(grid) = weak_grid.upgrade() {
grid.detach(1, 0)?;
}
if let Some(me) = weak_self.upgrade() {
Self::log(" ===== START GAME =====", LogSeverity::Basic);
*me.state.lock().unwrap() = GameState::Placing;
*me.current_player.lock().unwrap() = PlayerColor::Black;
me.finish_turn();
*me.last_turn_timing.lock().unwrap() = me.engine.time();
}
Ok(())
}
});
Ok(me)
Ok(())
}
pub fn finish_turn(&self) {
@ -570,16 +546,16 @@ impl MillGame {
Ok(())
}
fn stones(&self, player_color: PlayerColor) -> MutexGuard<'_, [Stone; 9]> {
fn stones(&self, player_color: PlayerColor) -> &[Stone; 9] {
match player_color {
PlayerColor::White => self.white_stones.lock().unwrap(),
PlayerColor::Black => self.black_stones.lock().unwrap(),
PlayerColor::White => &self.white_stones,
PlayerColor::Black => &self.black_stones,
}
}
fn init_nine_stones(engine: &Arc<Engine>, color: Color) -> Result<[EntityObject; 9]> {
fn init_nine_stones(world: &mut World, color: Color) -> Result<[EntityObject; 9]> {
Ok((0..9)
.map(|_| Self::init_stone(engine, color))
.map(|_| Self::init_stone(world, color))
.collect::<Result<Vec<EntityObject>>>()?
.try_into()
.unwrap_or_else(|_: Vec<EntityObject>| {
@ -587,20 +563,24 @@ impl MillGame {
}))
}
fn init_stone(engine: &Arc<Engine>, color: Color) -> Result<EntityObject> {
let mut marker = engine.assets().empty_entity();
fn init_stone(world: &mut World, color: Color) -> Result<EntityObject> {
let mut marker = AssetHandler::create(world).empty_entity();
let draw = Draw::new(vec![{
let mut mesh = AssetMesh::new(
engine.device(),
engine.settings().graphics_info()?.render_type,
world.resources.get::<Context>().device(),
world
.resources
.get::<EngineSettings>()
.graphics_info()?
.render_type,
)?;
let vertex_buffer = Buffer::builder()
.set_data(&Objects::create_cylinder(1.1, 0.25, 30))
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.build(engine.device().clone())?;
.build(world.resources.get::<Context>().device().clone())?;
let a: [f32; 3] = color.into();

View file

@ -9,6 +9,12 @@ use engine::prelude::*;
use game::MillGame;
fn main() -> Result<()> {
let mut world_builder = World::builder();
world_builder.build().run()
}
fn create_engine(world_builder: &mut WorldBuilder) -> Result<()> {
let mut create_info = EngineCreateInfo::default();
create_info.resource_base_path = "resources".to_string();
@ -17,7 +23,7 @@ fn main() -> Result<()> {
create_info.gui_info.menu_button = AssetPath::from("button_dark.png");
create_info.gui_info.menu_button_selected = AssetPath::from("button_light.png");
create_info.gui_info.resource_directory =
AssetPath::from((create_info.resource_base_path.as_str(), ""));
AssetPath::from((create_info.resource_base_path.as_str(), "")).into();
create_info.graphics_info.render_scale = 1.0;
create_info.graphics_info.vsync = true;
@ -32,9 +38,7 @@ fn main() -> Result<()> {
create_info.enable_keyboard = true;
create_info.enable_mouse = true;
let engine = Engine::new(create_info)?;
let engine = Engine::new(create_info, world_builder)?;
engine.set_game_object(Some(MillGame::new(engine.clone())?))?;
engine.run()
Ok(())
}

View file

@ -19,7 +19,7 @@ impl SimpleAI {
&self,
stones: &mut [Stone; 9],
board: &mut [[[BoardSlot; 3]; 3]; 3],
scene: &mut SceneHandle,
world: &mut World,
state: &mut GameState,
) -> Result<()> {
MillGame::log(&format!("AI at state {:?}", *state), LogSeverity::Debug);