Elin:解析/釣り: Difference between revisions

From Ylvapedia
(釣りの解析記事を作成)
 
m (デフォルトソートキーを追加)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
==釣果表==
{{解析}}


======
'''[[Elin:釣り|釣り]]'''に関する計算式などのページです。
 
==魚 LV==
 
自分の釣りレベルから釣れる魚LVを算出する公式:
 
<pre>fishLV = rnd(fishingLevel * 2) + 1</pre>
 
*'''釣りレベル''': 現在の釣りスキルレベル。
*'''rnd''': '''0'''から関数に渡された値までの間のランダムな数値。
 
====調整済み魚LV====
 
調整済み魚LVはアイテム作成時に計算されます。これは「rnd」関数に複数回呼び出しを行い、最後に「+2」というハードコードされた値を追加します。最終的な調整レベルは次のようになります。
 
<pre>adjustedLV = fishLV + 2 + rnd(rnd(rnd(rnd(Mathf.Min(fishLV * 2, 20)) + 1) + 1) + 1)</pre>
 
*調整プロセスには以下の処理が含まれます。
**基本となる '''fishLV''' を '''rnd(fishingLevel * 2) + 1''' と決定します。
**「rnd」関数に複数回呼び出しを適用します。
***「rnd」は「0」から「(最大値 - 1)」までの間のランダムな数値を生成します。
***各呼び出しは、直前の「rnd」の結果に依存し、徐々に可能な範囲を狭めていきます。
**ハードコードされた「+2」を追加し、調整されたLVが常にオフセットを持つようにします。
 
*備考:まれに、rndへの複数回の呼び出しの最終結果が理論上は最大19まで上昇し、調整LVが大幅に上昇することがあります。
 
====例====
 
釣りレベルが「10」の場合:
 
*「基本レベル」:
**「fishLV = rnd(10 * 2) + 1 = rnd(20) + 1」。
**結果例:「10」。
 
*'''調整''': 
**1つ目 '''rnd(20)''' → 結果 = '''7'''.
**2つ目 '''rnd(7 + 1)''' → 結果 = '''3'''.
**3つ目 '''rnd(3 + 1)''' → 結果 = '''2'''.
**4つ目 '''rnd(2 + 1)''' → 結果 = '''0'''.
 
*'''最終的な調整後LV''':
**'''adjustedLV = 10 + 2 + 0 = 12'''.
 
====魚LV範囲表====
{| class="wikitable sortable"
{| class="wikitable sortable"
|-
|-
!!!画像!!LV!!最低釣りレベル!!重量(解析値)!!重量 (s)!!価値
!釣りレベル!!最低LV!!最大LV
|-
|-
|ゼニタナゴ||[[File:Elin Fish Sprite Bitterling.png|frameless]]||1||1||120||0.2s||80
|1||3||4
|-
|-
|おたまじゃくし||[[File:Elin Fish Sprite Tadpole.png|frameless]]||1||1||30||0.1s||50
|2||3||6
|-
|-
|金魚||[[File:Elin Fish Sprite Goldfish.png|frameless]]||1||1||140||0.2s||380
|3||3||8
|-
|-
|コイ||[[File:Elin Fish Sprite Carp.png|frameless]]||1||1||640||0.7s||520
|4||3||10
|-
|-
|ウナギ||[[File:Elin Fish Sprite Eel.png|frameless]]||5||3||400||0.4s||320
|5||3||12
|-
|-
|ハゼ||[[File:Elin Fish Sprite Goby.png|frameless]]||1||1||220||0.3s||150
|6||3||14
|-
|-
|カジカ||[[File:Elin Fish Sprite Muddler.png|frameless]]||1||1||460||0.5s||180
|7||3||16
|-
|-
|スズキ||[[File:Elin Fish Sprite Bass.png|frameless]]||5||3||540||0.6s||140
|8||3||18
|-
|-
|ウニ||[[File:Elin Fish Sprite Sea Urchin.png|frameless]]||5||3||160||0.2s||420
|9||3||20
|-
|-
|シロアマダイ||[[File:Elin Fish Sprite Tilefish.png|frameless]]||10||5||620||0.7s||480
|10||3||22
|-
|-
|キレアジ||[[File:Elin Fish Sprite Scad.png|frameless]]||10||5||360||0.4s||220
|11||3||24
|-
|-
|ハリマグロ||[[File:Elin Fish Sprite Tuna.png|frameless]]||10||5||850||0.9s||550
|12||3||26
|-
|-
|アロワナ||[[File:Elin Fish Sprite Arowana.png|frameless]]||10||5||320||0.4s||400
|13||3||28
|-
|-
|アユ||[[File:Elin Fish Sprite Sweetfish.png|frameless]]||5||3||200||0.2s||220
|14||3||30
|-
|-
|シマアジ||[[File:Elin Fish Sprite Striped Jack.png|frameless]]||15||8||440||0.5s||380
|15||3||32
|-
|-
|ブラックバス||[[File:Elin Fish Sprite B0lack Bass.png|frameless]]||15||8||750||0.8s||680
|16||3||34
|-
|-
|サバ||[[File:Elin Fish Sprite Mackerel.png|frameless]]||15||8||580||0.6s||380
|17||3||36
|-
|-
|キンメダイ||[[File:Elin Fish Sprite Red Bream.png|frameless]]||15||8||440||0.5s||760
|18|| 3||38
|-
|-
|||[[File:Elin Fish Sprite Turtle.png|frameless]]||1||1||120||0.2s||180
| 19||3||40
|-
|}
|カツオ||[[File:Elin Fish Sprite Bonito.png|frameless]]||15||8||700||0.8s||400
 
|-
====コード (EA 23.41)====
|マグロ||[[File:Elin Fish Sprite Tuna 2.png|frameless]]||20||10||1000||1.0s||840
 
<syntaxhighlight lang="c#" line="1">
int num3 = EClass.rnd(num * 2) + 1;
thing = ThingGen.Create("fish", -1, num3);
 
lv = lv + 2 + EClass.rnd(EClass.rnd(EClass.rnd(EClass.rnd(Mathf.Min(lv * 2, 20)) + 1) + 1) + 1);
</syntaxhighlight>
 
==魚の数==
自分の釣りレベルから釣れる匹数を計算する式は次の通りです。
 
<pre>numberOfFish = rnd(fishingLevel / (fishLV + 10)) + 1</pre>
 
*'''釣りレベル''':現在の釣りスキルレベル。
*'''魚レベルLV''':魚のレベル。
*'''rnd''':'''0'''から関数に渡された値までの間のランダムな数値。
 
==== 例====
釣りレベルが'''22'''で、魚のレベルが'''1'''と判定された場合、潜在的な魚の数は以下のように計算されます。<pre>rnd(22 / (1 + 10)) + 1</pre>
 
もっと簡略化するとこうなります:
 
<pre>rnd(22 / 11) + 1</pre>
 
<code>rnd(2)</code>は、'''0'''から約'''1'''の間の乱数を生成します。1を足すと、少なくとも1匹の魚を釣り上げることができます。魚の数は、ランダムな結果によって1匹か2匹のどちらかになります。
====土地フィート====
 
追加で1匹の魚を釣り上げる最初のチャンスは「5%」から始まります。
 
土地フィートに以下を含む場合:
*'''ビーチ (3604)''': 基本確率に '''20%''' を追加します。
*'''海 (3605)''': 基本確率に '''20%''' を追加します。
*'''釣り場 (3706)''': 基本確率に '''25%''' を追加します。
 
海 (3605)''' または '''ビーチ (3604)''' はいずれか一方のみが存在し得る(両方は存在しない)ため、合計確率は以下のように計算されます。'''
 
<pre>
chanceForOneMoreFish = 5
chanceForOneMoreFish += isBeach * 20 + isSea * 20 + isFishingSpot * 25
</pre>
 
以下を参照してください。
*'''isBeach''': 土地フィートが「ビーチ(3604)」であることを示すフラグ(0または1)。
*'''isSea''': 土地フィートが「海(3605)」であることを示すフラグ(0または1)。
*'''isFishingSpot''': 土地が'''釣り場(3706)'''であるかどうかを示すフラグ(0または1)。
 
例えば:
*'''海 (3605)'''が存在し、さらに'''釣り場(3706)'''も存在する場合:
<pre>
chanceForOneMoreFish = 5 + 1 * 20 + 1 * 25 = 50
</pre>
*'''海 (3605)''' の代わりに '''ビーチ (3604)''' が存在する場合:
<pre>
chanceForOneMoreFish = 5 + 1 * 20 + 1 * 25 = 50
</pre>
 
====魚の数を増やすチャンスの確認====
 
chanceForOneMoreFishの値は、0から99(両端の値を含む)の間の数値を生成する<code>rnd(100)</code>関数によって生成された乱数と比較されます。
 
chanceForOneMoreFishが乱数以上の場合、魚の数は「1」増えます。
 
このチェックは以下のように実装されています。
 
<pre>
if (chanceForOneMoreFish >= rnd(100))
</pre>
 
例えば:
*chanceForOneMoreFish = 50'''、かつ <code>rnd(100)</code> によって生成された乱数が '''50 以下''' の場合、魚が1匹追加で釣れます。'''
 
====土地フィートの例====
 
=====例 1: 釣り場 (3706) と海 (3605)=====
 
あなたの釣りレベルが「22」、魚のレベルが「1」だとします。魚の基本数は以下のように計算されます。
 
<pre>
numberOfFish = rnd(22 / (1 + 10)) + 1 = rnd(2) + 1
</pre>
 
これにより、ランダムな結果に応じて「1」または「2」の魚が得られます。
 
次に、陸での成果を評価します。
*まず、'''chanceForOneMoreFish = 5'''(基本確率)とします。
*'''海(3605)''' は '''20''' を追加します。
*'''釣り場 (3706)''' は '''25''' を追加します。
 
新しい '''chanceForOneMoreFish''' は次のようになります。
<pre>
chanceForOneMoreFish = 5 + 20 + 25 = 50
</pre>
 
続いて、ランダムなチャンスが判定されます。
 
<pre>
if (chanceForOneMoreFish >= rnd(100))
</pre>
 
<code>rnd(100)</code>によって生成された乱数が「50以下」の場合、魚の数は「1」増えます。したがって、
*「numberOfFish = numberOfFish + 1」(乱数のチェックに合格した場合)。
*乱数が「50」を超える場合、魚の数は変化しません。
 
=====例2: 釣りスポット (3706) とビーチ (3604)=====
 
同じ釣りレベルと魚LVの場合、土地の成果は以下のようになります。
*'''ビーチ (3604)''' は '''20''' を追加します。
*'''釣りスポット (3706)''' は '''25''' を追加します。
 
合計の「'''chanceForOneMoreFish'''」は次のままです。
 
<pre>
chanceForOneMoreFish = 5 + 20 + 25 = 50
</pre>
 
ランダムチェックは、追加の魚の確率が同じであることを除いて、上記と同じ動作をします。
====魚の数表====
{| class="wikitable"
|-
|-
|フグ||[[File:Elin Fish Sprite Blowfish.png|frameless]]||20||10||260||0.3s||1250
!魚LV!!2匹釣るための最低釣りレベル!!3匹釣るための最低釣りレベル
!4匹以上釣るための最低釣りレベル
|-
|-
|ヒラメ||[[File:Elin Fish Sprite Flatfish.png|frameless]]||20||10||500||0.5s||450
|1||22||33|| 44, etc.
|-
|-
|イワシ||[[File:Elin Fish Sprite Sardine.png|frameless]]||5||3||300||0.4s||150
| 5||30||45 ||60, etc.
|-
|-
|マダイ||[[File:Elin Fish Sprite Sea Bream.png|frameless]]||20||10||400||0.4s||950
|10||40||60||80, etc.
|-
|-
|サケ||[[File:Elin Fish Sprite Salmon.png|frameless]]||25||13||550||0.6s||720
| 15 ||50||75||100, etc.
|-
|-
|キス||[[File:Elin Fish Sprite Sand Borer.png|frameless]]||25||13||400||0.4s||560
|20||60|| 90||120, etc.
|-
|-
|クジラ||[[File:Elin Fish Sprite Whale.png|frameless]]||40||20||1200000||1200.0s||45000
|25||70||105||140, etc.
|-
|-
|シーラカンス||[[File:Elin Fish Sprite Coelacanth.png|frameless]]||35||18||4800||4.8s||5600
|30||80||120||160, etc.  
|-
|-
|深海魚||[[File:Elin Fish Sprite Deep Sea Fish.png|frameless]]||30||15||1500||1.5s||2400
|35||90||135 ||180, etc.
|-
|-
|古代魚||[[File:Elin Fish Sprite Ancient Fish.png|frameless]]||30||15||2400||2.4s||3800
|40||100 ||150||200, etc.
|-
|サメ||[[File:Elin Fish Sprite Shark.png|frameless]]||25||13||280000||280.0s||12000
|-
|マンボウ||[[File:Elin Fish Sprite Sunfish.png|frameless]]||25||13||9500||9.5s||1800
|-
|ムーンフィッシュ||[[File:Elin Fish Sprite Moonfish.png|frameless]]||30||15||14000||14.0s||4200
|}
|}
備考:4匹以降の魚の値も同じパターンに従う(前の列と同じ間隔で増加していく)。
====コード (EA 23.40)====
<syntaxhighlight lang="c#" line="1">
num2 = EClass.rnd(num / (num3 + 10)) + 1;
int num4 = 5;
if (EClass.Branch != null)
{
    num4 += EClass.Branch.Evalue(3604) * 20 + EClass.Branch.Evalue(3605) * 20 + EClass.Branch.Evalue(3706) * 25;
}
if (num4 >= EClass.rnd(100))
{
    num2++;
}
if (thing != null)
{
    thing.SetNum(num2);
    thing.SetBlessedState(BlessedState.Normal);
}
</syntaxhighlight>
==釣り速度==


