Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。

悠仁普通におった

図書館行ったら前に悠仁おったわ。

昼間は物理の問題やってたけど、そろそろプログラミングの内容を忘れてしまいそうだから、続きをやっていこう。
この前乗っけてなかったけど、


pub fn energy_adjustment(
    mut energy_adjustment_event_reader: EventReader<EnergyAdjustment>,
    player1_szone: ResMut<Player1SZone>,
    query: Query<(Entity, &Card), (With<Player1>, Without<FirstEnergy>)>,
    mut commands: Commands,
) {
    for event in energy_adjustment_event_reader.read() {
        let mut selected_cards: Vec<Entity> = Vec::new();
        let mut total_energy_for_penalty: u32 = 0;
        let penalty_energy = event.penalty_energy;

        // Sゾーンのカードを取得
        let available_cards: Vec<(Entity, &Card)> = player1_szone
            .cards
            .iter()
            .filter_map(|&entity| query.get(entity).ok())
            .collect();

        // ペナルティエナジー以上のエナジーを持つカードをチェック
        let high_energy_cards: Vec<(Entity, &Card)> = available_cards
            .iter()
            .filter(|(_, card)| card.energy >= penalty_energy)
            .cloned()
            .collect();

        // ペナルティエナジー以上のカードがある場合
        if !high_energy_cards.is_empty() {
            println!("ペナルティエナジー以上のカードがあります。選択可能なカード:");
            for (index, (entity, card)) in high_energy_cards.iter().enumerate() {
                println!("{}: {} [エナジー: {}]", index + 1, card.name, card.energy);
            }

            // ユーザーにカードを選ばせる
            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 <= high_energy_cards.len() {
                    let selected_entity = high_energy_cards[selected_index - 1].0;
                    selected_cards.push(selected_entity);
                    if let Ok*1 = query.get(selected_entity) {
                        total_energy_for_penalty += card.energy;
                        println!("選択したカード: {} [エナジー: {}]", card.name, card.energy);
                    }
                } else {
                    println!("無効な選択です。");
                }
            } else {
                println!("有効な番号を入力してください。");
            }
        } else {
            // ペナルティエナジー以上のカードがない場合
            println!("ペナルティエナジー以上のカードはありません。全てのカードを表示します。");
            for (index, (entity, card)) in available_cards.iter().enumerate() {
                println!("{}: {} [エナジー: {}]", index + 1, card.name, card.energy);
            }

            // ユーザーにカードを選ばせる
            while total_energy_for_penalty <= penalty_energy {
                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 <= available_cards.len() {
                        let selected_entity = available_cards[selected_index - 1].0;

                        // 既に選択されたカードか確認
                        if !selected_cards.contains(&selected_entity) {
                            selected_cards.push(selected_entity);
                            if let Ok*2 = query.get(selected_entity) {
                                total_energy_for_penalty += card.energy;
                                println!(
                                    "選択したカード: {} [エナジー: {}]",
                                    card.name, card.energy
                                );
                            }
                        } else {
                            println!("このカードは既に選択されています。");
                        }
                    } else {
                        println!("無効な選択です。");
                    }
                } else {
                    println!("有効な番号を入力してください。");
                }

                // 合計エナジーとペナルティエナジーの差を確認
                println!(
                    "現在の合計エナジー: {}, ペナルティエナジー: {}",
                    total_energy_for_penalty, penalty_energy
                );
                if total_energy_for_penalty > penalty_energy {
                    break; // 合計エナジーがペナルティエナジーを上回ったらループを終了
                }

                // 再度ペナルティエナジー以上のカードがあるか確認
                let high_energy_cards: Vec<(Entity, &Card)> = available_cards
                    .iter()
                    .filter(|(_, card)| card.energy >= penalty_energy - total_energy_for_penalty)
                    .cloned()
                    .collect();

                if !high_energy_cards.is_empty() {
                    println!("ペナルティエナジーの差以上のカードがあります。選択可能なカード:");
                    for (index, (entity, card)) in high_energy_cards.iter().enumerate() {
                        println!("{}: {} [エナジー: {}]", index + 1, card.name, card.energy);
                    }
                }
            }
        }

        // 最終的に選んだカードのリストを表示
        println!("最終的に選ばれたカード:");
        for entity in selected_cards {
            if let Ok*3 = query.get(entity) {
                println!(
                    "- {} [エナジー: {}]をペナルティでXゾーンに置きました",
                    card.name, card.energy
                );
                commands.entity(entity).insert(Location::XZone);
                commands.entity(entity).insert(SpinCondition::ReSpin);
                commands.entity(entity).insert(FaceCondition::Facedown);
            }
        }
    }
}

