種袋を採取したとき、種袋とともに通常の収穫物もドロップするが、種袋のドロップ率に影響するパラメータ(基本種袋採取確率)が収穫後のサイズに依存するというものである。

industrialcraft-2-2.2.517-experimental このバグが顕在であることを確認。

全貌

TileEntityCrop#pickは支柱を左クリックしたときに呼び出されるメソッドで、通常の収穫物のドロップ種袋のドロップ数の決定とドロップ処理を行っている。

しかし、この処理の順序によって通常の収穫(TileEntityCrop#harvest)を行い成長サイズが低下した後に、成長サイズに依存する基本種袋採取確率(dropSeedChance)を計算しているため、これが収穫の影響を受けてしまっている。

発生条件

収穫可能な作物が、現在の成長サイズ収穫後の成長サイズの採取確率帯が異なる状態で種袋を採取したとき。

採取確率帯表

サイズ 基本種袋採取確率
1 0
2 0.25
3以上 0.5

影響

種袋のドロップ率に影響を与える基本種袋採取確率が収穫後サイズで判定される。ほとんどすべての場合において収穫後サイズは現在の成長サイズよりも小さいので、結果として得られる種袋の量が減ることになる。

基本種袋採取確率が0になる場合でも、基本種袋採取確率に加算する演算が含まれているため、全く出なくなるわけではない。微妙に出辛くなる。

IC2本体の作物種では以下の作物が該当する。

収穫後サイズが1

  • アシ
  • ジャガイモ
  • 人参
  • ネザーワート
  • テラワート
  • サイズ4未満の樹液アシ

収穫後サイズが2

  • 小麦
  • フェルー
  • 赤石小麦
  • オーレリア

確率次第

  • サイズ4の樹液アシ

バグと思われる理由

  • 収穫可能なサイズで収穫した場合よりも、収穫可能でないサイズで収穫したほうが種袋採取個数の期待値が高い場合がある。
サイズ倍率 R(s) = sが1の時0、2の時0.25、3以上の時0.5
基本種袋採取確率 base(s, Tier) = R(s) * 0.8^Tier
第一確率 fc(s, Tier, Re) = base(s, Tier) * 1.1^Re = R(s) * 0.8^Tier * 1.1^Re
第二確率 sc(s, Tier, Gr, Ga) = base(s, Tier) + (Gr/100) * (自動で0.8、手動で1) * 0.95^(max(Ga, 23)-23), 1)
①ドロップ率 D1 = min( (fc+1)*0.8 , 1)
②ドロップ率 D2 = min( sc , 1)
③ドロップ率 D3 = min( fc*1.5 , 1)
収穫する場合のドロップ期待値 = D1 + D2

収穫しない場合のドロップ期待値 = D3

としたとき、サイズ2で人参を採取した場合のドロップ期待値は次のようになる。
  収穫しない場合のドロップ期待値
​ = D3

​ = min( fc*1.5 , 1)
​ = min( 0.25 * 0.8^2 * 1.1^Re * 1.5 , 1)
​ = min( 0.24 * 1.1^Re , 1)
​ = (Re>=15 ? 1 : 0.24 * 1.1^Re)

また、サイズ3で人参を採取した場合のドロップ期待値は次のようになる。
 = D1 + D2
 = min( (fc+1)*0.8 , 1) + min( sc , 1)

 = min( ( R(s) * 0.8^Tier * 1.1^Re +1)*0.8 , 1)
  + min( base(s, Tier) + (Gr/100) * (自動で0.8、手動で1) * 0.95^(max(Ga, 23)-23), 1) , 1)

 = 0.8 + min( (Gr/100) * (自動で0.8、手動で1) * 0.95^(max(Ga, 23)-23), 1) , 1)
 = 0.8 + min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)

ここで、
  (Re>=15 ? 1 : 0.24 * 1.1^Re) > 0.8 + min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)
Resistance=15とおくと、

  1 > 0.8 + min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)
  0.2 > min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)
  0.2 > Gr/100 * 0.95^(max(Ga, 23)-23), 1)
  20 / ( 0.95^(max(Ga, 23)-23), 1) )> Gr
となり、Gain23以下の場合、Growth20未満のときにサイズ2で採取したほうが期待値が高くなる。
  • IC2Cropでは作物苗を増やすのに種袋を使うことが主流であると思われるが、この現象により、得られる種袋の期待値が交配を進めていかなければ1を超えない作物が発生する。
Tier2のアシを成長サイズ1で採取した場合の期待値
  収穫しない場合のドロップ期待値
​ = D3

​ = min( fc*1.5 , 1)
​ = min( 0 * 0.8^2 * 1.1^Re * 1.5 , 1)
​ = 0 < 1

成長サイズ2以上で採取した場合の期待値
 = D1 + D2
 = min( (fc+1)*0.8 , 1) + min( sc , 1)

 = min( ( R(s) * 0.8^Tier * 1.1^Re +1)*0.8 , 1)
  + min( base(s, Tier) + (Gr/100) * (自動で0.8、手動で1) * 0.95^(max(Ga, 23)-23), 1) , 1)

 = min( ( R(s) * 0.64 * 1.1^Re +1)*0.8 , 1)
  + min( R(s) * 0.64 + (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)

 = min( ( 0 +1)*0.8 , 1)
  + min( 0 + (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)

 = 0.8 + min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1)
ここで、
  min( (Gr/100) * 0.95^(max(Ga, 23)-23), 1) , 1) > 0.2

となるには、
  ⇔ (Gr/100) * 0.95^(max(Ga, 23)-23) > 0.2
  ⇔ (Gr/100) * 0.95^(Ga-23)) > 0.2  〔Ga>23〕
    Gr/100 > 0.2  〔Ga<=23〕
  ⇔ Gr > 20 / 0.95^(Ga-23))  〔Ga>23〕
    Gr > 20  〔Ga<=23〕
よって、アシを種袋で増やす場合Growth21は必要である。Gainが23よりも高い場合、期待値1を確保するためにはこれ以上のGrowthを要求する。
  • 種の採取に、現在のサイズではなく関係なさそうな収穫後のサイズが影響する。
  • TileEntityCrop#harvestには使われない引数manualが存在するが、これは種袋採取による収穫と通常の右クリック収穫で異なる引数が与えられている。この引数を「サイズ変更するか否か」として使用すれば、怪しげな挙動を起こさない。(ただし、その場合GregTechのハーベスターが異常な挙動を起こす。)

回避方法

プラグイン

PluginCropにより、種袋採取時に収穫判定前のサイズで判定を行うことができる。

最終更新:2015年05月29日 16:43