Behind Coleus

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

戦い7

今日は昼過ぎまで取り敢えずプログラミングやる

今日の目的、

準備フェーズを作る

目的への取り組み、

この前作った、リソースでターンプレイヤーを表す関数は、Updateで更新し続ける方がいいような気がしたので、ちょっと作り変える。

pub fn update_score(score: Res<Score>) {
    if score.is_changed() {
        println!("score: {}", score.value.to_string())
    }
}

昔作ったこれを、改造して.run if()で動かす

pub fn update_turn_player(turn: Res<TurnCount>, playersort: Res<PlayerSort>, mut turnplayer: ResMut<TurnPlayer>) {
    if turn.is_changed() {
        if turn.value % 2 == 1 {
            turnplayer.turnplayer_id = playersort.firstplayer_id;
        } else {
            turnplayer.turnplayer_id = playersort.secondplayer_id;
        }
        println!("{}, のターンです", turnplayer.turnplayer_id,);
    }
}

        .add_systems(Update, update_turn_player.run_if(in_state(GameState::Play)))
 

やっぱり今日から、集中して3日やることを考えると、ファイルを分割していきたい。

brogmymxo.hatenablog.comこれを参考に進めていった。

 

色々分割して

ここまでたどり着きました。

また、システムがプライベートになっていることと、stateの読み込みをしなかったことがだいたいのエラーの原因でした!!

まぁ3時間エラーとにらめっこすればできる事。

一回駅行ってくる。

 

戻ってきたから、準備フェーズをやる。


pub fn set_up_draw(
    query: Query<(Entity, &Card, &Location)>,     // クエリとして受け取る
    mut in_library_cards: ResMut<InLibraryCards>, // ミュータブル参照として受け取る
    mut commands: Commands,                        // コマンド用
    mut turn_player: ResMut<TurnPlayer>,          // ResMutを使う
    mut winner: ResMut<Winner>,                    // ResMutを使う
    mut next_state: ResMut<NextState<GameState>>,  // ResMutを使う
    turn: Res<TurnCount>,                          // 不変の参照
) {
    if turn.value == 1 {
        println!("先行なのでドローなしで")
    } else {
        if let Some(&top_card) = in_library_cards.cards.first() {
            if let Ok*1 = query.get(top_card) {
                println!(
                    "あなたは {}, を引きました entity id: {:?},",
                    card.name, top_card
                );
                commands.entity(top_card).insert(Location::InHand);
                in_library_cards.cards.remove(0); // 先頭のカードを削除
            } else {
                println!("No cards available in the deck.");
            }
        } else {
            println!("デッキにカードがありません。");
            winner.winner_id = turn_player.non_turnplayer_id;
            println!("{}, の勝利です", winner.winner_id,);
            next_state.set(GameState::GameOver)
        }
    }
}

これは結構めんどくさくて、1ターン目はドローなし、

デッキにカードが無かったら、勝敗を決めます。

 

 

準備フェーズ 入力を受け付け山札からカードを1枚引く Fゾーンのカードをリスピンする Sゾーンのカードをリスピンする 条件を確認して、撤退フェーズに移行する 条件を確認して、Xフェーズに移行する 条件を確認して、メインフェーズに移行する

アメリカに行ってNMIXXのライブ見る夢見た - Behind Coleus

次はリスピン

手札をすべて山札に戻す関数を真似すればいい。

pub 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);
        }
    }
}

これを改造して、FゾーンのカードとSゾーンのカードをリスピンしました

pub fn respin_cards(
    query: Query<(Entity, &Card, &Location, &SpinCondition)>,
    mut commands: Commands,
) {
    for (entity, card, location, spincondition) in query.iter() {
        if let Location::FZone = location {
            if let SpinCondition::Spin = spincondition{
                commands.entity(entity).insert(SpinCondition::ReSpin);
                println!("{}, をリスピンしました", card.name);
            }
        }

        if let Location::SZone = location {
            if let SpinCondition::Spin = spincondition{
                commands.entity(entity).insert(SpinCondition::ReSpin);
                println!("{}, をリスピンしました", card.name);
            }
        }
    }
}

