Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。→6月19日から小笠原沖で、インドネシア人とメカジキ漁

闘い4 エクファンエクスポ


f:id:brogmybana:20250320223721j:image

エクファン世界優勝デッキです。


今日やりたいこと。

マリガン機能再挑戦

カードの複数選択


目的への取り組み

 

マリガン機能で作った関数を一つ一つ、アプリに入れて検証した。


cards_in_deckが、アプリに入れたら、エラーを起こしていた。
chatGPTに聞いてもらったら、引数が変だったことが分かった。
fn cards_in_deck(
query: Query<(Entity, &Card, &Location)>,
in_library_cards: &mut ResMut<InLibraryCards>,
)
元々こういう引数になっていて、
リソースの読み込みが間違っていた。

fn cards_in_deck(
    mut in_library_cards: ResMut<InLibraryCards>, // リソースとして受け取る
    query: Query<(Entity, &Card, &Location)>,
)

このようにmutの位置を治した。
同じミスが、return_all_handsにもあったので修正しました。

fn return_all_hands_to_deck(query: Query<(Entity, &Card, &Location)>, mut commands: Commands, mut in_library_cards: ResMut<InLibraryCards>) {
    for (entity, card, location) in query.iter() {
        if let Location::InHand = location {
            commands.entity(entity).insert(Location::InLibrary); // 手札のカードをすべて山札に移動
            println!("{}, をデッキに戻しました", card.name);
        }
       
    }
    in_library_cards.cards.clear(); // 前回の結果をクリア
}

draw_a_cardは問題なさそうだ。

cards in your deck は、起動すると、entityid順に並び替えてしまうことも分かった。
シャッフルしたまま保持したいなら、cards in your deckは起動しない方がいい。
処理が増えてきたし、関数でやるとまた引数でうるさく言われるので、最初の手札を引くプラグインを作った。

fn show_last_hands(query: Query<(Entity, &Card, &Location)>) {
    println!("Cards in your hand are:");

    for (entity, card, location) in query.iter() {
        if let Location::InHand = location {
            print!("{}, ", card.name);
        }
    }
}

また、for文の中に、print!は使えないという事も分かったので、println!に直した。
最初の5枚を引くだけのプラグインを作った。

struct FirstHandPlugin;

impl Plugin for FirstHandPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(
            PostStartup,
            (
                cards_in_deck,
                shuffle_deck,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                show_last_hands,
            )
                .chain(),
        );
    }
}

OK 最初startupスケジュールで、cards in deckを呼んでいたが、start up関数でカードの読み込みをしてたので、カードが引けないというエラーが沢山出てきていたので、全部post startupスケジュールにした。
return all hand の検証のために、


impl Plugin for FirstHandPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(
            PostStartup,
            (
                cards_in_deck,
                shuffle_deck,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                show_last_hands,
                return_all_hands_to_deck,
                shuffle_deck,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                draw_a_card,
                show_last_hands,
            )
                .chain(),
        );
    }
}

もう1度5枚引くようにした。

fn return_all_hands_to_deck(
    query: Query<(Entity, &Card, &Location)>,
    mut commands: Commands,
    mut in_library_cards: ResMut<InLibraryCards>,
) {
    for (entity, card, location) in query.iter() {
        if let Location::InHand = location {
            commands.entity(entity).insert(Location::InLibrary); // 手札のカードをすべて山札に移動
            println!("{}, をデッキに戻しました", card.name);
            in_library_cards.cards.push(entity);
        }
    }
}

ライブラリーに戻した後、リストに入れてなかったので、エラーが起きてた。
リストに入れるようにした。

8枚しかないから結構かぶってるけど、まぁいいんじゃない?
場合分けはあとで、ステートでやります。
検証
マリガンはプラグインでやればなんとかなる!!
入力を受け付けて場合分けするのはあとでステートでやります。
引数でぜっきょうしちゃいましたからね

目的
カードの複数選択機能を作りたいです。

目的への取り組み、
過去に作った

fn select_a_card_in_hand(query: Query<(Entity, &Card, &Location)>, mut commands: Commands) {
    let mut cards_in_hand = Vec::new();

    println!("Cards in your hand are:");

    for (entity, card, location) in query.iter() {
        if let Location::InHand = location {
            cards_in_hand.push(entity); // エンティティIDを保存
            println!("{}: {}", cards_in_hand.len(), card.name); // 番号を振って表示
        }
    }

    if cards_in_hand.is_empty() {
        println!("No cards in hand.");
        return;
    }

    println!("Select a card by number (1-{}):", cards_in_hand.len());

    let mut input = String::new();
    io::stdin()
        .read_line(&mut input)
        .expect("Failed to read line");

    if let Ok(selected_index) = input.trim().parse::<usize>() {
        if selected_index > 0 && selected_index <= cards_in_hand.len() {
            let selected_entity = cards_in_hand[selected_index - 1];

            if let Ok*1 = query.get(selected_entity) {
                commands.entity(selected_entity).insert(Location::FZone);
                println!(" {} was moved to Fzone.", card.name); // カード名を表示
            }
            println!("You selected card with Entity ID: {:?}", selected_entity);
        } else {
            println!("Invalid selection.");
        }
    } else {
        println!("Please enter a valid number.");
    }
}

この関数を改造すればいいと分かった。
ただ、ちょっともう時間無いので切るわ。


f:id:brogmybana:20250320223716j:image


 

 

*1:_, card, _