refactor entites to reduce complexity and crashes, switch to Querys
This commit is contained in:
parent
3182916832
commit
c7200b1fd3
8 changed files with 95 additions and 89 deletions
|
|
@ -12,5 +12,5 @@ pub(crate) struct Hovered;
|
|||
#[derive(Component)]
|
||||
pub(crate) struct StartSelect;
|
||||
|
||||
#[derive(Message)]
|
||||
#[derive(Message, Debug)]
|
||||
pub(crate) struct ConfirmSelect(pub(crate) Entity);
|
||||
|
|
|
|||
|
|
@ -1,15 +1,13 @@
|
|||
use std::io::Write as _;
|
||||
use std::ops::Sub;
|
||||
|
||||
use bevy::platform::collections::HashSet;
|
||||
use bevy::prelude::*;
|
||||
use bevy_ratatui::RatatuiContext;
|
||||
use ratatui::layout::{Constraint, Flex, Layout, Offset, Rect, Size};
|
||||
use ratatui::style::{Modifier, Style, Stylize};
|
||||
use ratatui::style::{Modifier, Stylize};
|
||||
use ratatui::widgets::{Block, Borders, Clear, Paragraph};
|
||||
|
||||
use jong::game::hand::{DrawnTile, Hand};
|
||||
use jong::game::player::{MainPlayer, Player};
|
||||
use jong::game::hand::{Drawn, Hand};
|
||||
use jong::game::player::{CurrentPlayer, MainPlayer, Player};
|
||||
use jong::game::round::Wind;
|
||||
use jong::tile::Tile;
|
||||
|
||||
|
|
@ -22,7 +20,7 @@ pub(crate) struct PickRegion {
|
|||
pub(crate) area: Rect,
|
||||
}
|
||||
|
||||
fn render_tile(tile: &Tile, hovered: bool) -> (Paragraph<'_>) {
|
||||
fn render_tile(tile: &Tile, hovered: bool) -> Paragraph<'_> {
|
||||
let block = ratatui::widgets::Block::bordered();
|
||||
let mut widget = Paragraph::new(match &tile.suit {
|
||||
jong::tile::Suit::Pin(rank) => format!("{}\np", rank.0),
|
||||
|
|
@ -99,32 +97,35 @@ pub(crate) fn render(
|
|||
pub(crate) fn render_hands(
|
||||
mut commands: Commands,
|
||||
mut tui: ResMut<RatatuiContext>,
|
||||
|
||||
hovered: Query<Entity, With<Hovered>>,
|
||||
layouts: Res<HandLayouts>,
|
||||
mainplayer: Single<(&Player, &Wind), With<MainPlayer>>,
|
||||
players: Populated<(&Player, /* &Wind, */ &Children)>,
|
||||
hands: Populated<&Children, (With<Hand>, Without<Player>)>,
|
||||
tiles: Populated<&Tile>,
|
||||
drawn_tile: Option<Single<(&Player, &DrawnTile, Entity)>>,
|
||||
|
||||
tiles: Query<&Tile>,
|
||||
main_player: Single<(&Player, &Wind), With<MainPlayer>>,
|
||||
curr_player: Single<Entity, With<CurrentPlayer>>,
|
||||
players: Query<(&Player, &Children)>,
|
||||
hands: Query<(&Children, Entity), (With<Hand>, Without<Player>)>,
|
||||
drawn_tile: Option<Single<(&Player, Entity), With<Drawn>>>,
|
||||
) -> Result {
|
||||
let mut frame = tui.get_frame();
|
||||
debug_blocks(*layouts, &mut frame);
|
||||
|
||||
for (player, /* wind, */ hand_ent) in players {
|
||||
let hand = hand_ent.iter().next().unwrap();
|
||||
let hand: Vec<_> = hands
|
||||
.get(hand)?
|
||||
for (hand, hand_ent) in hands {
|
||||
// debug!("{hand:?}");
|
||||
let (player, _) = players.iter().find(|(_, c)| c.contains(&hand_ent)).unwrap();
|
||||
let hand: Vec<_> = hand
|
||||
.iter()
|
||||
.map(|entity| -> Result<_> {
|
||||
let tile = tiles.get(entity)?;
|
||||
// let paragraph = render_tile(tile,);
|
||||
let tile = tiles.get(entity).unwrap_or_else(|_| panic!("{entity:?}"));
|
||||
let hovered = hovered.contains(entity);
|
||||
let widget = render_tile(tile, hovered);
|
||||
|
||||
Ok((entity, widget, hovered))
|
||||
})
|
||||
.collect::<Result<_>>()?;
|
||||
|
||||
if player == mainplayer.0 {
|
||||
if player == main_player.0 {
|
||||
// split main box into thirds
|
||||
let mut this_hand = layouts.this_hand;
|
||||
let this_drawer = drawn_tile.as_ref().is_some_and(|dt| dt.0 == player);
|
||||
|
|
@ -169,14 +170,14 @@ pub(crate) fn render_hands(
|
|||
|
||||
// tsumo tile
|
||||
if this_drawer {
|
||||
let (_, tile, entity) = **drawn_tile.as_ref().unwrap();
|
||||
let (_, entity) = **drawn_tile.as_ref().unwrap();
|
||||
let mut area = drawn_area.resize(Size {
|
||||
width: 5,
|
||||
height: 4,
|
||||
});
|
||||
area = area.offset(Offset { x: 2, y: 0 });
|
||||
let hovered = hovered.contains(entity);
|
||||
let widget = render_tile(tiles.get(tile.0)?, hovered);
|
||||
let widget = render_tile(tiles.get(entity)?, hovered);
|
||||
if hovered {
|
||||
area = area.offset(Offset { x: 0, y: -1 });
|
||||
let mut hitbox = area.as_size();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue