Elin:解析/食事効果: Difference between revisions

From Ylvapedia
(→‎人肉か否か: アップデートに対応)
 
Line 31: Line 31:
この部分のコードは、死体が人間の肉とみなされるかどうかを制御します。
この部分のコードは、死体が人間の肉とみなされるかどうかを制御します。


人間種族であればその死体は肉になります。
人間種族であれば、もしくは妖精以外のランダム冒険者であれば、その死体は肉になります。<ref>妖精でないランダム冒険者は分化処理前のノーランドとして判定されるので人肉になる</ref>


以前は人肉の判定は複雑で、条件を満たさないと料理に引き継がれなかったりしました。
以前は人肉の判定は複雑で、条件を満たさないと料理に引き継がれなかったりしました。
Line 120: Line 120:
</syntaxhighlight>
</syntaxhighlight>


次に、摂取できる栄養の量を表すnum3、おいしさ評価にのみかかわるnum5が登場します。
次に、栄養の量を表す'''num3'''、おいしさ評価にのみかかわる'''num5'''が登場します。
 
フレーバー以上の意味がないため、'''num5'''の説明は一部省略します。


食事効果倍率について
食事効果倍率について
Line 143: Line 145:
</syntaxhighlight>
</syntaxhighlight>


* PCが栄養満点(ジューア)のフィートを持っている場合、食事効果は25%増加する。
* PCが栄養満点(ジューアのフィート)を持っている場合、食事効果は25%増加します。
* 食べた人がPCでない場合、200%増加する。
* 食べた人がPCでない場合、200%増加する。
** これがペットがPCをはるかに上回る速さで成長する主な理由である。ペットはPCの3倍効率的に食べるのだ!
** これがペットが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)が参照されます。キャラクターが実際に吸収できる栄養は、現在の空腹値を超えることはできません。
* 栄養量であるnum3と空腹度を比較し、小さい方を食べ物の消化できた量'''num6'''とします。
* キャラクターが空腹の場合、実際の食事効果は10%増加します。
* キャラクターが空腹の場合、食事効果は10%増加します。<ref>なぜかnum2ではなく、num6に補正が入る。
** 注意:これは独立した10%の修正です。
 
* 食べ物が腐っていて、キャラクターが腐った食べ物を食べられない場合、各キャラクターの主能力は大幅にペナルティを受けますが、意志は大幅に増加します。
ただし、すぐ後に両者は掛け算されるのでどちらに入るかは重要でない。</ref>
** 腐った食べ物を食べて、意志を鍛えましょう。
* 食べ物が腐っていて、キャラクターが腐った食べ物を食べられない場合、各キャラクターの主能力に大幅なマイナス経験値が入ります、ただし意志だけは大幅に増加します。
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
     else
     else
Line 232: Line 234:
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>食事効果倍率num2と消化できた量num6を掛けて10で割ったものを新たなnum2とします。
 
* 最終的な食事効果の獲得量は、実際の栄養価に10を掛けた値で割ったものとなります。
* 最終的な食事効果の獲得量は、実際の栄養価に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


バージョン EA23.67: この記事は、Elin最新の安定版リリースに、少なくとも20のマイナーバージョンが遅れています。ページの更新をお願いします。

食事効果は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レベル分(要確認)減少する。
    • この効果は、何の潜在ボーナスも得られない状態になっても継続する。
  1. 妖精でないランダム冒険者は分化処理前のノーランドとして判定されるので人肉になる
  2. なぜかnum2ではなく、num6に補正が入る。 ただし、すぐ後に両者は掛け算されるのでどちらに入るかは重要でない。