===ジャンク===
釣りのプロセスには、2つの重要な変数が関わります。
*'''進行度''': 釣りの全体の所要時間または完了率を表し、0から100までの範囲です。
*'''ヒット''': 魚との格闘中に試行された回数を追跡します。以下の条件が適用されます。
**'''増加''': 以下のいずれかが発生するまで、試行ごとにヒットが増加します。
魚が釣れた場合(「hit」が「ランダム閾値」より大きい場合)。


==計算式==
特定のランダム条件により「hit」が「0」にリセットされる場合。


===魚 LV===
====成功====


自分の釣りレベルから釣れる魚LVを算出する公式:
魚を釣るための成功閾値を計算する式は以下の通りです。
 
<pre>successThreshold = Mathf.Clamp(10 - rnd(fishingLevel + 1) / 10, 5, 10)</pre>
 
*'''fishingLevel''': 現在の釣りスキルレベル。
*'''rnd''': 0 から関数に渡された値までの間の乱数。
*'''Clamp''': 値が 5(最も簡単)から 10(最も難しい)の範囲に収まるようにします。
 
実際の成功ロジックは以下の通りです。
<pre>
if (hit > rnd(successThreshold)) {
hit = 100;
progress = MaxProgress;
}
</pre>
*'''hit''': 現在の試行回数を追跡します。hit''がsuccessThresholdのランダム判定を超えると魚が釣れたことになります。''
*'''progress''': 成功すると自動的に完了します。


<pre>fishLV = rnd(fishingLevel * 2) + 1</pre>
====例====


* '''釣りレベル''': 現在の釣りスキルレベル。
釣りレベルが「20」の場合、計算は以下のように進みます。
* '''rnd''': '''0'''から関数に渡された値までの間のランダムな数値。
#<code>rnd(20 + 1)</code> は「0」から「20」までの間の乱数を生成します。
#この乱数を「10」で割った値を「10」から引きます。
結果は [5, 10] の範囲に制限され、successThreshold が決定されます。


==== 例 ====
例えば:
釣りレベルが'''3'''の場合、潜在的な魚のLVは次のように計算されます。<pre>rnd(3 * 2) + 1</pre>
*<code>rnd(21) = 10</code> の場合、計算は次のようになります。
<pre>successThreshold = Mathf.Clamp(10 - (10 / 10), 5, 10) = 9</pre>
乱数<code>rnd(9)</code>の値によって閾値が決定されます。 hit > rnd(9) の場合、魚が釣れます。


これは1から6までの範囲を示しており、LV1からLV6までの魚を釣ることができることを意味します。
====成功閾値テーブル====


==== 魚LV範囲表 ====
{| class="wikitable sortable」"
{| class="wikitable sortable"
|-
!釣りレベル!!最小成功閾値!!最大成功閾値
|-
|1||10 ||10
|-
|5||10||10
|-
|10||9||10
|-
|15||9||10
|-
|-
!釣りレベル!!最低LV!!最大LV
|20||8||10
|-
|-
|1||1||2
|25|| 8||10
|-
|-
|2||1||4
|30||7||10
|-
|-
|3||1||6
|35||7||10
|-
|-
|4||1||8
|40||6||10
|-
|-
|5||1||10
|45||6||10
|-
|-
|6||1||12
|50||5||10
|-
|-
|7||1||14
|55||5||10
|-
|-
|8||1||16
|60||5||10
|}
 
====リセット====
「ヒット」のリセットを決定する計算式は以下の通りです。
 
<pre>resetThreshold = Mathf.Clamp(10 - rnd(fishingLevel + 1) / 5, 2, 10)</pre>
 
*'''fishingLevel''': 現在の釣りスキルレベル。
*'''rnd''': 0 から関数に渡された値までの間の乱数。
*'''Clamp''': 値が 2(リセットが最も容易な閾値)から 10(リセットが最も困難な閾値)の範囲に収まるようにします。
 
<code>rnd(resetThreshold)</code> が '''0'<nowiki/>'' に等しく、かつ '''''<nowiki/>''progress >= 10''' の場合、'''hit''カウンターは '''0''' にリセットされます。
 
====例====
 
釣りレベルが '''30''' の場合、計算は以下のように進みます。
#<code>rnd(30 + 1)</code> は、0から30までの間のランダムな数値を生成します。
#このランダムな数値を5で割った値から10を引きます。
#結果は[2, 10]の範囲に制限され、resetThresholdが決定されます。
 
例えば:
*<code>rnd(31) = 10</code>の場合、計算は次のようになります。
<pre>resetThreshold = Mathf.Clamp(10 - (10 / 5), 2, 10) = 8</pre>
2番目の乱数判定、<code>rnd(8)</code>が実行されます。結果が「0」の場合、「ヒット」カウンターがリセットされます。
 
====リセット閾値テーブル====
{| class="wikitable sortable」"
|-
|-
|9||1||18
!釣りレベル!!Min resetThreshold!!Max resetThreshold
|-
|-
|10||1||20
|1||10||10
|-
|-
|11||1||22
|5||9||10
|-
|-
|12||1||24
|10||8||10
|-
|-
|13||1||26
| 15||7||10
|-
|-
|14||1||28
|20||6||10
|-
|-
|15||1||30
|25||5||10
|-
|-
|16||1||32
|30||4||10
|-
|-
|17||1||34
|35||3||10
|-
|-
|18||1||36
|40||2|| 10
|-
|-
|19||1||38
|45||2||10
|-
|-
|20||1||40
|50||2||10
|}
|}


