今日は、大学でカードゲームの募集をしたら、りうっていう33歳が突如現れて、対戦した。 謎過ぎる。。。
今日の目標
プレイステートのうち、
ターンスタート、準備フェーズ、撤退フェーズ、Xフェーズで必要な処理を実装する。
ターンスタート
- ゲーム開始であることを示す。
- 自動的に準備フェーズに移行する
準備フェーズ
- 入力を受け付け山札からカードを1枚引く
- Fゾーンのカードをリスピンする
- Sゾーンのカードをリスピンする
- 条件を確認して、撤退フェーズに移行する
- 条件を確認して、Xフェーズに移行する
- 条件を確認して、メインフェーズに移行する
撤退フェーズ
- 入力を受けつけ、撤退することを選べる
- 条件を確認して、Xフェーズに移行する
- 条件を確認して、メインフェーズに移行する
Xフェーズ
- 入力を受け付けXスキルを使用することを選べる。
- Xスキルを処理する
- 自動的にメインフェーズに移行する
brogmymxo.hatenablog.comまずは、ターン数のリソースを追加する。
#[derive(Resource)]
pub struct Score {
}
impl Default for Score {
fn default() -> Self {
}
}
pub fn be_score_zero(mut commands: Commands) {
commands.init_resource::<Score>();
}
過去に使った、この登録の仕方でいいと思う。
#[derive(Resource)]
pub struct TurnCount {
}
impl Default for TurnCount {
fn default() -> Self {
}
}
また、前回のターンプレイヤーを決めたが、その勝者をリソースで記録をつけるのを忘れた。
fn choose_first(mut first_player: ResMut<PlayerSort>) {
let (turn_player, non_turn_player) = janken();
// turn_player を FirstPlayer リソースに格納
first_player.firstplayer_id = turn_player;
first_player.secondplayer_id = non_turn_player;
println!(
"先行: Player {}, 後攻: Player {}",
first_player.firstplayer_id, first_player.secondplayer_id,
);
}
これでOK
ターン数が奇数なら、先行を取った方が、表示され、ターン数が偶数なら、後攻を取った方が、表示される方がいいと思った。
#[derive(Resource)]
pub struct TurnCount {
}
impl Default for TurnCount {
fn default() -> Self {
}
}
pub fn be_turncount_zero(mut commands: Commands) {
commands.init_resource::<TurnCount>();
}
#[derive(Default, Resource)] // Resourceトレイトを使ってリソースにする
pub struct PlayerSort {
pub firstplayer_id: u32,
pub secondplayer_id:u32,// 先行プレイヤーのID(1 または 2)
}
pub struct TurnStartPlugin;
impl Plugin for TurnStartPlugin {
fn build(&self, app: &mut App) {
app.add_systems(
OnEnter(GameState::Play),
(
be_turncount_zero,
turn_start,
automatically_move_to_setup_phase,
)
.chain(),
);
}
}
fn be_turncount_zero(mut commands: Commands) {
commands.init_resource::<TurnCount>();
}
fn turn_start(first_player: ResMut<PlayerSort>, mut turn_count: ResMut<TurnCount>) {
println!("{}, のターンです", first_player.firstplayer_id,);
} else {
println!("{}, のターンです", first_player.secondplayer_id,);
}
}
fn automatically_move_to_setup_phase(mut next_state: ResMut<NextState<PlayState>>) {
next_state.set(PlayState::SetupPhase);
println!("準備フェーズになりました")
}
これをインサートした。

OKですね。
次、準備フェーズの実装をしたい。
- 入力を受け付け山札からカードを1枚引く
- Fゾーンのカードをリスピンする
- Sゾーンのカードをリスピンする
- 条件を確認して、撤退フェーズに移行する
- 条件を確認して、Xフェーズに移行する
- 条件を確認して、メインフェーズに移行する
準備フェーズのドローは特別である。だから、新しく作り直さないといけない。
準備フェーズのドローで引けないことは敗北条件の一つである。
入力を受け付けてから、ドローする。
でつぎの、条件チェックが結構めんどくさい、
Fゾーンのカードがあったら、撤退フェーズに行く。
Fゾーンのカードがなくて、Xゾーンに裏側のカードが無ければ、メインフェーズに行く
Fゾーンのカードが無くて、Xゾーンに裏側のカードがあれば、Xフェーズに行く。
Fゾーンのカードリスピンと、Sゾーンのカードリスピンはどうでもいい。