交配に影響するバグであり、TileEntityCrop#attemptCrossingにて、相棒のちょっと下の行で発生しているバグである

相棒: 交配時にランダムな植物種がNGスポットに入るバグ

バージョン: industrialcraft-2-2.2.720-experimental

全貌

4方向を神の子「小松菜」に囲まれている交配用支柱で
10000回の交配で「小松菜」が8回の出現。
(神の子の出現確率はこのくらいである)

見ていないならば、先に相棒を参照してほしい。

アルゴリズムのバグにより、どのような植物種の交配時においても、NGスポットにある植物種がごくわずかな確率(とりあえず期待値1/1000未満)で出現するこれにより、相棒でお蔵入りになった植物種も交配で取得できる

本記事群ではこういった交配によって出現した植物種の株神の子と呼ぶことにする。また、その植物種はこの世界の神であると呼ぶ。

そのかわり、ある支柱で試行されるある交配において生成可能と列挙された植物種群のうち、植物種登録リスト順でもっとも後ろにある植物種の出現比重が1レート単位下がる。もしその植物種の出現比重が1である場合、その植物種はその交配において出現しなくなる

 

邪神世界

ちなみに、もし相棒でNGスポットに入る植物種が雑草となった場合、雑草がNGされるのでラッキー!

・・・と思いきや、雑草がこの世界の神になるのであらゆる交配時に1/1000以下の確率で除草農薬値を無視して雑草が生まれるという邪神に支配された世界になる(そもそも交配時に除草用具を使わない手法なら大して関係ないが)

交配出現および成長の条件(canGrow)の貫通

神の子は、成長光量領域に代表される交配出現および成長の条件を貫通する。よって、その場所には元々植えられないという作物種でさえ強引に出現させることができる。

IC2キノコ2種には保水農薬値が0より高くなければ成長ができない(交配でも生まれない)という設定があるが、これも貫通する。同様に、カカオも肥沃農薬値が3以上でなくともよい。

アルゴリズム

attemptCrossingにて行っている全処理を以下に載せる。

// 起
これより交配の前提を調べる。
ある支柱のある交配において、4隣接の支柱が交配に参加可能ならば交配可能リストcropTesに追加し、
cropTesに2個以上の支柱があれば(ないならおしまい)
登録されている植物種一覧の配列crops(= Crops.instance.getCrops().toArray(new CropCard[0])を取得し、
cropsに1個以上植物種があれば(ないならおしまい)、
後続の処理を行う。

// 
つぎに交配で出すべき植物種の比重(を積分したやつ)を求めるために、要素数が作物種一覧と同じな整数型配列ratioを用意し、
整数型totalに0を代入し、
i = 1からratios.length - 1まで、{
  i番目のcropsが非nullで、この支柱で成長(および交配出現)可能(TileEntityCrop#canGrow)であるならば、{
    全てのcropTesに対して{
      その支柱の植物種×i番目のcropsをtotalに加算し代入(すなわち+=)する
    }こと
  }を行い、
  そして現時点でのtotalをi番目のratiosに代入する
}ことを繰り返す。

// 転
さて、ここで比重(を積分したやつの)配列ratiosが得られている(例:ratios = {0, 0, 5, 5, 10, 20, 20}, total = 20)わけであるが、
これをもとにして、次のようなこれを微分したものと同じ比率でランダムに選択したい。

  添え字番号=0  比重=0
  添え字番号=1  比重=0
  添え字番号=2  比重=5
  添え字番号=3  比重=0
  添え字番号=4  比重=5
  添え字番号=5  比重=10
  添え字番号=6  比重=0

そこで、
0からtotal-1までの範囲の乱数searchを生成して、{
  整数型min=0、整数型max=ratios.length-1
  の初期値により、min
    整数型curにminとmaxの平均(小数点以下切り捨て)を代入し、
    整数型valueにcur番目のratiosを代入し、
    もしvalueがsearch以上ならmaxにcurを代入、そうでなければminにcur+1を代入する

  }という処理を繰り返す
}という処理により目的の添え字番号minを得る。

// 
ここにきて、min番目のcropsが目的の植物種である。

 何がいけないのかというと・・・
試しにJavaで以下のコードを走らせてみてほしい(1010)。

public static void main(String[] args)
{
    int[] ratios = {
        0, 0, 5, 5, 10, 20, 20
    };
    int total = 20;
    
    for (int search = 0; search < total; search++) {
        int min = 0;
        int max;
        for (max = ratios.length - 1; min < max;)
        {
            int cur = (min + max) / 2;
            int value = ratios[cur];
            if (value >= search) max = cur;
            else min = cur + 1;
        }
        
        System.out.print("" + search + ": " + min + " | ");
    }
}

実行結果は、

0: 0 | 1: 2 | 2: 2 | 3: 2 | 4: 2 | 5: 2 | 6: 4 | 7: 4 | 8: 4 | 9: 4 | 10: 4 | 11: 5 | 12: 5 | 13: 5 | 14: 5 | 15: 5 | 16: 5 | 17: 5 | 18: 5 | 19: 5

となる。各添え字の出現回数を集計してみると・・・

添え字番号=0  出現回数=1
添え字番号=1  出現回数=0
添え字番号=2  出現回数=5
添え字番号=3  出現回数=0
添え字番号=4  出現回数=5
添え字番号=5  出現回数=9
添え字番号=6  出現回数=0

最後のやつの出現パターンが1個減って最初のやつが1個増えている。これがこのバグの原因である

このバグを修正するには、searchに0からtotal-1の範囲ではなく1からtotalの範囲の乱数を与えればよい。

発生条件

すべての交配時。

影響

あらゆる交配時に神の子を出現させることができる。NGされているにもかかわらずあらゆる状況で出る。

トリビア

  • TASさんならダイヤアシを神にすることで、小麦の支柱2つを手に入れた段階で神の子ダイヤアシを入手することも可能であろう。

神の子の神秘的な点

  • 出現確率は0.1%未満である
  • 少なくともゲームを再起動するまでは世界のどこであっても同じ植物種が神の子となる
    • 神の子はMOD構成、つまり世界の真理によって決まっている。
  • 神の子は交配出現および成長の条件(canGrow)を無視して発生する
    • ​神の子にとって光量や環境値など取るに足りないことである。
  • NGされているので、交配用支柱で神の子をお手軽に量産はできない
    • 相棒のみが修正されると神の子でも可能になる。
    • 種袋では普通に増やせる。ベースシードも然り。
  • かわりに神の子は交配の際の突然変異率を大幅に引き上げる。特に、神の子のみによる交配は基本的に突然変異しかしない
    • 種を超えた複数の作物種の祖である。

 

最終更新:2015年05月20日 01:52