====コード (EA 23.37)====
====コード(EA 23.37)====
 
<syntaxhighlight lang="「c#」" line="「1」">
public override void OnProgress()
{
if (this.owner.IsPC && (this.owner.Tool == null || !this.owner.Tool.HasElement(245, 1)))
{
this.Cancel();
return;
}
if (this.hit >= 0)
{
this.owner.renderer.PlayAnime(AnimeID.Fishing, default(Vector3), false);
this.owner.PlaySound(「fish_fight」, 1f, true);
this.Ripple();
int a = Mathf.Clamp(10 - EClass.rnd(this.owner.Evalue(245) + 1) / 10, 5, 10);
if (this.hit > EClass.rnd(a))
{
this.hit = 100;
this.progress = this.MaxProgress;
}
this.hit++;
return;
}
if (EClass.rnd(Mathf.Clamp(10 - EClass.rnd(this.owner.Evalue(245) + 1) / 5, 2, 10)) == 0 && this.progress >= 10)
{
this.hit = 0;
}
if (this.progress == 2 || (this.progress >= 8 && this.progress % 6 == 0 && EClass.rnd(3) == 0))
{
this.owner.renderer.PlayAnime(AnimeID.Shiver, default(Vector3), false);
this.Ripple();
}
}
</syntaxhighlight>
 
==チャンスと確率==
釣りで手に入る各アイテムや魚には、以下のルールと計算によって決定される固有の確率が存在します。
{| class="wikitable"
!判定
!ロジック
|-
|何もなし
|これが成功すると、それ以上の判定は発生しません。
|-
|レアアイテム
|「何もなし」が失敗した場合にチェックされます。これが成功すると、それ以上の判定は発生しません。
|-
|ジャンク
|「何もなし」と「レアアイテム」の両方が失敗した場合にチェックされます。成功した場合、それ以上の判定は発生しません。
|-
|魚
|それまでのすべての判定が失敗した場合の代替/デフォルトの判定です。
|}
 
====初期判定:何も釣れない確率====
 
最初の判定では、プレイヤーが何かを釣れるかどうかを決定します。この判定に失敗した場合は、アイテムも魚も生成されず、関数は <code>null</code> を返します。何も釣り上げることができない確率は、以下の式で計算されます。
 
<syntaxhighlight lang="「csharp」">
if (rnd(3 + fishingLevel) == 0)
{
return null;
}
</syntaxhighlight>
 
*'''計算式''': <code>rnd(3 + fishingLevel)</code> は、<code>0</code> から <code>(3 + fishingLevel - 1)</code> までの範囲の乱数を生成します。
*'''条件''': 結果が <code>0</code> の場合、判定は失敗し、何も釣れません。
 
=====確率=====
 
何も釣れない確率は、プレイヤーの釣りレベルが上がるにつれて減少します。
*'''最大値''': <code>3 + fishingLevel</code>、ここで <code>fishingLevel = c.Evalue(245)</code>。
*'''何も釣れない確率''':
**<code>1 / (3 + fishingLevel)</code>
 
例えば:
*「釣りレベル1」の場合:
**<code>rnd(3 + 1)</code> は <code>0</code> から <code>3</code> の間の数値を生成します。
**<code>0</code> の確率: <code>1 / 4</code> (25%)
 
*「釣りレベル10」の場合:
**<code>rnd(3 + 10)</code> は、<code>0</code>から<code>12</code>までの数字を生成します。
**<code>0</code>の確率: <code>1 / 13</code>(約7.69%)。
 
これは、高い釣りレベルでは、判定に失敗する可能性が大幅に減少し、何かが釣れる可能性が高くなることを意味します。
 
====条件付き判定:レアアイテムと報酬====
 
このセクションでは、レアアイテムまたは報酬が生成されるかどうかを決定します。最も外側の条件では、ランダムな判定が成功するかどうかをチェックします。条件が満たされると、入れ子になった条件で生成するアイテムの種類を評価します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(20) == 0)
</syntaxhighlight>
 
*'''条件''': ランダム判定に合格: <code>rnd(20) == 0</code>。
 
この条件が満たされると、以下の判定で生成されるアイテムが決定されます。
 
=====古の本=====
 
古の本は、特定の条件を満たした場合に釣りによって生成される可能性がある、レアアイテムのひとつです。 生成されるかどうかは、初期判定を通過した後のランダムな判定に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(30) == 0)
{
text = 「book_ancient」;
}
</syntaxhighlight>
 
*'''条件''': <code>rnd(30) == 0</code>の場合にアイテムが生成されます。
*'''確率''': <code>1 / 30</code>、つまり約3.33%です。


<syntaxhighlight lang="c#" line="1">
この条件が満たされた場合、古の本が報酬として作成されます。
int num3 = EClass.rnd(num * 2) + 1;
 
thing = ThingGen.Create("fish", -1, num3);
=====プラチナ硬貨=====
 
プラチナ硬貨は、釣りでも稀に入手できるレアアイテムです。 生成はランダム判定に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(35) == 0)
{
text = 「plat」;
}
</syntaxhighlight>
 
*'''条件''': <code>rnd(35) == 0</code>の場合にアイテムが生成されます。
*'''確率''': <code>1 / 35</code> (~2.86%)。
 
この条件が満たされた場合、報酬としてプラチナ硬貨が作成されます。
 
=====スクラッチカード=====
 
スクラッチカードは、プラチナ硬貨の抽選後に生成できる交換アイテムです。その生成は、プラチナ硬貨の条件を満たした後のランダムな抽選に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(2) == 0)
{
text = 「scratchcard」;
}
</syntaxhighlight>
 
*条件: <code>rnd(2) == 0</code> の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
*確率: <code>1 / 2</code> (50%) ですが、プラチナ硬貨の成功した判定に依存します。
*従属確率: <code>1 / (20 * 35 * 2)</code> (~0.071%)。
**計算式:
***レアアイテムの抽選: <code>1 / 20</code> (5%)。
***プラチナ硬貨の抽選: <code>1 / 35</code> (~2.86%)。
***スクラッチカードの抽選: <code>1 / 2</code> (50%)。
 
この条件が満たされた場合、プラチナ硬貨の代わりにスクラッチカードが報酬として提供されます。
 
=====カジノチップ=====
 
カジノチップは、プラチナ硬貨の判定後に生成される別の交換アイテムです。その生成は、プラチナ硬貨の条件が満たされた後のランダムな判定に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(3) == 0)
{
text = 「casino_coin」;
}
</syntaxhighlight>
 
*条件: <code>rnd(3) == 0</code> の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
*確率: <code>1 / 3</code>(~33.33%)ですが、プラチナ硬貨の成功した判定に依存します。
*'''依存確率''': <code>1 / (20 * 35 * 3)</code> (~0.048%).
**計算式:
***レアアイテムの抽選: <code>1 / 20</code> (5%).
***プラチナ硬貨の抽選: <code>1 / 35</code> (~2.86%).
カジノチップの判定: <code>1 / 3</code> (~33.33%)。
 
この条件が満たされた場合、報酬としてプラチナ硬貨の代わりにカジノチップが支給されます。
 
=====異国の金貨/銀貨/銅貨=====
 
異国の金貨/銀貨/銅貨は、プラチナ硬貨の判定後に生成される可能性がある別の交換アイテムです。その生成は、プラチナ硬貨の条件が満たされた後のランダムな判定に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(3) == 0)
{
text = 「gacha_coin」;
}
</syntaxhighlight>
 
*'''条件''': <code>rnd(3) == 0</code>の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
*確率: <code>1 / 3</code>(約33.33%)ですが、プラチナ硬貨の成功した判定に依存します。
*従属確率: <code>1 / (20 * 35 * 3)</code>(約0.048%)です。
**計算式:
***レアアイテムの判定: <code>1 / 20</code>(5%)です。
***プラチナ硬貨の判定: <code>1 / 35</code>(約2.86%)です。
***異国の金貨/銀貨/銅貨の判定: <code>1 / 3</code>(約33.33%)です。
 
この条件が満たされた場合、報酬としてプラチナ硬貨の代わりに異国の金貨/銀貨/銅貨が支給されます。
 
=====神像=====
 
神々の像は、プラチナ硬貨の判定後に生成される可能性がある、非常にレアなアイテムです。像の生成はランダムな判定に依存し、7つの像のうちの1つが選択されます。
 
<syntaxhighlight lang="「csharp」">
if (rnd(50) == 0)
{
    text = "Randomly choose one of these statues: "
          "Statue of Earth",
          "Statue of Element",
          "Statue of Harvest",
          "Statue of Healing",
          "Statue of Luck",
          "Statue of Machine",
          "Statue of Wind";
}
</syntaxhighlight>
 
