Elin:解析/釣り: Difference between revisions

From Ylvapedia
Jump to navigation Jump to search
(釣りの解析記事を作成)
 
(EN版の情報を反映。釣果表はElin:釣りに引っ越し。)
Line 1: Line 1:
==釣果表==
===魚===
{| class="wikitable sortable"
|-
!魚!!画像!!LV!!最低釣りレベル!!重量(解析値)!!重量 (s)!!価値
|-
|ゼニタナゴ||[[File:Elin Fish Sprite Bitterling.png|frameless]]||1||1||120||0.2s||80
|-
|おたまじゃくし||[[File:Elin Fish Sprite Tadpole.png|frameless]]||1||1||30||0.1s||50
|-
|金魚||[[File:Elin Fish Sprite Goldfish.png|frameless]]||1||1||140||0.2s||380
|-
|コイ||[[File:Elin Fish Sprite Carp.png|frameless]]||1||1||640||0.7s||520
|-
|ウナギ||[[File:Elin Fish Sprite Eel.png|frameless]]||5||3||400||0.4s||320
|-
|ハゼ||[[File:Elin Fish Sprite Goby.png|frameless]]||1||1||220||0.3s||150
|-
|カジカ||[[File:Elin Fish Sprite Muddler.png|frameless]]||1||1||460||0.5s||180
|-
|スズキ||[[File:Elin Fish Sprite Bass.png|frameless]]||5||3||540||0.6s||140
|-
|ウニ||[[File:Elin Fish Sprite Sea Urchin.png|frameless]]||5||3||160||0.2s||420
|-
|シロアマダイ||[[File:Elin Fish Sprite Tilefish.png|frameless]]||10||5||620||0.7s||480
|-
|キレアジ||[[File:Elin Fish Sprite Scad.png|frameless]]||10||5||360||0.4s||220
|-
|ハリマグロ||[[File:Elin Fish Sprite Tuna.png|frameless]]||10||5||850||0.9s||550
|-
|アロワナ||[[File:Elin Fish Sprite Arowana.png|frameless]]||10||5||320||0.4s||400
|-
|アユ||[[File:Elin Fish Sprite Sweetfish.png|frameless]]||5||3||200||0.2s||220
|-
|シマアジ||[[File:Elin Fish Sprite Striped Jack.png|frameless]]||15||8||440||0.5s||380
|-
|ブラックバス||[[File:Elin Fish Sprite B0lack Bass.png|frameless]]||15||8||750||0.8s||680
|-
|サバ||[[File:Elin Fish Sprite Mackerel.png|frameless]]||15||8||580||0.6s||380
|-
|キンメダイ||[[File:Elin Fish Sprite Red Bream.png|frameless]]||15||8||440||0.5s||760
|-
|亀||[[File:Elin Fish Sprite Turtle.png|frameless]]||1||1||120||0.2s||180
|-
|カツオ||[[File:Elin Fish Sprite Bonito.png|frameless]]||15||8||700||0.8s||400
|-
|マグロ||[[File:Elin Fish Sprite Tuna 2.png|frameless]]||20||10||1000||1.0s||840
|-
|フグ||[[File:Elin Fish Sprite Blowfish.png|frameless]]||20||10||260||0.3s||1250
|-
|ヒラメ||[[File:Elin Fish Sprite Flatfish.png|frameless]]||20||10||500||0.5s||450
|-
|イワシ||[[File:Elin Fish Sprite Sardine.png|frameless]]||5||3||300||0.4s||150
|-
|マダイ||[[File:Elin Fish Sprite Sea Bream.png|frameless]]||20||10||400||0.4s||950
|-
|サケ||[[File:Elin Fish Sprite Salmon.png|frameless]]||25||13||550||0.6s||720
|-
|キス||[[File:Elin Fish Sprite Sand Borer.png|frameless]]||25||13||400||0.4s||560
|-
|クジラ||[[File:Elin Fish Sprite Whale.png|frameless]]||40||20||1200000||1200.0s||45000
|-
|シーラカンス||[[File:Elin Fish Sprite Coelacanth.png|frameless]]||35||18||4800||4.8s||5600
|-
|深海魚||[[File:Elin Fish Sprite Deep Sea Fish.png|frameless]]||30||15||1500||1.5s||2400
|-
|古代魚||[[File:Elin Fish Sprite Ancient Fish.png|frameless]]||30||15||2400||2.4s||3800
|-
|サメ||[[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
|}
===ジャンク===
==計算式==
==計算式==


Line 85: Line 7:
<pre>fishLV = rnd(fishingLevel * 2) + 1</pre>
<pre>fishLV = rnd(fishingLevel * 2) + 1</pre>


* '''釣りレベル''': 現在の釣りスキルレベル。
*'''釣りレベル''': 現在の釣りスキルレベル。
* '''rnd''': '''0'''から関数に渡された値までの間のランダムな数値。
*'''rnd''': '''0'''から関数に渡された値までの間のランダムな数値。


==== 例 ====
====例====
釣りレベルが'''3'''の場合、潜在的な魚のLVは次のように計算されます。<pre>rnd(3 * 2) + 1</pre>
釣りレベルが'''22'''の場合、潜在的な魚のLVは次のように計算されます。<pre>rnd(3 * 2) + 1</pre>


これは1から6までの範囲を示しており、LV1からLV6までの魚を釣ることができることを意味します。
これは1から6までの範囲を示しており、LV1からLV6までの魚を釣ることができることを意味します。


==== 魚LV範囲表 ====
====魚LV範囲表====
{| class="wikitable sortable"
{| class="wikitable sortable"
|-
|-
Line 114: Line 36:
|8||1||16
|8||1||16
|-
|-
|9||1||18
|9|| 1||18
|-
|-
|10||1||20
|10||1||20
Line 126: Line 48:
|14||1||28
|14||1||28
|-
|-
|15||1||30
|15|| 1||30  
|-
|-
|16||1||32
|16||1||32
Line 148: Line 70:
===魚の数===
===魚の数===


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


<pre>numberOfFish = rnd(fishingLevel / (fishLV + 10)) + 1</pre>
<pre>numberOfFish = rnd(fishingLevel / (fishLV + 10)) + 1</pre>


* '''釣りレベル''':現在の釣りスキルレベル。
*'''釣りレベル''':現在の釣りスキルレベル。
* '''魚レベルLV''':魚のレベル。
*'''魚レベルLV''':魚のレベル。
* '''rnd''':'''0'''から関数に渡された値までの間のランダムな数値。
*'''rnd''':'''0'''から関数に渡された値までの間のランダムな数値。


==== 例 ====
====例====
釣りレベルが'''3'''で、魚のレベルが'''5'''と判定された場合、潜在的な魚の数は以下のように計算されます。<pre>rnd(3 / (5 + 10)) + 1</pre>
釣りレベルが'''22'''で、魚のレベルが'''1'''と判定された場合、潜在的な魚の数は以下のように計算されます。<pre>rnd(22 / (1 + 10)) + 1</pre>


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


<pre>rnd(3 / 15) + 1</pre>
<pre>rnd(22 / 11) + 1</pre>
 
<code>rnd(2)</code>は、'''0'''から約'''1'''の間の乱数を生成します。1を足すと、少なくとも1匹の魚を捕まえることができます。魚の数は、ランダムな結果によって1匹か2匹のどちらかになります。
====土地フィート====


<code>rnd(3 / 15)</code>は、'''0'''から約'''0.2'''の間の乱数を生成します。1を足すと、少なくとも1匹は魚が釣れることが保証されます。
追加で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"
{| class="wikitable"
|-
|-
!魚LV!!魚を2匹釣るための最低釣りレベル!!魚を3匹釣るための最低釣りレベル
!魚LV !!魚を2匹釣るための最低釣りレベル!!魚を3匹釣るための最低釣りレベル
|-
|-
|1||11||22
|1||22||33
|-
|-
|5||16||32
|5||30||45
|-
|-
|10||21||42
|10||40||60
|-
|-
|15||26||52
|15||50||75
|-
|-
|20||31||62
|20||60||90
|-
|-
|25||36||72
|25||70||105
|-
|-
|30||41||82
|30||80||120
|-
|-
|35||46||92
|35||90||135
|-
|-
|40||51||102
|40||100||150
|}
|}


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


<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
Line 196: Line 208:
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))
Line 206: Line 218:
     thing.SetNum(num2);
     thing.SetNum(num2);
     thing.SetBlessedState(BlessedState.Normal);
     thing.SetBlessedState(BlessedState.Normal);
}
</syntaxhighlight>
==釣り速度==
釣りのプロセスには、2つの重要な変数が関わります。
*'''進行度''': 釣りの全体の所要時間または完了率を表し、0から100までの範囲です。
*'''ヒット''': 魚との格闘中に試行された回数を追跡します。以下の条件が適用されます。
**'''増加''': 以下のいずれかが発生するまで、試行ごとにヒットが増加します。
魚が釣れた場合(「hit」が「ランダム閾値」より大きい場合)。
特定のランダム条件により「hit」が「0」にリセットされる場合。
====成功====
魚を釣るための成功閾値を計算する式は以下の通りです。
<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''': 成功すると自動的に完了します。
====例====
釣りレベルが「20」の場合、計算は以下のように進みます。
#<code>rnd(20 + 1)</code> は「0」から「20」までの間の乱数を生成します。
#この乱数を「10」で割った値を「10」から引きます。
結果は [5, 10] の範囲に制限され、successThreshold が決定されます。
例えば:
*<code>rnd(21) = 10</code> の場合、計算は次のようになります。
<pre>successThreshold = Mathf.Clamp(10 - (10 / 10), 5, 10) = 9</pre>
乱数<code>rnd(9)</code>の値によって閾値が決定されます。 hit > rnd(9) の場合、魚が釣れます。
====成功閾値テーブル====
{| class="wikitable sortable」"
|-
!釣りレベル!!最小成功閾値!!最大成功閾値
|-
|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
|}
==== リセット ====
「ヒット」のリセットを決定する計算式は以下の通りです。
<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」"
|-
!釣りレベル!!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)====
<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>
</syntaxhighlight>
[[Category:Elin Spoiler]]
[[Category:Elin Spoiler]]
[[Category:JA]]
[[Category:JA]]

Revision as of 13:23, 27 November 2024

計算式

魚 LV

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

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

釣りレベルが22の場合、潜在的な魚のLVは次のように計算されます。

rnd(3 * 2) + 1

これは1から6までの範囲を示しており、LV1からLV6までの魚を釣ることができることを意味します。

魚LV範囲表

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

コード (EA 23.37)

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

魚の数

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

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匹釣るための最低釣りレベル
1 22 33
5 30 45
10 40 60
15 50 75
20 60 90
25 70 105
30 80 120
35 90 135
40 100 150

コード (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();
}
}