最初の読み込みで、スピン状態のカードをFとSに入れた。

    let my_entity = commands
        .spawn*2
        .id();

    println!("{:?} is spawned", my_entity);

    let my_entity = commands
    .spawn*3
    .id();

println!("{:?} is spawned", my_entity);

OKそうです。

次は条件の確認関数を作る
chatGPTによると、システム内にbool変数のフラグを作るのがいいらしい。

pub fn check_fzone(
    query: Query<&Card, With<Location>>, // Cardコンポーネントを持つエンティティをクエリ
) {
    // FZoneを持つカードが存在するかどうかをフラグで管理
    let mut has_fzone_card = false;

    // クエリで取得したカードをチェック
    for card in query.iter() {
        // 各カードのLocationをチェック
        if card.location == Location::FZone {
            has_fzone_card = true; // FZoneのカードが見つかった場合
            break;
        }
    }

    // FZoneのカードが存在しない場合の処理
    if !has_fzone_card {
        println!("FZoneのカードが存在しないため、特定の処理を行います。");
        // ここに処理を書く
    }
}

その前に、どういうパターンかを考える

 

なお、自分のXゾーンにカードが1枚もないのなら、このフェーズをスキップします。

note.com

これを知っていたから、撤退フェーズもFゾーンがなければ、スキップなのかなと思ってたけど、そんなことは1mmも書いてなかった

 だから、Xゾーンにカードが無い時だけ、考える。

撤退フェーズに入ったらチェインで処理する前にこれを解決する。


pub fn check_condition(
    query: Query<&Card, With<Location>>,
    mut next_state: ResMut<NextState<PlayState>>,// Cardコンポーネントを持つエンティティをクエリ
) {
        // FZoneを持つカードが存在するかどうかをフラグで管理
        let mut has_fzone_card = false;

        // XZoneを持つカードが存在するかどうかをフラグで管理
        let mut has_xzone_card = false;

        // クエリで取得したカードをチェック
        for card in query.iter() {
            // 各カードのLocationをチェック
            if card.location == Location::XZone {
                has_xzone_card = true; // FZoneのカードが見つかった場合
                break;
            }

            if card.location == Location::FZone {
                has_fzone_card = true; // FZoneのカードが見つかった場合
                break;
            }
        }
   
        // XZoneのカードが存在しない場合の処理
        if !has_fzone_card {
            if !has_xzone_card{
                println!("FZoneのカードが存在しないため、撤退フェーズは終わります。");
                println!("XZoneのカードが存在しないため、Xフェーズはスキップされます");
                next_state.set(PlayState::MainPhase);
            }
            else{
                println!("FZoneのカードが存在しないため、撤退フェーズは終わります。");
                next_state.set(PlayState::XPhase);
            }
           
        }


}

撤退フェーズでカードの選択が起きる前に

Fゾーンのカードがなかったら、撤退できないから、自動的にXphaseに、
xゾーンのカードもなかったら、自動的にメインフェーズに行くようにする。

次に

pub fn choose_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*4 = 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.");
    }
}

昔作った手札のカード1枚を選択して、操作する関数を改造しようと思ったけれども

 

まずは、撤退するかしないかを聞く必要があるなと思った。

それは、マリガンしますか?でつかった関数を流用すればいいと思った。



f:id:brogmybana:20250326211756j:image

 

 

*1:_, card, _

*2:

            Card {
                power: Some(5000),
                name: String::from("三剣士のソードホーク"),
                energy: 6,
            },
            Location::SZone,
            SpinCondition::Spin,
            FaceCondition::Open,
            Fighter {},
       

*3:

        Card {
            power: Some(5000),
            name: String::from("師範マスター・ゼブラ"),
            energy: 7,
        },
        Location::FZone,
        SpinCondition::Spin,
        FaceCondition::Open,
        Fighter {},
   

*4:_, card, _