*条件: <code>rnd(50) == 0</code> の場合に像が生成されます。
*確率: <code>1 / 50</code> (2%) ですが、これはプラチナ硬貨の成功した判定に依存します。
*従属確率: <code>1 / (20 * 35 * 50)</code> (~0.00286%)。
**計算式:
***レアアイテムの判定: <code>1 / 20</code> (5%)。
***プラチナ硬貨の判定: <code>1 / 35</code> (~2.86%)。
***神像の判定: <code>1 / 50</code> (2%)
 
この条件が満たされた場合、以下のいずれかの像がランダムに選択されます。
*『大地の神像』
*『元素の神像』
*『収穫の神像』
*『癒しの女神像』
*『幸運の女神像』
*『機械の神像』
*『風の女神像』
 
各像は、7つの像の中から等しい確率で選ばれます。
*「特定の像の確率」:像が選ばれる確率は <code>1 / 7</code>(約14.29%)です。
*「特定の像の従属確率」:<code>1 / (20 * 35 * 50 * 7)</code>(約0.00041%)です。
 
=====小さなメダル=====
 
小さなメダルは、釣りによって稀に入手できるアイテムです。その入手確率は、2つのランダムな判定に依存します。基本判定とレベル依存の閾値チェックです。
 
<syntaxhighlight lang="「csharp」">
if (rnd(40) == 0 && rnd(40) < fishingLevel / 3 + 10)
{
text = 「medal」;
}
</syntaxhighlight>
 
*'''条件''':
**最初の判定は、<code>rnd(40) == 0</code>(2.5%)の場合に成功します。
**2回目の判定は、<code>rnd(40) < fishingLevel / 3 + 10</code>の場合に成功します。
*'''確率''':
**最初の判定は、固定確率:<code>1 / 40</code>(2.5%)です。
**2回目の判定の確率は、プレイヤーの釣りレベルに依存します。
***釣りレベルが高いほど、閾値(<code>fishingLevel / 3 + 10</code>)が大きくなり、成功しやすくなります。
*'''安定した成功に必要な最低釣りレベル''':
**2回目の判定を常に成功させるには、閾値が40以上になる必要があります。これを解くと、
***<code>fishingLevel / 3 + 10 >= 40</code>。
***<code>fishingLevel >= (40 - 10) * 3</code>。
***<code>fishingLevel >= 90</code>。
**<code>fishingLevel = 90</code>の場合、しきい値は <code>90 / 3 + 10 = 40</code>となり、安定した成功が保証されます。
 
*'''依存確率''':
**複合確率:<code>(1 / 20) * (1 / 40) * (釣りレベル依存のしきい値)</code>。
**釣りレベル10の例:
***しきい値:<code>10 / 3 + 10 = ~13.33</code>。
***2回目の判定は、<code>rnd(40) < 13</code>、または <code>13 / 40</code> (32.5%) の場合、成功します。
***総合確率:<code>(1 / 20) * (1 / 40) * (13 / 40)</code> (~0.01625%)。
 
====ジャンク====
 
ジャンクは、釣り中に獲得できる価値の低い報酬のカテゴリーです。 それらの生成は、より優先度の高いアイテム(レアアイテムやメダルなど)がすべて生成されなかった場合のランダムな判定に依存します。
 
<syntaxhighlight lang="「csharp」">
if (rnd(5 + fishingLevel / 3) == 0)
{
    thing = "Randomly choose one of these junk items: "
            "Boots",
            "Empty Bottle (1)",
            "Empty Bottle (2)",
            "Empty Can (1)",
            "Empty Can (2)",
            "Flotsam from the North",
            "Lucky Cat",
            "Rubber Duck",
            "Rubber Putit",
            "Rubber Snail",
            "Sandal (1)",
            "Sandal (2)",
            "Sea Pants";
}
</syntaxhighlight>
</syntaxhighlight>


===魚の数===
*'''条件''': ジャンクは以下の場合に生成されます。
**レアアイテムのダイスと、それより優先順位の高いダイスすべてが失敗した場合。
**次のダイスが成功した場合:<code>rnd(5 + fishingLevel / 3) == 0</code>。
*'''確率''':
**確率はプレイヤーの釣りレベルに依存します。
***<code>1 / (5 + fishingLevel / 3)</code>。
***釣りレベルが高いほど分母が大きくなるため、ジャンクが生成される確率が減少します。
*'''ジャンクアイテムプール''':
**この判定が成功した場合、以下のリスト(合計15個)からランダムに1つのアイテムが選択されます。
***'''長靴'''
***'''空き瓶 (1)'''
***'''空き瓶 (2)'''
***'''空き缶 (1)'''
***'''空き缶 (2)'''
***'''北からの漂着物'''
***'''ラッキーキャット'''
***'''ラバーダック'''
***'''ラバープチ'''
***'''ラバーカタツムリ'''
***'''下駄'''
***'''草履'''
***'''海パン'''
 
*『特定のジャンクの確率』:
**リスト内の各アイテムに等しい確率:ジャンク判定の成功確率は <code>1 / 15</code>(約6.67%)です。


自分の釣りレベルから釣れる匹数を計算する公式は次の通りです。
=====計算例=====
*『釣りレベル10』の場合:
**ジャンク判定の閾値: <code>5 + 10 / 3 = ~8.33</code>。
**ジャンク判定成功の確率: <code>1 / 8</code> (12.5%)。
**特定のジャンクの確率: <code>1 / 8 * 1 / 15 = 1 / 120</code> (~0.83%)。


<pre>numberOfFish = rnd(fishingLevel / (fishLV + 10)) + 1</pre>
====魚====
 
魚の生成は、優先順位の高いすべての判定が失敗した場合の既定の結果として発生します。
*'''依存関係''':
**魚の判定は、以下の場合に発生します。
***「何もなし」の判定が失敗した場合。
***「レアアイテム」の判定が失敗した場合。
***「ジャンク」の判定が失敗した場合。
 
=====確率のコンテキスト=====
 
魚の判定は最後の代替手段として発生するため、その確率は以下のように計算されます。
*'''魚の判定の確率''':
<code>1 - P(Nothing) - P(Rare Item) - P(Junk)</code>
*'''従属確率''':
**これは以下に依存します。
***釣りレベル(「何もなし」と「ジャンク」の確率に影響します)。
***前回の判定の成功/失敗。
 
=====クジラの計算例=====
 
釣りレベル19では、クジラの「最低釣りレベル」は19です。 調整レベル(adjustedLV)が40以上の場合、クジラを釣り上げることができます。


* '''釣りレベル''':現在の釣りスキルレベル。
クジラを釣り上げる確率を計算するには:
* '''魚レベルLV''':魚のレベル。
* '''rnd''':'''0'''から関数に渡された値までの間のランダムな数値。


==== 例 ====
<syntaxhighlight lang="「csharp」">
釣りレベルが'''3'''で、魚のレベルが'''5'''と判定された場合、潜在的な魚の数は以下のように計算されます。<pre>rnd(3 / (5 + 10)) + 1</pre>
P(Whale) = 50 / Total Chance of All Eligible Fish
</syntaxhighlight>


もっと簡略化するとこうなります:
もし「Fishing Level 19」におけるすべての対象魚の「total chance」が「22050」である場合、


<pre>rnd(3 / 15) + 1</pre>
<syntaxhighlight lang="「csharp」">
P(Whale) = 50 / 22050 = 0.00227 または ~0.227%
</syntaxhighlight>


<code>rnd(3 / 15)</code>は、'''0'''から約'''0.2'''の間の乱数を生成します。1を足すと、少なくとも1匹は魚が釣れることが保証されます。
=====魚の確率表 (魚LV 40)=====
{| class="wikitable sortable」"
|-
!名前!!Chance!!独立確率
|-
|おたまじゃくし||1000||1000 / 22050 (~4.54%)
|-
|ゼニタナゴ||1000||1000 / 22050 (~4.54%)
|-
|亀||200||200 / 22050 (~0.91%)
|-
|ハゼ||1000||1000 / 22050 (~4.54%)
|-
|カジカ||1000||1000 / 22050 (~4.54%)
|-
|金魚||200||200 / 22050 (~0.91%)
|-
|コイ||100||100 / 22050 (~0.45%)
|-
|アユ||1000||1000 / 22050 (~4.54%)
|-
|ウニ||200||200 / 22050 (~0.91%)
|-
|イワシ||1000||1000 / 22050 (~4.54%)
|-
|ウナギ||500||500 / 22050 (~2.27%)
|-
|スズキ||1000||1000 / 22050 (~4.54%)
|-
|キレアジ||1000||1000 / 22050 (~4.54%)
|-
|アロワナ||600||600 / 22050 (~2.72%)
|-
|シロアマダイ||1000||1000 / 22050 (~4.54%)
|-
|ハリマグロ||400||400 / 22050 (~1.81%)
|-
|シマアジ||1000||1000 / 22050 (~4.54%)
|-
|サバ||1000||1000 / 22050 (~4.54%)
|-
|カツオ||1000||1000 / 22050 (~4.54%)
|-
|キンメダイ||200||200 / 22050 (~0.91%)
|-
|ブラックバス||1000||1000 / 22050 (~4.54%)
|-
|フグ||200||200 / 22050 (~0.91%)
|-
|真鯛||500||500 / 22050 (~2.27%)
|-
|ヒラメ||1000||1000 / 22050 (~4.54%)
|-
|マグロ||500||500 / 22050 (~2.27%)
|-
|キス||1000||1000 / 22050 (~4.54%)
|-
|サーモン||500||500 / 22050 (~2.27%)
|-
|マンボウ||1000||1000 / 22050 (~4.54%)
|-
|サメ||100||100 / 22050 (~0.45%)
|-
|深海魚||1000||1000 / 22050 (~4.54%)
|-
|古代魚||200||200 / 22050 (~0.91%)
|-
|ムーンフィッシュ||500||500 / 22050 (~2.27%)
|-
|シーラカンス||100||100 / 22050 (~0.45%)
|-
|クジラ||50||50 / 22050 (~0.23%)
|}


