スプラトゥーン3で、次付くギアパワーが決まる仕組みのサンプルコード(Ruby)

ギアシードチェッカーのこちらのページを参考にしました。

一応ちゃんと動きます。

サンプルコードの結果
ギアシードチェッカーの結果
目次

サンプルコード

class SeedChecker
  def initialize(seed, brand, drink = nil)
    @seed = seed
    @brand = brand
    @drink = drink
  end

  def show_gear_powers
    seed = @seed

    # 次に付くギアパワーを10個表示する
    10.times do
      # 共通処理
      # シードを一つ進めてからギアパワーをつける
      seed = advance_seed(seed)
      gear_power = get_next_gear_power(seed)

      # ドリンクが有効な場合には以下の処理を追加
      if @drink
        # シードを100で割った余りが29以下であれば、ドリンクのギアパワーをつける
        # つまり、30%の確率でドリンクのギアパワーがつく
        if seed % 0x64 <= 0x1D
          p @drink
          next
        end
        # シードを100で割った余りが30以上であれば
        # さらにシードを一つ進めてからドリンク以外のギアパワーをつける
        seed = advance_seed(seed);
        gear_power = get_next_gear_power_with_drink(seed);
      end

      p gear_power
    end
  end

  private

  # XORSHIFT32のアルゴリズムで、シードを一つ進める
  def advance_seed(seed)
    seed = seed ^ (seed << 13 & 0xFFFFFFFF)
    seed = seed ^ (seed >> 17 & 0xFFFFFFFF)
    seed = seed ^ (seed << 5 & 0xFFFFFFFF)
    return seed & 0xFFFFFFFF
  end

  # 次付くギアパワーを計算
  def get_next_gear_power(seed)
    seed_mod = seed % max_gear_power_weight
    gear_power_index = -1

    # 「シードをギアパワーの重みの合計で割った余り」が0を下回るまで、ギアパワーの重みを順番に引いていく
    while (seed_mod >= 0)
      gear_power_index += 1 
      gear_power_name = gear_power_order[gear_power_index]
      seed_mod -= get_gear_power_weight(gear_power_name)
    end

    return gear_power_order[gear_power_index]
  end

  # ドリンク有効な場合に次付くギアパワーを計算
  def get_next_gear_power_with_drink(seed)
    seed_mod = seed % max_gear_power_weight_with_drink
    gear_power_index = -1

    while (seed_mod >= 0)
      gear_power_index += 1 
      gear_power_name = gear_power_order[gear_power_index]
      seed_mod -= get_gear_power_weight_with_drink(gear_power_name)
    end

    return gear_power_order[gear_power_index]
  end

  # ギアパワーの重みの合計
  # 中立ギアは2*14=28
  # 非中立ギアは (2*12)+1+10=35
  def max_gear_power_weight
    return 28 if brand[:isNeutral]
    return 35
  end

  # ドリンク有効な場合の、ギアパワーの重みの合計
  # 中立ギアは28-2=26
  # 非中立ギアの付きやすいギアパワーとドリンクが同じ場合は35-10=25
  # 非中立ギアの付きづらいギアパワーとドリンクが同じ場合は35-1=34
  # それ以外の中立ギアは35-2=33
  def max_gear_power_weight_with_drink
    return 26 if brand[:isNeutral]
    return 25 if brand[:UsualGearPowerName] == @drink
    return 34 if brand[:UnusualGearPowerName] == @drink
    return 33
  end

  # ギアパワーの重み
  # ブランドの付きやすいギアパワーは10
  # ブランドの付きづらいギアパワーは1
  # それ以外は2
  def get_gear_power_weight(gear_power_name)
    return 10 if (brand[:UsualGearPowerName] == gear_power_name)
    return 1 if (brand[:UnusualGearPowerName] == gear_power_name)
    return 2
  end

  # ドリンク有効な場合のギアパワーの重み
  # ドリンクと同じギアパワーは0(ドリンク以外のギアパワーをつけるため、スキップされる)
  # それ以外は上と同じ
  def get_gear_power_weight_with_drink(gear_power_name)
    return 0 if (gear_power_name == @drink)
    return 10 if (brand[:UsualGearPowerName] == gear_power_name)
    return 1 if (brand[:UnusualGearPowerName] == gear_power_name)
    return 2
  end

  # ギアパワーの並び
  def gear_power_order
    [
      "メイン効率アップ",
      "サブ効率アップ",
      "インク回復力アップ",
      "ヒト移動速度アップ",
      "イカダッシュ速度アップ",
      "スペシャル増加量アップ",
      "スペシャル減少量ダウン",
      "スペシャル性能アップ",
      "復活時間短縮",
      "スーパージャンプ時間短縮",
      "サブ性能アップ",
      "相手インク影響軽減",
      "サブ影響軽減",
      "アクション強化",
    ]
  end

  # ブランド別に「付きやすいギアパワー・付きづらいギアパワー・中立であるか」を返す
  def brand
    case @brand
    when "アイロニック"
      {
        UsualGearPowerName: "スーパージャンプ時間短縮",
        UnusualGearPowerName: "復活時間短縮",
        isNeutral: false
      }
    when "アナアキ"
      {
        UsualGearPowerName: "サブ効率アップ",
        UnusualGearPowerName: "スペシャル減少量ダウン",
        isNeutral: false
      }
    when "アロメ"
      {
        UsualGearPowerName: "インク回復力アップ",
        UnusualGearPowerName: "スーパージャンプ時間短縮",
        isNeutral: false
      }
    when "エゾッコ"
      {
        UsualGearPowerName: "スペシャル減少量ダウン",
        UnusualGearPowerName: "スペシャル増加量アップ",
        isNeutral: false
      }
    when "エンペリー"
      {
        UsualGearPowerName: "サブ性能アップ",
        UnusualGearPowerName: "相手インク影響軽減",
        isNeutral: false
      }
    when "シグレニ"
      {
        UsualGearPowerName: "サブ影響軽減",
        UnusualGearPowerName: "アクション強化",
        isNeutral: false
      }
    when "シチリン"
      {
        UsualGearPowerName: "アクション強化",
        UnusualGearPowerName: "スペシャル増加量アップ",
        isNeutral: false
      }
    when "ジモン"
      {
        UsualGearPowerName: "メイン効率アップ",
        UnusualGearPowerName: "ヒト移動速度アップ",
        isNeutral: false
      }
    when "タタキケンサキ"
      {
        UsualGearPowerName: "メイン効率アップ",
        UnusualGearPowerName: "サブ性能アップ",
        isNeutral: false
      }
    when "バトロイカ"
      {
        UsualGearPowerName: "相手インク影響軽減",
        UnusualGearPowerName: "メイン効率アップ",
        isNeutral: false
      }
    when "バラズシ"
      {
        UsualGearPowerName: "アクション強化",
        UnusualGearPowerName: "サブ性能アップ",
        isNeutral: false
      }
    when "フォーリマ"
      {
        UsualGearPowerName: "スペシャル性能アップ",
        UnusualGearPowerName: "サブ効率アップ",
        isNeutral: false
      }
    when "ホタックス"
      {
        UsualGearPowerName: "復活時間短縮",
        UnusualGearPowerName: "スペシャル減少量ダウン",
        isNeutral: false
      }
    when "ホッコリー"
      {
        UsualGearPowerName: "サブ効率アップ",
        UnusualGearPowerName: "インク回復力アップ",
        isNeutral: false
      }
    when "ヤコ"
      {
        UsualGearPowerName: "スペシャル増加量アップ",
        UnusualGearPowerName: "スペシャル性能アップ",
        isNeutral: false
      }
    when "ロッケンベルグ"
      {
        UsualGearPowerName: "ヒト移動速度アップ",
        UnusualGearPowerName: "イカダッシュ速度アップ",
        isNeutral: false
      }
    when "クラーゲス"
      {
        UsualGearPowerName: "イカダッシュ速度アップ",
        UnusualGearPowerName: "サブ影響軽減",
        isNeutral: false
      }
    when "エゾッコリー"
      {
        UsualGearPowerName: "スペシャル減少量ダウン",
        UnusualGearPowerName: "インク回復力アップ",
        isNeutral: false
      }
    when "クマサン商会", "アタリメイド", "アミーボ"
      {
        UsualGearPowerName: "",
        UnusualGearPowerName: "",
        isNeutral: true
      }
    end
  end
end

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメント一覧 (16件)

1 2

ikatimes へ返信する コメントをキャンセル

目次