この状態になっているので、最後イベントを追加して、タクティクスプレイに持っていきましょう。

        println!("最終的に選ばれたカード:");
        tactics_with_penalty_event_writer.send(PlayTacticsWithPenaltyFromHand {
            played_card_id: event.played_card_id,
            spin_cards_list: event.spin_cards_list.clone(),
            penalty_card_list: selected_cards.clone(),
        });

        for entity in selected_cards.clone() {
            if let Ok*4 = query.get(entity) {
                println!(
                    "- {} [エナジー: {}]をペナルティでXゾーンに置きました",
                    card.name, card.energy
                );
                commands.entity(entity).insert(Location::XZone);
                commands.entity(entity).insert(SpinCondition::ReSpin);
                commands.entity(entity).insert(FaceCondition::Facedown);
            }
        }

ペナルティを受けたときは沢山確認してるし、スピン状態と違ってペナルティを巻き戻すのは、難しいので、巻き戻し機能はつけなかった。

pub fn play_tactics_with_penalty_from_hand(
    mut tactics_with_penalty_event_reader: EventReader<PlayTacticsWithPenaltyFromHand>,
    mut commands: Commands,
    mut play_tactics_finish_event_writer: EventWriter<PlayTacticsFinish>,
    query: Query<(Entity, &Card), With<Player1>>,
) {
    for event in tactics_with_penalty_event_reader.read() {
        if let Ok*5 = query.get(event.played_card_id) {
            commands
                .entity(event.played_card_id)
                .insert(Location::SZone);
            println!("{}を手札から発動しました", card.name);
            play_tactics_finish_event_writer.send(PlayTacticsFinish {
                played_card_id: event.played_card_id,
            });
        }
    }
}

 

とりあえず、調整機能できたんじゃない???
ただ、調整には意思決定を挟んだ方がいいような気もした。

// 最終的に選んだカードのリストを表示
        println!("最終的に選ばれたカード:");
        for entity in selected_cards.clone() {
            if let Ok*6 = query.get(entity) {
                println!("- {} [エナジー: {}]", card.name, card.energy);
            }
        }

        println!("ペナルティを受け入れますか?");
        let choice = check_the_will_of_spinning_cards();
        match choice {
            1 => {
                for entity in selected_cards.clone() {
                        commands.entity(entity).insert(Location::XZone);
                        commands.entity(entity).insert(SpinCondition::ReSpin);
                        commands.entity(entity).insert(FaceCondition::Facedown);
                }

                tactics_with_penalty_event_writer.send(PlayTacticsWithPenaltyFromHand {
                    played_card_id: event.played_card_id,
                    spin_cards_list: event.spin_cards_list.clone(),
                    penalty_card_list: selected_cards.clone(),
                });
            }

            2 => {
                println!("やりなおします");
                for target in &event.spin_cards_list {
                    commands.entity(*target).insert(SpinCondition::ReSpin);
                }
                println!("スピンしたカードを元に戻しました。");
                select_hand_event_writer.send(SelectHand);
            }
            _ => {}
        }
        // 意思決定関数を入れた


play tactics spin szoneの文字表示も若干見直した。

一通りやりたいことが終わった気がするので、どんな機能が必要だったか見直してみる。

 

 

*1:_, card

*2:_, card

*3:_, card

*4:_, card

*5:_, card

*6:_, card