==== 魚の数表 ====
====すべてのアイテムの確率表====
{| class="wikitable"
{| class="wikitable"
!アイテム
!独立確率
!従属確率
!備考
|-
|-
!魚LV!!魚を2匹釣るための最低釣りレベル!!魚を3匹釣るための最低釣りレベル
|なし
|<code>1 / (3 + fishingLevel)</code>
|N/A
|釣りレベルが高いほど、この結果になる確率が低くなります。
|-
|-
|1||11||22
|レアアイテム
|<code>1 / 20</code> (5%)
|<code>1 / 20</code>
|レアアイテムが出るかどうかを決定します。
|-
|-
|5||16||32
|古文書(古の本)
|<code>1 / 30</code> (~3.33%)
|<code>1 / (20 * 30)</code> (~0.167%)
|まずレアアイテムの使用に成功する必要があり、その後、自身の確率が適用されます。
|-
|-
|10||21||42
|プラチナ硬貨
|<code>1 / 35</code> (~2.86%)
|<code>1 / (20 * 35)</code> (~0.143%)
|レアアイテムの判定成功、その後、独自の確率が必要です。
|-
|-
|15||26||52
|スクラッチカード
|<code>1 / 2</code> (50%)
|<code>1 / (20 * 35 * 2)</code> (~0.071%)
|条件が満たされた場合、プラチナ硬貨と置き換わります。
|-
|-
|20||31||62
|カジノチップ
|<code>1 / 3</code> (33.3%)
|<code>1 / (20 * 35 * 3)</code> (~0.048%)
|条件を満たした場合、プラチナ硬貨と交換されます。
|-
|-
|25||36||72
|異国の金貨/銀貨/銅貨
|<code>1 / 3</code> (33.3%)
|<code>1 / (20 * 35 * 3)</code> (~0.048%)
|条件を満たした場合、プラチナ硬貨と交換されます。
|-
|-
|30||41||82
|神像
|<code>1 / 50</code> (2%)
|<code>1 / (20 * 35 * 50)</code> (~0.00286%)
|レアアイテムの判定成功が必要です。7つの像のうちの1つがランダムに選択されます。
|-
|-
|35||46||92
|特定の神像
|<code>1 / 7</code> (~14.29% of Statue Roll)
|<code>1 / (20 * 35 * 50 * 7)</code> (~0.00041%)
|7つの像のうち、特定の神像を得る確率。
|-
|-
|40||51||102
|小さなメダル
|レベル依存
|<code>(1 / 20) * (1 / 40) * (fishingLevel threshold)</code>
|2回の判定成功が必要です。fishingLevel >= 90で安定した成功。
|-
|ジャンク
|レベル依存
|<code>1 / (5 + fishingLevel / 3)</code>
|レアアイテムの判定に失敗する必要があります。釣りレベルが高くなるにつれ、確率が減少します。
|-
|特定のジャンク
|<code>1 / 15</code> (~6.67%)
|<code>(1 / (5 + fishingLevel / 3)) * (1 / 15)</code>
|特定のジャンク品を入手する確率。
|-
|
|<code>fishChance / fishTotalChance</code>
|<code>1 - P(Nothing) - P(Rare Item) - P(Junk)</code>
|他のすべての判定が失敗した場合のデフォルトの結果。
|}
|}


====コード (EA 23.37)====
====コード (EA 23.43)====


<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="「c#" line="「1」">
public static Thing Makefish(Chara c)
{
int num = c.Evalue(245);
if (EClass.rnd(3 + num) == 0)
{
return null;
}
int[] source = new int[]
{
233,
235,
236,
236,
236,
1170,
1143,
1144,
727,
728,
237,
869,
1178,
1179,
1180
};
int num2 = 1;
string text = 「」;
if (c.IsPC || EClass.rnd(20) == 0)
{
if (EClass.rnd(30) == 0)
{
text = 「book_ancient」;
}
if (EClass.rnd(35) == 0 || EClass.debug.enable)
{
text = 「plat」;
if (EClass.rnd(2) == 0)
{
text = 「scratchcard」;
}
if (EClass.rnd(3) == 0)
{
text = 「casino_coin」;
}
if (EClass.rnd(3) == 0)
{
text = 「gacha_coin」;
}
if (EClass.rnd(50) == 0 || EClass.debug.enable)
{
text = new string[]
{
「659」,
「758「,
「759」,
「806「,
「828」,
「1190「,
「1191」
}.RandomItem<string>();
}
}
if (EClass.rnd(40) == 0 && EClass.rnd(40) < num / 3 + 10)
{
text = 」medal」;
}
}
thing thing;
if (text != 「」)
{
thing = ThingGen.Create(text, -1, -1);
}
else if (EClass.rnd(5 + num / 3) == 0)
{
thing = ThingGen.Create(source.RandomItem<int>().ToString() ?? 「」, -1, -1);
}
else
{
int num3 = EClass.rnd(num * 2) + 1;
thing = ThingGen.Create(「fish」, -1, num3);
num2 = EClass.rnd(num / (num3 + 10)) + 1;
num2 = EClass.rnd(num / (num3 + 10)) + 1;
int num4 = 5;
int num4 = 5;
if (EClass.Branch != null)
if (EClass.Branch != null)
{
{
    num4 += EClass.Branch.Evalue(3604) * 20 + EClass.Branch.Evalue(3706) * 25;
num4 += EClass.Branch.Evalue(3604) * 20 + EClass.Branch.Evalue(3605) * 20 + EClass.Branch.Evalue(3706) * 25;
}
}
if (num4 >= EClass.rnd(100))
if (num4 >= EClass.rnd(100))
{
{
    num2++;
num2++;
}
}
}
if (thing != null)
if (thing != null)
{
{
    thing.SetNum(num2);
thing.SetNum(num2);
    thing.SetBlessedState(BlessedState.Normal);
thing.SetBlessedState(BlessedState.Normal);
}
return thing;
}
}
</syntaxhighlight>
</syntaxhighlight>
[[Category:Elin Spoiler]]
[[Category:Elin Spoiler]]
[[Category:JA]]
[[Category:JA]]
{{DEFAULTSORT:カイセキ,ツリ}}

Latest revision as of 13:42, 3 December 2024


釣りに関する計算式などのページです。

魚 LV

自分の釣りレベルから釣れる魚LVを算出する公式:

fishLV = rnd(fishingLevel * 2) + 1
  • 釣りレベル: 現在の釣りスキルレベル。
  • rnd: 0から関数に渡された値までの間のランダムな数値。

調整済み魚LV

調整済み魚LVはアイテム作成時に計算されます。これは「rnd」関数に複数回呼び出しを行い、最後に「+2」というハードコードされた値を追加します。最終的な調整レベルは次のようになります。

adjustedLV = fishLV + 2 + rnd(rnd(rnd(rnd(Mathf.Min(fishLV * 2, 20)) + 1) + 1) + 1)
  • 調整プロセスには以下の処理が含まれます。
    • 基本となる fishLVrnd(fishingLevel * 2) + 1 と決定します。
    • 「rnd」関数に複数回呼び出しを適用します。
      • 「rnd」は「0」から「(最大値 - 1)」までの間のランダムな数値を生成します。
      • 各呼び出しは、直前の「rnd」の結果に依存し、徐々に可能な範囲を狭めていきます。
    • ハードコードされた「+2」を追加し、調整されたLVが常にオフセットを持つようにします。
  • 備考:まれに、rndへの複数回の呼び出しの最終結果が理論上は最大19まで上昇し、調整LVが大幅に上昇することがあります。

釣りレベルが「10」の場合:

  • 「基本レベル」:
    • 「fishLV = rnd(10 * 2) + 1 = rnd(20) + 1」。
    • 結果例:「10」。
  • 調整:
    • 1つ目 rnd(20) → 結果 = 7.
    • 2つ目 rnd(7 + 1) → 結果 = 3.
    • 3つ目 rnd(3 + 1) → 結果 = 2.
    • 4つ目 rnd(2 + 1) → 結果 = 0.
  • 最終的な調整後LV:
    • adjustedLV = 10 + 2 + 0 = 12.

魚LV範囲表

釣りレベル 最低LV 最大LV
1 3 4
2 3 6
3 3 8
4 3 10
5 3 12
6 3 14
7 3 16
8 3 18
9 3 20
10 3 22
11 3 24
12 3 26
13 3 28
14 3 30
15 3 32
16 3 34
17 3 36
18 3 38
19 3 40

コード (EA 23.41)

int num3 = EClass.rnd(num * 2) + 1;
thing = ThingGen.Create("fish", -1, num3);

lv = lv + 2 + EClass.rnd(EClass.rnd(EClass.rnd(EClass.rnd(Mathf.Min(lv * 2, 20)) + 1) + 1) + 1);

魚の数

自分の釣りレベルから釣れる匹数を計算する式は次の通りです。

