Elin:解析/食事効果: Difference between revisions
(→人肉か否か: アップデートに対応) |
(→人肉か否か) |
||
| Line 31: | Line 31: | ||
この部分のコードは、死体が人間の肉とみなされるかどうかを制御します。 | この部分のコードは、死体が人間の肉とみなされるかどうかを制御します。 | ||
人間種族であれば、もしくは妖精以外のランダム冒険者であれば、その死体は肉になります。<ref>妖精でないランダム冒険者は分化処理前のノーランドとして判定されるので人肉になる</ref> | |||
以前は人肉の判定は複雑で、条件を満たさないと料理に引き継がれなかったりしました。 | 以前は人肉の判定は複雑で、条件を満たさないと料理に引き継がれなかったりしました。 | ||
| Line 120: | Line 120: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
次に、栄養の量を表す'''num3'''、おいしさ評価にのみかかわる'''num5'''が登場します。 | |||
フレーバー以上の意味がないため、'''num5'''の説明は一部省略します。 | |||
食事効果倍率について | 食事効果倍率について | ||
| Line 143: | Line 145: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | * PCが栄養満点(ジューアのフィート)を持っている場合、食事効果は25%増加します。 | ||
* 食べた人がPCでない場合、200%増加する。 | * 食べた人がPCでない場合、200%増加する。 | ||
** | ** これがペットがPCをはるかに上回る速さで成長する主な理由です。 | ||
<syntaxhighlight lang="c#" line="1"> | <syntaxhighlight lang="c#" line="1"> | ||
switch (food.source._origin) | switch (food.source._origin) | ||
| Line 199: | Line 201: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | * 栄養量であるnum3と空腹度を比較し、小さい方を食べ物の消化できた量'''num6'''とします。 | ||
* | * キャラクターが空腹の場合、食事効果は10%増加します。<ref>なぜかnum2ではなく、num6に補正が入る。 | ||
ただし、すぐ後に両者は掛け算されるのでどちらに入るかは重要でない。</ref> | |||
* | * 食べ物が腐っていて、キャラクターが腐った食べ物を食べられない場合、各キャラクターの主能力に大幅なマイナス経験値が入ります、ただし意志だけは大幅に増加します。 | ||
<syntaxhighlight lang="c#" line="1"> | <syntaxhighlight lang="c#" line="1"> | ||
else | else | ||
| Line 232: | Line 234: | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>食事効果倍率num2と消化できた量num6を掛けて10で割ったものを新たなnum2とします。 | ||
* 最終的な食事効果の獲得量は、実際の栄養価に10を掛けた値で割ったものとなります。 | |||
* | * キャラクターが拒食症状態の場合、本来の1%の食事効果効果しか獲得できません。 | ||
* キャラクターが拒食症状態の場合、本来の1% | |||
<syntaxhighlight lang="c#" line="1"> | <syntaxhighlight lang="c#" line="1"> | ||
switch (foodEffect[0]) | switch (foodEffect[0]) | ||
| Line 309: | Line 310: | ||
idTaste = "food_bad"; | idTaste = "food_bad"; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>食べ物を食べた時のリアクション(「まずい!」や「まさに絶品だ!」などのテキスト)を決めるコードです。 | ||
* 食べ物の基本的なおいしさは40から始まり、その食べ物の経験値と大きく関係している。 | * 食べ物の基本的なおいしさは40から始まり、その食べ物の経験値と大きく関係している。 | ||
| Line 325: | Line 326: | ||
* 最終的な数値は、料理のおいしさの評価となり、100以上が素晴らしい、70~100が美味しい、50~70がまあまあ、30~50が普通、30以下がまずい、となります。 | * 最終的な数値は、料理のおいしさの評価となり、100以上が素晴らしい、70~100が美味しい、50~70がまあまあ、30~50が普通、30以下がまずい、となります。 | ||
=== | ===神を食べると起こること=== | ||
<syntaxhighlight lang="c#" line="1"> | <syntaxhighlight lang="c#" line="1"> | ||
case "god": | case "god": | ||
Latest revision as of 10:52, 17 April 2025
このページには正規のプレイによって得られた情報ではなく、Elinのデータ解析・デバッグモード・内部ファイル閲覧などによって得た情報が掲載されています。 ゲームの重大なネタバレや、プレイの楽しみを損なう情報が含まれている可能性があります。 閲覧は自己責任でお願いするとともに、通常ページに解析ページへのリンクを貼ることはお控えください。 また、このページの情報をWikiの他のページに記載する際は計算コードなどをそのまま掲示するのではなく、コードが読めない人にもわかりやすいように内容を要約して書いていただけると幸いです。 |
食事効果はElinの最も重要な要素の1つです。私たちはこのコード全体をここに置き、ゲームの大部分に影響するあらゆる変更、つまり料理と食事についてを検証していきます。
食べ物の主な影響
人肉か否か
public static bool IsHumanFlesh(CardRow r)
{
if (r == null)
{
return false;
}
if (r.id == "chara")
{
return EClass.pc.race.tag.Contains("human");
}
if (r.isChara)
{
return EClass.sources.races.map[EClass.sources.charas.map[r.id].race].tag.Contains("human");
}
return false;
}
この部分のコードは、死体が人間の肉とみなされるかどうかを制御します。
人間種族であれば、もしくは妖精以外のランダム冒険者であれば、その死体は肉になります。[1]
以前は人肉の判定は複雑で、条件を満たさないと料理に引き継がれなかったりしました。
不浄な食べ物か否か
public static bool IsUndeadFlesh(CardRow r)
{
if (r == null)
{
return false;
}
if (r.id == "chara")
{
return EClass.pc.race.tag.Contains("undead");
}
if (r.isChara)
{
return EClass.sources.races.map[EClass.sources.charas.map[r.id].race].tag.Contains("undead");
}
return false;
}
同様に、死体がアンデッド由来なのかを決める処理です。
アップデートによって、単純にアンデッドの死体かどうかを判別するようになりました。
その食べ物がどれだけの効果を持つか
警告:このセクションはコード分析に基づくものです。
- 料理にはいくつかの特に重要な要因があります。
- そのうちの1つは全体的にわたって登場する、食事効果倍率を示すnum2です。
bool flag = EClass._zone.IsPCFaction && c.IsInSpot<TraitSpotDining>();
int num = (food.isCrafted ? ((EClass.pc.Evalue(1650) >= 3) ? 5 : 0) : 0);
float num2 = (float)(100 + (food.HasElement(757) ? 10 : 0) + (flag ? 10 : 0) + num + Mathf.Min(food.QualityLv * 10, 100)) / 200f;
if (num2 < 0.1f)
{
num2 = 0.1f;
}
食事効果の値はまず100から始まり、それに複数回の加算をした後、200で割られます。
調理された場合+10、PCの所有の食堂の立札エリアで食べた場合+10、PCが美食家3で調理した場合+5を順次加算します。
さらに、料理の品質Lv.から1を引いて10をかけたものを上限100で計算し、それを200で割ったものを足し合わせます。
品質11でその上限に至り、100加算することになります。
その後に200でこれまでの和を割ります。
- 例:通常のPCが作った料理で、料理の品質がレベル5の料理を食堂の立札エリアで食べた場合、その値は0.8になります。
最後にnum2が0.1未満の場合は、0.1に設定されます。
bool flag2 = IsHumanFlesh(food);
bool flag3 = IsUndeadFlesh(food);
bool flag4 = c.HasElement(1205);
bool flag5 = food.IsDecayed || flag3;
if (food.IsBlessed)
{
num2 *= 1.5f;
}
if (food.IsCursed)
{
num2 *= 0.5f;
}
if (flag4)
{
if (flag2)
{
num5 *= 2f;
num2 *= 1.5f;
}
else
{
num5 *= 0.5f;
num2 /= 2f;
num3 /= 2;
}
}
else if (flag2)
{
num5 = 0f;
num2 *= 0.5f;
}
次に、栄養の量を表すnum3、おいしさ評価にのみかかわるnum5が登場します。
フレーバー以上の意味がないため、num5の説明は一部省略します。
食事効果倍率について
- 食品が祝福されている場合は50%増、呪われている場合は50%減。
- 食べた人がカンニバリズムフィート持ちのとき、料理が人肉である場合は50%増、料理が人肉でない場合は50%減。
- 食べた人がンニバリズムフィートを持っておらず、料理が人肉である場合は50%減。
摂取できる栄養量について
- カンニバリズムフィートを持っていなければ、人肉である料理を食べた場合、50%減。
if (c.HasElement(1200))
{
num2 *= 1.25f;
}
if (!c.IsPC)
{
num2 *= 3f;
}
- PCが栄養満点(ジューアのフィート)を持っている場合、食事効果は25%増加します。
- 食べた人がPCでない場合、200%増加する。
- これがペットがPCをはるかに上回る速さで成長する主な理由です。
switch (food.source._origin)
{
case "meat":
if (c.IsPC)
{
c.Say("food_raw_meat");
}
num2 *= 0.7f;
num5 = 0.5f;
break;
case "fish":
if (c.IsHuman)
{
if (c.IsPC)
{
c.Say("food_raw_fish");
}
num2 *= 0.9f;
num5 = 0.5f;
}
break;
case "dough":
if (c.IsPC)
{
c.Say("food_raw_powder");
}
num2 *= 0.9f;
num5 = 0.5f;
break;
食品が腐っていない場合:
- 食品が未加工の場合、カテゴリーに応じて、食事効果はさらに減少します。肉 -30%、魚 -10%、練り粉 -10%。
int num3 = food.Evalue(10);
float num6 = Mathf.Min(c.hunger.value, num3);
if (c.hunger.GetPhase() >= 3)
{
num6 *= 1.1f;
}
if (flag5 && !c.HasElement(480))
{
c.ModExp(70, -300);
c.ModExp(71, -300);
c.ModExp(72, -200);
c.ModExp(73, -200);
c.ModExp(74, -200);
c.ModExp(75, 500);
c.ModExp(76, -200);
c.ModExp(77, -300);
}
- 栄養量であるnum3と空腹度を比較し、小さい方を食べ物の消化できた量num6とします。
- キャラクターが空腹の場合、食事効果は10%増加します。[2]
- 食べ物が腐っていて、キャラクターが腐った食べ物を食べられない場合、各キャラクターの主能力に大幅なマイナス経験値が入ります、ただし意志だけは大幅に増加します。
else
{
num2 = num2 * num6 / 10f;
if (c.HasCondition<ConAnorexia>())
{
num2 = 0.01f;
}
List<Element> list = food.ListValidTraits(isCraft: true, limit: false);
foreach (Element value in food.elements.dict.Values)
{
if (value.source.foodEffect.IsEmpty() || !list.Contains(value))
{
continue;
}
string[] foodEffect = value.source.foodEffect;
int id = value.id;
float num7 = num2 * (float)value.Value;
if (value.source.category == "food" && c.IsPC)
{
bool flag6 = num7 >= 0f;
string text = value.source.GetText(flag6 ? "textInc" : "textDec", returnNull: true);
if (text != null)
{
Msg.SetColor(flag6 ? "positive" : "negative");
c.Say(text);
}
}
食事効果倍率num2と消化できた量num6を掛けて10で割ったものを新たなnum2とします。
- 最終的な食事効果の獲得量は、実際の栄養価に10を掛けた値で割ったものとなります。
- キャラクターが拒食症状態の場合、本来の1%の食事効果効果しか獲得できません。
switch (foodEffect[0])
{
case "exp":
{
id = ((foodEffect.Length > 1) ? EClass.sources.elements.alias[foodEffect[1]].id : value.id);
int a = (int)(num7 * (float)((foodEffect.Length > 2) ? foodEffect[2].ToInt() : 4)) * 2 / 3;
c.ModExp(id, a);
break;
}
case "pot":
{
id = ((foodEffect.Length > 1) ? EClass.sources.elements.alias[foodEffect[1]].id : value.id);
int vTempPotential = c.elements.GetElement(id).vTempPotential;
int num8 = EClass.rndHalf((int)(num7 / 5f) + 1);
num8 = num8 * 100 / Mathf.Max(100, vTempPotential * 2 / 3);
c.elements.ModTempPotential(id, num8, 8);
break;
}
主能力経験と主能力潜在の食事効果は異なります。
- 経験の場合、獲得する経験値は (総合修正値 (num2)) * (実際の栄養 (num6)) / 10 * 料理経験値レベル * 8 / 3 です。
- 潜在能力の増加については、増加値は (総合修正値 (num2)) * (実際の栄養 (num6)) / 10 * d料理経験値レベル / 5 + 1 の50%から100%の間の値となります。
- ただし、一時的な潜在能力がすでに150を超えている場合は、さらにペナルティが課せられます。
if (!c.IsPCParty)
{
num3 *= 2;
}
num3 = num3 * (100 + c.Evalue(1235) * 10) / (100 + c.Evalue(1234) * 10 + c.Evalue(1236) * 15);
c.hunger.Mod(-num3);
- 食事効果計算後、少食フィート持ちの場合はフィートレベル1につき10%、ノーランド(のフィート持ち)の場合は15%満腹度が増加する。大食いフィート持ちの場合はフィートレベル1につき10%満腹度が減少する。
- パーティにそのキャラクターがいない場合、満腹度が100%増加する。
この食べ物は美味しい?
float num4 = 40f;
float num5 = 1f;
num4 += (float)food.Evalue(70);
num4 += (float)(food.Evalue(72) / 2);
num4 += (float)(food.Evalue(73) / 2);
num4 += (float)(food.Evalue(75) / 2);
num4 += (float)(food.Evalue(76) * 3 / 2);
num4 += (float)food.Evalue(440);
num4 += (float)(food.Evalue(445) / 2);
num4 -= (float)food.Evalue(71);
num4 -= (float)(num3 / 2);
num4 *= num5;
if (idTaste.IsEmpty())
{
if (num4 > 100f)
{
idTaste = "food_great";
}
else if (num4 > 70f)
{
idTaste = "food_good";
}
else if (num4 > 50f)
{
idTaste = "food_soso";
}
else if (num4 > 30f)
{
idTaste = "food_average";
}
else
{
idTaste = "food_bad";
}
食べ物を食べた時のリアクション(「まずい!」や「まさに絶品だ!」などのテキスト)を決めるコードです。
- 食べ物の基本的なおいしさは40から始まり、その食べ物の経験値と大きく関係している。
- STR(油分)の値が1増えるごとに、おいしさは1増える。
- PER(香り)、DEX(活きの良さ)、WIL(コシの強さ)の値が0.5増えるごとに、おいしさは0.5増える。
- MAG(甘さ)の値が1増えるごとに、おいしさは1.5増える。
- STR2(筋力潜在?コク)の値が1増えるごとに、おいしさは1増える。
- WIL2(意志潜在?歯ごたえ)の値が1増えるごとに、おいしさが0.5増える。
- END(料理の大きさ)の値が1増えるごとに、おいしさが1減る。
- 紙面上の栄養価の値が1増えるごとに、おいしさが0.5減る。(具が多いほど美味しくない)
- 料理が未加工の場合、-50%。
- 人肉の場合、カンニバリズムありで+100%、カンニバリズムなしで-50%。
- 食品が腐っており、腐敗消化がない場合、-100%。
- 最終的な数値は、料理のおいしさの評価となり、100以上が素晴らしい、70~100が美味しい、50~70がまあまあ、30~50が普通、30以下がまずい、となります。
神を食べると起こること
case "god":
{
int int2 = c.GetInt(117);
if (int2 < 10)
{
foreach (Element value2 in c.elements.dict.Values)
{
if (value2.IsMainAttribute)
{
c.elements.ModPotential(value2.id, 2);
}
}
}
c.Say("little_eat", c);
c.PlaySound("ding_potential");
c.elements.ModExp(306, -1000);
c.SetInt(117, int2 + 1);
break;
}
- 「神の肉」を1枚食べるごとに、すべての主能力(STR、MAGなど)のベース潜在能力が2ずつ上昇する。
- この効果は10回しか発動しないので、合計で20までのベース潜在能力が上げられる。
- 信仰スキルは、肉を1枚食べるごとに1000の経験値、すなわち1レベル分(要確認)減少する。
- この効果は、何の潜在ボーナスも得られない状態になっても継続する。