Behind Coleus

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

戦いではないが、6

今日は、大学でカードゲームの募集をしたら、りうっていう33歳が突如現れて、対戦した。 謎過ぎる。。。

今日の目標
プレイステートのうち、

ターンスタート、準備フェーズ、撤退フェーズ、Xフェーズで必要な処理を実装する。

ターンスタート

  1. ゲーム開始であることを示す。
  2. 自動的に準備フェーズに移行する

準備フェーズ

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

撤退フェーズ

  1. 入力を受けつけ、撤退することを選べる
  2. 条件を確認して、Xフェーズに移行する
  3. 条件を確認して、メインフェーズに移行する

Xフェーズ

  1. 入力を受け付けXスキルを使用することを選べる。
  2. Xスキルを処理する
  3. 自動的にメインフェーズに移行する

brogmymxo.hatenablog.comまずは、ターン数のリソースを追加する。

#[derive(Resource)]
pub struct Score {
    pub value: u32,
}

impl Default for Score {
    fn default() -> Self {
        Score { value: 0 }
    }
}
pub fn be_score_zero(mut commands: Commands) {
    commands.init_resource::<Score>();
}

過去に使った、この登録の仕方でいいと思う。

#[derive(Resource)]
pub struct TurnCount {
    pub value: u32,
}

impl Default for TurnCount {
    fn default() -> Self {
        TurnCount { value: 0 }
    }
}

また、前回のターンプレイヤーを決めたが、その勝者をリソースで記録をつけるのを忘れた。

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 {
    pub value: u32,
}

impl Default for TurnCount {
    fn default() -> Self {
        TurnCount { value: 0 }
    }
}
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>) {
    turn_count.value += 1;
    if turn_count.value % 2 == 1 {
        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. 入力を受け付け山札からカードを1枚引く
  2. Fゾーンのカードをリスピンする
  3. Sゾーンのカードをリスピンする
  4. 条件を確認して、撤退フェーズに移行する
  5. 条件を確認して、Xフェーズに移行する
  6. 条件を確認して、メインフェーズに移行する


準備フェーズのドローは特別である。だから、新しく作り直さないといけない。

準備フェーズのドローで引けないことは敗北条件の一つである。

入力を受け付けてから、ドローする。


でつぎの、条件チェックが結構めんどくさい、

Fゾーンのカードがあったら、撤退フェーズに行く。
Fゾーンのカードがなくて、Xゾーンに裏側のカードが無ければ、メインフェーズに行く
Fゾーンのカードが無くて、Xゾーンに裏側のカードがあれば、Xフェーズに行く。

Fゾーンのカードリスピンと、Sゾーンのカードリスピンはどうでもいい。