numberOfFish = rnd(fishingLevel / (fishLV + 10)) + 1
  • 釣りレベル:現在の釣りスキルレベル。
  • 魚レベルLV:魚のレベル。
  • rnd0から関数に渡された値までの間のランダムな数値。

釣りレベルが22で、魚のレベルが1と判定された場合、潜在的な魚の数は以下のように計算されます。

rnd(22 / (1 + 10)) + 1

もっと簡略化するとこうなります:

rnd(22 / 11) + 1

rnd(2)は、0から約1の間の乱数を生成します。1を足すと、少なくとも1匹の魚を釣り上げることができます。魚の数は、ランダムな結果によって1匹か2匹のどちらかになります。

土地フィート

追加で1匹の魚を釣り上げる最初のチャンスは「5%」から始まります。

土地フィートに以下を含む場合:

  • ビーチ (3604): 基本確率に 20% を追加します。
  • 海 (3605): 基本確率に 20% を追加します。
  • 釣り場 (3706): 基本確率に 25% を追加します。

海 (3605) または ビーチ (3604) はいずれか一方のみが存在し得る(両方は存在しない)ため、合計確率は以下のように計算されます。

chanceForOneMoreFish = 5
chanceForOneMoreFish += isBeach * 20 + isSea * 20 + isFishingSpot * 25

以下を参照してください。

  • isBeach: 土地フィートが「ビーチ(3604)」であることを示すフラグ(0または1)。
  • isSea: 土地フィートが「海(3605)」であることを示すフラグ(0または1)。
  • isFishingSpot: 土地が釣り場(3706)であるかどうかを示すフラグ(0または1)。

例えば:

  • 海 (3605)が存在し、さらに釣り場(3706)も存在する場合:
chanceForOneMoreFish = 5 + 1 * 20 + 1 * 25 = 50
  • 海 (3605) の代わりに ビーチ (3604) が存在する場合:
chanceForOneMoreFish = 5 + 1 * 20 + 1 * 25 = 50

魚の数を増やすチャンスの確認

chanceForOneMoreFishの値は、0から99(両端の値を含む)の間の数値を生成するrnd(100)関数によって生成された乱数と比較されます。

chanceForOneMoreFishが乱数以上の場合、魚の数は「1」増えます。

このチェックは以下のように実装されています。

if (chanceForOneMoreFish >= rnd(100))

例えば:

  • chanceForOneMoreFish = 50、かつ rnd(100) によって生成された乱数が 50 以下 の場合、魚が1匹追加で釣れます。

土地フィートの例

例 1: 釣り場 (3706) と海 (3605)

あなたの釣りレベルが「22」、魚のレベルが「1」だとします。魚の基本数は以下のように計算されます。

numberOfFish = rnd(22 / (1 + 10)) + 1 = rnd(2) + 1

これにより、ランダムな結果に応じて「1」または「2」の魚が得られます。

次に、陸での成果を評価します。

  • まず、chanceForOneMoreFish = 5(基本確率)とします。
  • 海(3605)20 を追加します。
  • 釣り場 (3706)25 を追加します。

新しい chanceForOneMoreFish は次のようになります。

chanceForOneMoreFish = 5 + 20 + 25 = 50

続いて、ランダムなチャンスが判定されます。

if (chanceForOneMoreFish >= rnd(100))

rnd(100)によって生成された乱数が「50以下」の場合、魚の数は「1」増えます。したがって、

  • 「numberOfFish = numberOfFish + 1」(乱数のチェックに合格した場合)。
  • 乱数が「50」を超える場合、魚の数は変化しません。
例2: 釣りスポット (3706) とビーチ (3604)

同じ釣りレベルと魚LVの場合、土地の成果は以下のようになります。

  • ビーチ (3604)20 を追加します。
  • 釣りスポット (3706)25 を追加します。

合計の「chanceForOneMoreFish」は次のままです。

chanceForOneMoreFish = 5 + 20 + 25 = 50

ランダムチェックは、追加の魚の確率が同じであることを除いて、上記と同じ動作をします。

魚の数表

魚LV 2匹釣るための最低釣りレベル 3匹釣るための最低釣りレベル 4匹以上釣るための最低釣りレベル
1 22 33 44, etc.
5 30 45 60, etc.
10 40 60 80, etc.
15 50 75 100, etc.
20 60 90 120, etc.
25 70 105 140, etc.
30 80 120 160, etc.
35 90 135 180, etc.
40 100 150 200, etc.

備考:4匹以降の魚の値も同じパターンに従う(前の列と同じ間隔で増加していく)。

コード (EA 23.40)

num2 = EClass.rnd(num / (num3 + 10)) + 1;
int num4 = 5;
if (EClass.Branch != null)
{
    num4 += EClass.Branch.Evalue(3604) * 20 + EClass.Branch.Evalue(3605) * 20 + EClass.Branch.Evalue(3706) * 25;
}
if (num4 >= EClass.rnd(100))
{
    num2++;
}
if (thing != null)
{
    thing.SetNum(num2);
    thing.SetBlessedState(BlessedState.Normal);
}

釣り速度

釣りのプロセスには、2つの重要な変数が関わります。

  • 進行度: 釣りの全体の所要時間または完了率を表し、0から100までの範囲です。
  • ヒット: 魚との格闘中に試行された回数を追跡します。以下の条件が適用されます。
    • 増加: 以下のいずれかが発生するまで、試行ごとにヒットが増加します。

魚が釣れた場合(「hit」が「ランダム閾値」より大きい場合)。

特定のランダム条件により「hit」が「0」にリセットされる場合。

成功

魚を釣るための成功閾値を計算する式は以下の通りです。

successThreshold = Mathf.Clamp(10 - rnd(fishingLevel + 1) / 10, 5, 10)
  • fishingLevel: 現在の釣りスキルレベル。
  • rnd: 0 から関数に渡された値までの間の乱数。
  • Clamp: 値が 5(最も簡単)から 10(最も難しい)の範囲に収まるようにします。

実際の成功ロジックは以下の通りです。

if (hit > rnd(successThreshold)) {
hit = 100;
progress = MaxProgress;
}
  • hit: 現在の試行回数を追跡します。hitがsuccessThresholdのランダム判定を超えると魚が釣れたことになります。
  • progress: 成功すると自動的に完了します。

釣りレベルが「20」の場合、計算は以下のように進みます。

  1. rnd(20 + 1) は「0」から「20」までの間の乱数を生成します。
  2. この乱数を「10」で割った値を「10」から引きます。

結果は [5, 10] の範囲に制限され、successThreshold が決定されます。

例えば:

  • rnd(21) = 10 の場合、計算は次のようになります。
successThreshold = Mathf.Clamp(10 - (10 / 10), 5, 10) = 9

乱数rnd(9)の値によって閾値が決定されます。 hit > rnd(9) の場合、魚が釣れます。

成功閾値テーブル

釣りレベル 最小成功閾値 最大成功閾値
1 10 10
5 10 10
10 9 10
15 9 10
20 8 10
25 8 10
30 7 10
35 7 10
40 6 10
45 6 10
50 5 10
55 5 10
60 5 10

リセット

「ヒット」のリセットを決定する計算式は以下の通りです。

resetThreshold = Mathf.Clamp(10 - rnd(fishingLevel + 1) / 5, 2, 10)
  • fishingLevel: 現在の釣りスキルレベル。
  • rnd: 0 から関数に渡された値までの間の乱数。
  • Clamp: 値が 2(リセットが最も容易な閾値)から 10(リセットが最も困難な閾値)の範囲に収まるようにします。

rnd(resetThreshold)0' に等しく、かつ progress >= 10 の場合、hitカウンターは 0 にリセットされます。

釣りレベルが 30 の場合、計算は以下のように進みます。

  1. rnd(30 + 1) は、0から30までの間のランダムな数値を生成します。
  2. このランダムな数値を5で割った値から10を引きます。
  3. 結果は[2, 10]の範囲に制限され、resetThresholdが決定されます。

例えば:

  • rnd(31) = 10の場合、計算は次のようになります。
resetThreshold = Mathf.Clamp(10 - (10 / 5), 2, 10) = 8

2番目の乱数判定、rnd(8)が実行されます。結果が「0」の場合、「ヒット」カウンターがリセットされます。

リセット閾値テーブル

釣りレベル Min resetThreshold Max resetThreshold
1 10 10
5 9 10
10 8 10
15 7 10
20 6 10
25 5 10
30 4 10
35 3 10
40 2 10
45 2 10
50 2 10

コード(EA 23.37)

public override void OnProgress()
{
if (this.owner.IsPC && (this.owner.Tool == null || !this.owner.Tool.HasElement(245, 1)))
{
this.Cancel();
return;
}
if (this.hit >= 0)
{
this.owner.renderer.PlayAnime(AnimeID.Fishing, default(Vector3), false);
this.owner.PlaySound(「fish_fight」, 1f, true);
this.Ripple();
int a = Mathf.Clamp(10 - EClass.rnd(this.owner.Evalue(245) + 1) / 10, 5, 10);
if (this.hit > EClass.rnd(a))
{
this.hit = 100;
this.progress = this.MaxProgress;
}
this.hit++;
return;
}
if (EClass.rnd(Mathf.Clamp(10 - EClass.rnd(this.owner.Evalue(245) + 1) / 5, 2, 10)) == 0 && this.progress >= 10)
{
this.hit = 0;
}
if (this.progress == 2 || (this.progress >= 8 && this.progress % 6 == 0 && EClass.rnd(3) == 0))
{
this.owner.renderer.PlayAnime(AnimeID.Shiver, default(Vector3), false);
this.Ripple();
}
}

