今日は昼過ぎまで取り敢えずプログラミングやる
今日の目的、
準備フェーズを作る
目的への取り組み、
この前作った、リソースでターンプレイヤーを表す関数は、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() {
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>, // 不変の参照
) {
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
.id();
println!("{:?} is spawned", my_entity);
let my_entity = commands
.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枚を選択して、操作する関数を改造しようと思ったけれども
まずは、撤退するかしないかを聞く必要があるなと思った。
それは、マリガンしますか?でつかった関数を流用すればいいと思った。

Card {
power: Some(5000),
name: String::from("三剣士のソードホーク"),
energy: 6,
},
Location::SZone,
SpinCondition::Spin,
FaceCondition::Open,
Fighter {},
Card {
power: Some(5000),
name: String::from("師範マスター・ゼブラ"),
energy: 7,
},
Location::FZone,
SpinCondition::Spin,
FaceCondition::Open,
Fighter {},