
エクファン世界優勝デッキです。
今日やりたいこと。
マリガン機能再挑戦
カードの複数選択
目的への取り組み
マリガン機能で作った関数を一つ一つ、アプリに入れて検証した。
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,
)
.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.");
}
}
この関数を改造すればいいと分かった。
ただ、ちょっともう時間無いので切るわ。