チャンスと確率

釣りで手に入る各アイテムや魚には、以下のルールと計算によって決定される固有の確率が存在します。

判定 ロジック
何もなし これが成功すると、それ以上の判定は発生しません。
レアアイテム 「何もなし」が失敗した場合にチェックされます。これが成功すると、それ以上の判定は発生しません。
ジャンク 「何もなし」と「レアアイテム」の両方が失敗した場合にチェックされます。成功した場合、それ以上の判定は発生しません。
それまでのすべての判定が失敗した場合の代替/デフォルトの判定です。

初期判定:何も釣れない確率

最初の判定では、プレイヤーが何かを釣れるかどうかを決定します。この判定に失敗した場合は、アイテムも魚も生成されず、関数は null を返します。何も釣り上げることができない確率は、以下の式で計算されます。

if (rnd(3 + fishingLevel) == 0)
{
return null;
}
  • 計算式: rnd(3 + fishingLevel) は、0 から (3 + fishingLevel - 1) までの範囲の乱数を生成します。
  • 条件: 結果が 0 の場合、判定は失敗し、何も釣れません。
確率

何も釣れない確率は、プレイヤーの釣りレベルが上がるにつれて減少します。

  • 最大値: 3 + fishingLevel、ここで fishingLevel = c.Evalue(245)
  • 何も釣れない確率:
    • 1 / (3 + fishingLevel)

例えば:

  • 「釣りレベル1」の場合:
    • rnd(3 + 1)0 から 3 の間の数値を生成します。
    • 0 の確率: 1 / 4 (25%)
  • 「釣りレベル10」の場合:
    • rnd(3 + 10) は、0から12までの数字を生成します。
    • 0の確率: 1 / 13(約7.69%)。

これは、高い釣りレベルでは、判定に失敗する可能性が大幅に減少し、何かが釣れる可能性が高くなることを意味します。

条件付き判定:レアアイテムと報酬

このセクションでは、レアアイテムまたは報酬が生成されるかどうかを決定します。最も外側の条件では、ランダムな判定が成功するかどうかをチェックします。条件が満たされると、入れ子になった条件で生成するアイテムの種類を評価します。

if (rnd(20) == 0)
  • 条件: ランダム判定に合格: rnd(20) == 0

この条件が満たされると、以下の判定で生成されるアイテムが決定されます。

古の本

古の本は、特定の条件を満たした場合に釣りによって生成される可能性がある、レアアイテムのひとつです。 生成されるかどうかは、初期判定を通過した後のランダムな判定に依存します。

if (rnd(30) == 0)
{
text = 「book_ancient」;
}
  • 条件: rnd(30) == 0の場合にアイテムが生成されます。
  • 確率: 1 / 30、つまり約3.33%です。

この条件が満たされた場合、古の本が報酬として作成されます。

プラチナ硬貨

プラチナ硬貨は、釣りでも稀に入手できるレアアイテムです。 生成はランダム判定に依存します。

if (rnd(35) == 0)
{
text = 「plat」;
}
  • 条件: rnd(35) == 0の場合にアイテムが生成されます。
  • 確率: 1 / 35 (~2.86%)。

この条件が満たされた場合、報酬としてプラチナ硬貨が作成されます。

スクラッチカード

スクラッチカードは、プラチナ硬貨の抽選後に生成できる交換アイテムです。その生成は、プラチナ硬貨の条件を満たした後のランダムな抽選に依存します。

if (rnd(2) == 0)
{
text = 「scratchcard」;
}
  • 条件: rnd(2) == 0 の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
  • 確率: 1 / 2 (50%) ですが、プラチナ硬貨の成功した判定に依存します。
  • 従属確率: 1 / (20 * 35 * 2) (~0.071%)。
    • 計算式:
      • レアアイテムの抽選: 1 / 20 (5%)。
      • プラチナ硬貨の抽選: 1 / 35 (~2.86%)。
      • スクラッチカードの抽選: 1 / 2 (50%)。

この条件が満たされた場合、プラチナ硬貨の代わりにスクラッチカードが報酬として提供されます。

カジノチップ

カジノチップは、プラチナ硬貨の判定後に生成される別の交換アイテムです。その生成は、プラチナ硬貨の条件が満たされた後のランダムな判定に依存します。

if (rnd(3) == 0)
{
text = 「casino_coin」;
}
  • 条件: rnd(3) == 0 の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
  • 確率: 1 / 3(~33.33%)ですが、プラチナ硬貨の成功した判定に依存します。
  • 依存確率: 1 / (20 * 35 * 3) (~0.048%).
    • 計算式:
      • レアアイテムの抽選: 1 / 20 (5%).
      • プラチナ硬貨の抽選: 1 / 35 (~2.86%).

カジノチップの判定: 1 / 3 (~33.33%)。

この条件が満たされた場合、報酬としてプラチナ硬貨の代わりにカジノチップが支給されます。

異国の金貨/銀貨/銅貨

異国の金貨/銀貨/銅貨は、プラチナ硬貨の判定後に生成される可能性がある別の交換アイテムです。その生成は、プラチナ硬貨の条件が満たされた後のランダムな判定に依存します。

if (rnd(3) == 0)
{
text = 「gacha_coin」;
}
  • 条件: rnd(3) == 0の場合にアイテムが生成され、プラチナ硬貨と置き換わります。
  • 確率: 1 / 3(約33.33%)ですが、プラチナ硬貨の成功した判定に依存します。
  • 従属確率: 1 / (20 * 35 * 3)(約0.048%)です。
    • 計算式:
      • レアアイテムの判定: 1 / 20(5%)です。
      • プラチナ硬貨の判定: 1 / 35(約2.86%)です。
      • 異国の金貨/銀貨/銅貨の判定: 1 / 3(約33.33%)です。

この条件が満たされた場合、報酬としてプラチナ硬貨の代わりに異国の金貨/銀貨/銅貨が支給されます。

神像

神々の像は、プラチナ硬貨の判定後に生成される可能性がある、非常にレアなアイテムです。像の生成はランダムな判定に依存し、7つの像のうちの1つが選択されます。

if (rnd(50) == 0)
{
    text = "Randomly choose one of these statues: "
           "Statue of Earth", 
           "Statue of Element", 
           "Statue of Harvest", 
           "Statue of Healing", 
           "Statue of Luck", 
           "Statue of Machine", 
           "Statue of Wind";
}
  • 条件: rnd(50) == 0 の場合に像が生成されます。
  • 確率: 1 / 50 (2%) ですが、これはプラチナ硬貨の成功した判定に依存します。
  • 従属確率: 1 / (20 * 35 * 50) (~0.00286%)。
    • 計算式:
      • レアアイテムの判定: 1 / 20 (5%)。
      • プラチナ硬貨の判定: 1 / 35 (~2.86%)。
      • 神像の判定: 1 / 50 (2%)。

この条件が満たされた場合、以下のいずれかの像がランダムに選択されます。

  • 『大地の神像』
  • 『元素の神像』
  • 『収穫の神像』
  • 『癒しの女神像』
  • 『幸運の女神像』
  • 『機械の神像』
  • 『風の女神像』

各像は、7つの像の中から等しい確率で選ばれます。

  • 「特定の像の確率」:像が選ばれる確率は 1 / 7(約14.29%)です。
  • 「特定の像の従属確率」:1 / (20 * 35 * 50 * 7)(約0.00041%)です。
小さなメダル

小さなメダルは、釣りによって稀に入手できるアイテムです。その入手確率は、2つのランダムな判定に依存します。基本判定とレベル依存の閾値チェックです。

if (rnd(40) == 0 && rnd(40) < fishingLevel / 3 + 10)
{
text = 「medal」;
}
  • 条件:
    • 最初の判定は、rnd(40) == 0(2.5%)の場合に成功します。
    • 2回目の判定は、rnd(40) < fishingLevel / 3 + 10の場合に成功します。
  • 確率:
    • 最初の判定は、固定確率:1 / 40(2.5%)です。
    • 2回目の判定の確率は、プレイヤーの釣りレベルに依存します。
      • 釣りレベルが高いほど、閾値(fishingLevel / 3 + 10)が大きくなり、成功しやすくなります。
  • 安定した成功に必要な最低釣りレベル:
    • 2回目の判定を常に成功させるには、閾値が40以上になる必要があります。これを解くと、
      • fishingLevel / 3 + 10 >= 40
      • fishingLevel >= (40 - 10) * 3
      • fishingLevel >= 90
    • fishingLevel = 90の場合、しきい値は 90 / 3 + 10 = 40となり、安定した成功が保証されます。
  • 依存確率:
    • 複合確率:(1 / 20) * (1 / 40) * (釣りレベル依存のしきい値)
    • 釣りレベル10の例:
      • しきい値:10 / 3 + 10 = ~13.33
      • 2回目の判定は、rnd(40) < 13、または 13 / 40 (32.5%) の場合、成功します。
      • 総合確率:(1 / 20) * (1 / 40) * (13 / 40) (~0.01625%)。

ジャンク

ジャンクは、釣り中に獲得できる価値の低い報酬のカテゴリーです。 それらの生成は、より優先度の高いアイテム(レアアイテムやメダルなど)がすべて生成されなかった場合のランダムな判定に依存します。

