use bevy::prelude::*; use bevy_ratatui::RatatuiContext; use jong::game::player::{MainPlayer, Player}; use rand::rand_core::block::BlockRngCore; use ratatui::style::Styled; use ratatui::widgets::{Block, Borders, Widget}; use crate::tui::{ input::mouse::PickRegion, render::{Hovered, hand, tile::RenderedTile}, }; pub(crate) fn draw_ingame( mut commands: Commands, mut tui_ctx: ResMut, main_player: Single, With)>, hovered_entity: Query>, rendered_tiles: Populated<&RenderedTile>, rendered_hand: Res, ) -> Result { use ratatui::layout::Flex; use ratatui::prelude::*; tui_ctx.draw(|frame| { // debug!("{}", frame.area()); let term_area = frame.area(); // TODO this is gross let constraints = [Constraint::Fill(3), Constraint::Fill(18)]; let horizontal_slicer_right = Layout::horizontal(constraints); let vertical_slicer_bottom = Layout::vertical(constraints); let horizontal_slicer_left = Layout::horizontal(constraints.iter().rev()); let vertical_slicer_top = Layout::vertical(constraints.iter().rev()); let [left_hand, this_hand] = horizontal_slicer_right.areas::<2>(term_area); let [_, mut left_hand] = vertical_slicer_bottom.areas::<2>(left_hand); let [_, mut this_hand] = vertical_slicer_top.areas::<2>(this_hand); let [cross_hand, right_hand] = horizontal_slicer_left.areas::<2>(term_area); let [mut right_hand, _] = vertical_slicer_top.areas::<2>(right_hand); let [mut cross_hand, _] = vertical_slicer_bottom.areas::<2>(cross_hand); let margin = Margin::new( (left_hand.width + right_hand.width) / 2, (cross_hand.height + this_hand.height) / 2, ); let pond_area = term_area.inner(margin); let all_pond = Layout::horizontal([Constraint::Fill(1); 3]); let cross_pond = Layout::vertical([Constraint::Fill(1), Constraint::Max(1),Constraint::Fill(1)]); let [mut left_pond, center, mut right_pond] = all_pond.areas::<3>(pond_area); let [cross_pond, compass, this_pond] = cross_pond.areas::<3>(center); // let shift = left_pond.height - cross_pond.height; left_pond.height = cross_pond.height; left_pond.y += cross_pond.height / 2; right_pond.height = cross_pond.height; right_pond.y+= cross_pond.height / 2; let debug_block = Block::new().borders(Borders::ALL); frame.render_widget(debug_block.clone(), this_hand); frame.render_widget(debug_block.clone(), left_hand); frame.render_widget(debug_block.clone(), cross_hand); frame.render_widget(debug_block.clone(), right_hand); frame.render_widget(debug_block.clone(), this_pond); frame.render_widget(debug_block.clone(), left_pond); frame.render_widget(debug_block.clone(), cross_pond); frame.render_widget(debug_block.clone(), right_pond); // TODO attempt to merge blocks on smol term? let layout = Layout::horizontal(vec![Constraint::Max(5); 13]).flex(Flex::Start); let this_clamped = this_hand.height.abs_diff(5); if let Some(val) = this_hand.height.checked_sub(this_clamped) { this_hand.height = val } else { // FIXME show error panic!("terminal too small!"); } this_hand.y += this_clamped + 1; let areas = layout.areas::<13>(this_hand); if let Some(hand) = rendered_hand.0.get(&*main_player) { for (tile, mut tile_area) in hand.iter().zip(areas.into_iter()) { tile_area.height = 4; let mut widget = rendered_tiles.get(*tile).unwrap().0.clone(); if hovered_entity.contains(*tile) { widget = widget.add_modifier(Modifier::BOLD); if let Some(val) = tile_area.y.checked_sub(1) { tile_area.y = val } else { // FIXME show error panic!("terminal too small!"); } } commands .entity(*tile) .insert(PickRegion { area: tile_area }); frame.render_widget(widget, tile_area); } } })?; Ok(()) }