refactor entites to reduce complexity and crashes, switch to Querys

This commit is contained in:
Tao Tien 2026-01-18 07:53:33 -08:00
parent 3182916832
commit c7200b1fd3
8 changed files with 95 additions and 89 deletions

View file

@ -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);

View file

@ -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();