if (rnd(5 + fishingLevel / 3) == 0)
{
    thing = "Randomly choose one of these junk items: "
            "Boots",
            "Empty Bottle (1)",
            "Empty Bottle (2)",
            "Empty Can (1)",
            "Empty Can (2)",
            "Flotsam from the North",
            "Lucky Cat",
            "Rubber Duck",
            "Rubber Putit",
            "Rubber Snail",
            "Sandal (1)",
            "Sandal (2)",
            "Sea Pants";
}
  • 条件: ジャンクは以下の場合に生成されます。
    • レアアイテムのダイスと、それより優先順位の高いダイスすべてが失敗した場合。
    • 次のダイスが成功した場合:rnd(5 + fishingLevel / 3) == 0
  • 確率:
    • 確率はプレイヤーの釣りレベルに依存します。
      • 1 / (5 + fishingLevel / 3)
      • 釣りレベルが高いほど分母が大きくなるため、ジャンクが生成される確率が減少します。
  • ジャンクアイテムプール:
    • この判定が成功した場合、以下のリスト(合計15個)からランダムに1つのアイテムが選択されます。
      • 長靴
      • 空き瓶 (1)
      • 空き瓶 (2)
      • 空き缶 (1)
      • 空き缶 (2)
      • 北からの漂着物
      • ラッキーキャット
      • ラバーダック
      • ラバープチ
      • ラバーカタツムリ
      • 下駄
      • 草履
      • 海パン
  • 『特定のジャンクの確率』:
    • リスト内の各アイテムに等しい確率:ジャンク判定の成功確率は 1 / 15(約6.67%)です。
計算例
  • 『釣りレベル10』の場合:
    • ジャンク判定の閾値: 5 + 10 / 3 = ~8.33
    • ジャンク判定成功の確率: 1 / 8 (12.5%)。
    • 特定のジャンクの確率: 1 / 8 * 1 / 15 = 1 / 120 (~0.83%)。

魚の生成は、優先順位の高いすべての判定が失敗した場合の既定の結果として発生します。

  • 依存関係:
    • 魚の判定は、以下の場合に発生します。
      • 「何もなし」の判定が失敗した場合。
      • 「レアアイテム」の判定が失敗した場合。
      • 「ジャンク」の判定が失敗した場合。
確率のコンテキスト

魚の判定は最後の代替手段として発生するため、その確率は以下のように計算されます。

  • 魚の判定の確率:

1 - P(Nothing) - P(Rare Item) - P(Junk)

  • 従属確率:
    • これは以下に依存します。
      • 釣りレベル(「何もなし」と「ジャンク」の確率に影響します)。
      • 前回の判定の成功/失敗。
クジラの計算例

釣りレベル19では、クジラの「最低釣りレベル」は19です。 調整レベル(adjustedLV)が40以上の場合、クジラを釣り上げることができます。

クジラを釣り上げる確率を計算するには:

P(Whale) = 50 / Total Chance of All Eligible Fish

もし「Fishing Level 19」におけるすべての対象魚の「total chance」が「22050」である場合、

P(Whale) = 50 / 22050 = 0.00227 または ~0.227%
魚の確率表 (魚LV 40)
名前 Chance 独立確率
おたまじゃくし 1000 1000 / 22050 (~4.54%)
ゼニタナゴ 1000 1000 / 22050 (~4.54%)
200 200 / 22050 (~0.91%)
ハゼ 1000 1000 / 22050 (~4.54%)
カジカ 1000 1000 / 22050 (~4.54%)
金魚 200 200 / 22050 (~0.91%)
コイ 100 100 / 22050 (~0.45%)
アユ 1000 1000 / 22050 (~4.54%)
ウニ 200 200 / 22050 (~0.91%)
イワシ 1000 1000 / 22050 (~4.54%)
ウナギ 500 500 / 22050 (~2.27%)
スズキ 1000 1000 / 22050 (~4.54%)
キレアジ 1000 1000 / 22050 (~4.54%)
アロワナ 600 600 / 22050 (~2.72%)
シロアマダイ 1000 1000 / 22050 (~4.54%)
ハリマグロ 400 400 / 22050 (~1.81%)
シマアジ 1000 1000 / 22050 (~4.54%)
サバ 1000 1000 / 22050 (~4.54%)
カツオ 1000 1000 / 22050 (~4.54%)
キンメダイ 200 200 / 22050 (~0.91%)
ブラックバス 1000 1000 / 22050 (~4.54%)
フグ 200 200 / 22050 (~0.91%)
真鯛 500 500 / 22050 (~2.27%)
ヒラメ 1000 1000 / 22050 (~4.54%)
マグロ 500 500 / 22050 (~2.27%)
キス 1000 1000 / 22050 (~4.54%)
サーモン 500 500 / 22050 (~2.27%)
マンボウ 1000 1000 / 22050 (~4.54%)
サメ 100 100 / 22050 (~0.45%)
深海魚 1000 1000 / 22050 (~4.54%)
古代魚 200 200 / 22050 (~0.91%)
ムーンフィッシュ 500 500 / 22050 (~2.27%)
シーラカンス 100 100 / 22050 (~0.45%)
クジラ 50 50 / 22050 (~0.23%)

すべてのアイテムの確率表

アイテム 独立確率 従属確率 備考
なし 1 / (3 + fishingLevel) N/A 釣りレベルが高いほど、この結果になる確率が低くなります。
レアアイテム 1 / 20 (5%) 1 / 20 レアアイテムが出るかどうかを決定します。
古文書(古の本) 1 / 30 (~3.33%) 1 / (20 * 30) (~0.167%) まずレアアイテムの使用に成功する必要があり、その後、自身の確率が適用されます。
プラチナ硬貨 1 / 35 (~2.86%) 1 / (20 * 35) (~0.143%) レアアイテムの判定成功、その後、独自の確率が必要です。
スクラッチカード 1 / 2 (50%) 1 / (20 * 35 * 2) (~0.071%) 条件が満たされた場合、プラチナ硬貨と置き換わります。
カジノチップ 1 / 3 (33.3%) 1 / (20 * 35 * 3) (~0.048%) 条件を満たした場合、プラチナ硬貨と交換されます。
異国の金貨/銀貨/銅貨 1 / 3 (33.3%) 1 / (20 * 35 * 3) (~0.048%) 条件を満たした場合、プラチナ硬貨と交換されます。
神像 1 / 50 (2%) 1 / (20 * 35 * 50) (~0.00286%) レアアイテムの判定成功が必要です。7つの像のうちの1つがランダムに選択されます。
特定の神像 1 / 7 (~14.29% of Statue Roll) 1 / (20 * 35 * 50 * 7) (~0.00041%) 7つの像のうち、特定の神像を得る確率。
小さなメダル レベル依存 (1 / 20) * (1 / 40) * (fishingLevel threshold) 2回の判定成功が必要です。fishingLevel >= 90で安定した成功。
ジャンク レベル依存 1 / (5 + fishingLevel / 3) レアアイテムの判定に失敗する必要があります。釣りレベルが高くなるにつれ、確率が減少します。
特定のジャンク 1 / 15 (~6.67%) (1 / (5 + fishingLevel / 3)) * (1 / 15) 特定のジャンク品を入手する確率。
fishChance / fishTotalChance 1 - P(Nothing) - P(Rare Item) - P(Junk) 他のすべての判定が失敗した場合のデフォルトの結果。

コード (EA 23.43)

public static Thing Makefish(Chara c)
{
int num = c.Evalue(245);
if (EClass.rnd(3 + num) == 0)
{
return null;
}
int[] source = new int[]
{
233,
235,
236,
236,
236,
1170,
1143,
1144,
727,
728,
237,
869,
1178,
1179,
1180
};
int num2 = 1;
string text = 「」;
if (c.IsPC || EClass.rnd(20) == 0)
{
if (EClass.rnd(30) == 0)
{
text = 「book_ancient」;
}
if (EClass.rnd(35) == 0 || EClass.debug.enable)
{
text = 「plat」;
if (EClass.rnd(2) == 0)
{
text = 「scratchcard」;
}
if (EClass.rnd(3) == 0)
{
text = 「casino_coin」;
}
if (EClass.rnd(3) == 0)
{
text = 「gacha_coin」;
}
if (EClass.rnd(50) == 0 || EClass.debug.enable)
{
text = new string[]
{
「659」,
「758「,
「759」,
「806「,
「828」,
「1190「,
「1191」
}.RandomItem<string>();
}
}
if (EClass.rnd(40) == 0 && EClass.rnd(40) < num / 3 + 10)
{
text = 」medal」;
}
}
thing thing;
if (text != 「」)
{
thing = ThingGen.Create(text, -1, -1);
}
else if (EClass.rnd(5 + num / 3) == 0)
{
thing = ThingGen.Create(source.RandomItem<int>().ToString() ?? 「」, -1, -1);
}
else
{
int num3 = EClass.rnd(num * 2) + 1;
thing = ThingGen.Create(「fish」, -1, num3);
num2 = EClass.rnd(num / (num3 + 10)) + 1;
int num4 = 5;
if (EClass.Branch != null)
{
num4 += EClass.Branch.Evalue(3604) * 20 + EClass.Branch.Evalue(3605) * 20 + EClass.Branch.Evalue(3706) * 25;
}
if (num4 >= EClass.rnd(100))
{
num2++;
}
}
if (thing != null)
{
thing.SetNum(num2);
thing.SetBlessedState(BlessedState.Normal);
}
return thing;
}