Elin:解析/エーテル病

Revision as of 13:31, 28 December 2024 by トレモロン (talk | contribs) (→‎エーテル病: キャラのLvか、病気のレベルかを明確に区別する言い回しに変えました。)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


バージョン EA23.61: この記事は、Elin最新の安定版リリースに遅れをとっていますが、信頼できる範囲にあるかもしれません。

このページでは、この世界のエーテル病を分析しています。

エーテル病

エーテル病のコード:索引

public const int etherManaBattery = 1564;
public const int etherPoisonHand = 1565;
public const int etherProvoke = 1563;
public const int etherStupid = 1561;
public const int etherWeak = 1560;
public const int etherAddict = 1559;
public const int etherRain = 1558;
public const int etherHead = 1557;
public const int etherViolence = 1556;
public const int etherNeck = 1555;
public const int etherWing = 1554;
public const int etherEye = 1553;
public const int etherFeet = 1552;
public const int etherArmor = 1562;
public const int etherUgly = 1551;
public const int etherGravity = 1550;
  • すべてのエーテル病は整数(すなわちレベル)で表されます。病気の種類は16種類あり、それぞれ見ていきます。
  • ご自身で効果を確認したい場合は、その数字をコードで検索してみてください。

マナバッテリー(ManaBattery)

    case 1564:
			ModBase(961, a * 5, hide: false);
			break;
  • この病気にかかると、1レベルにつき魔法耐性(961)が5上昇します(現在はこのエーテル病のレベルというのは1だけです)。
public void TryAbsorbRod(Thing t)
	{
		if (!IsPC || !(t.trait is TraitRod) || t.c_charges <= 0 || !HasElement(1564))
		{
			return;
		}
		Say("absorbRod", this, t);
		TraitRod rod = t.trait as TraitRod;
		bool flag = false;
		if (rod.source != null)
		{
			using IEnumerator<SourceElement.Row> enumerator = EClass.sources.elements.rows.Where((SourceElement.Row a) => a.id == rod.source.id).GetEnumerator();
			if (enumerator.MoveNext())
			{
				SourceElement.Row current = enumerator.Current;
				if (IsPC)
				{
					GainAbility(current.id, t.c_charges * 100);
					flag = true;
				}
			}
		}
		if (!flag)
		{
			mana.Mod(-50 * t.c_charges);
		}
		t.c_charges = 0;
		LayerInventory.SetDirty(t);
	}
    ...
    public void GainAbility(int ele, int mtp = 100)
	{
		Element orCreateElement = elements.GetOrCreateElement(ele);
		if (orCreateElement.ValueWithoutLink == 0)
		{
			elements.ModBase(orCreateElement.id, 1);
		}
		if (orCreateElement is Spell)
		{
			int num = mtp * orCreateElement.source.charge * (100 + Evalue(307) + (HasElement(307) ? 20 : 0)) / 100 / 100;
			if (orCreateElement.source.charge == 1)
			{
				num = 1;
			}
			orCreateElement.vPotential += Mathf.Max(1, num / 2 + EClass.rnd(num / 2 + 1));
		}
		Say("spell_gain", this, orCreateElement.Name);
		LayerAbility.SetDirty(orCreateElement);
	}
  • PCがマナバッテリーを持っていることを検知すると、Gainability(this spell, 100 × チャージ数) の式を呼び出して、魔法杖の使用回数を取り込み、PCにその魔法ストックを与えます。
  • これは、願いの杖の使用回数1回につき、100個の願いの魔法ストックが手に入るという意味ではありません。各魔法には、回数のパラメータがそれぞれにあり(詳細はSourceGame/Elementを参照)、回数に応じて、魔法を唱えられる回数が決まります。
    • この値は、暗記スキルの補正を受けます。スキルを持っている場合、一律20%が加算され、スキルレベルごとに1%加算されます。 例えば、願いの杖の場合、暗記レベルが80であれば、数値は次のようになります。100 * 1 (願いの回数1) * (80+100+20) / 100 / 100 = 2
    • これはかなり良い値です。1本の魔法杖で2回願いを叶えることができます。それを詠唱できるかは別の話ですが。
  • その後、PCでない場合、魔法杖の使用回数1回につきマナが50ずつ減っていく。そして魔法杖のチャージが0になる。

エーテルの滴る手(PoisonHand)

    case 1565:
			ModBase(955, a * 20, hide: false);
			break;
  • エーテルの滴る手1レベルごとに、毒耐性が20ずつ上昇します(レベルは1つだけです)。
    if (conWeapon == null && weapon == null && (CC.MainElement != Element.Void || CC.HasElement(1565)))
			{
				num5 = (CC.HasElement(1565) ? 915 : CC.MainElement.id);
				num6 = CC.Power / 3 + EClass.rnd(CC.Power / 2);
				if (CC.MainElement != Element.Void)
				{
					num6 += CC.MainElement.Value;
				}
				showEffect = false;
				num7 = 50;
			}
  • 武器を装備せずに攻撃すると、攻撃はすべて毒属性(915)に変換されます。
  • (要確認)コードでは、あなたのダメージに-50%のペナルティが適用されることが示されています。
    public Thing TryPoisonPotion(Thing t)
	{
		if (t.trait is TraitPotion && t.id != "1165" && !t.source.tag.Contains("neg") && EClass.rnd(2) == 0 && HasElement(1565))
		{
			string text = EClass.sources.things.rows.Where((SourceThing.Row a) => a._origin == "potion" && a.tag.Contains("neg") && a.chance > 100).ToList().RandomItemWeighted((SourceThing.Row a) => a.chance)
				.id;
			Say("poisonDrip", this);
			int num = t.Num;
			t.Destroy();
			t = ThingGen.Create(text).SetNum(num);
		}
		return t;
	}
  • これは、あなたのバッグの中のすべてのポーションを有毒化させるために使用するコードです。
  • まずランダムに50%の確率が適用されるので、50%の確率でポーションは有毒化から免れます。
  • また、あなたのポーションのストック全体を一度に変換するようです。

生きとし生けるものの敵(Provoke)

    case 1563:
			ModBase(77, -a * (3 + num / 4), hide: false);
			break;
  • これは、病気のレベルごとに(3 + キャラのLv / 4)で、あなたの魅力(Evalue 77)が低下します(現在はこのエーテル病のレベルというのは1だけです)。
    • コード分析の例を少しだけ残しておきます。詳細は、vPotential = Char.LVを参照してください。
    if (!owner.IsPCFactionOrMinion && EClass.rnd(owner.isSynced ? 50 : 2000) == 0 && owner.hostility == Hostility.Neutral && EClass.pc.party.HasElement(1563) 
        && !owner.race.tag.Contains("animal") && EClass._zone.IsTown && !EClass._zone.IsPCFaction)
		{
			EClass.pc.DoHostileAction(owner);
		}
  • すべての生き物があなたに敵対する。ただし、以下の条件は除きます。
    • それが自分のファクションのメンバーまたはペットである。
    • 既にあなたに対して敵対している。
    • 動物である。
    • あなたが町にいない。
    • あなたが自分の土地(自分のファクションのエリア)にいる。
  • この効果を適用するには、まだ乱数を振る必要があり、可能性はかなり低いようです(2%)。
  • この効果は、パーティーの誰かがこのエーテル病にかかっている場合にも適用されるので、注意してください。
    if (EClass.pc.party.HasElement(1563) && num < 0)
				{
					num = num * 30 / 100;
				}
  • このコードは、カルマのマイナス修正を計算する必要がある場合に表示されます。カルマの減少は30%にカットされ、小数点以下は切り捨てられます。
  • つまり、-5は-1に、-1は0になります。

痴呆 (Stupid)

    case 1561:
			ModBase(61, -a * 15, hide: false);
			ModBase(76, -a * (4 + num / 3), hide: false);
			break;
  • この病気にかかると、マナが一律で15減少した後に、魔力が(4+キャラのLv/3)減少します。

衰弱 (Weak)

    case 1560:
			ModBase(60, -a * 15, hide: false);
			ModBase(70, -a * (4 + num / 3), hide: false);
			break;
  • この病気にかかると、生命が一律で15減少した後に、筋力が(4+キャラのLv/3)減少します。

ポーション中毒(Addict)

    if (EClass.rnd(30) == 0 && EClass.pc.HasElement(1559))
		{
			List<Thing> list = EClass.pc.things.List((Thing a) => a.trait is TraitPotion, onlyAccessible: true);
			if (list.Count > 0)
			{
				EClass.pc.Drink(list.RandomItem());
				EClass.player.EndTurn();
			}
		}
  • 毎ターン1/30の確率でポーションを消費し、ターンを終了します。

生きた加湿器(Rain)

    if (condition == Condition.Fine)
		{
			foreach (Chara member in EClass.pc.party.members)
			{
				if (member.HasElement(1558) && EClass.rnd(4) == 0)
				{
					condition = Condition.Rain;
					Msg.Say("drawRain", member);
					break;
				}
			}
		}
  • 世界の天気が変動するタイミングが来たら、この病気のチームメンバー一人一人が25%の確率で天気を雨に変える判定を行う。

頭部の巨大化 (Head)

		case 1557:
			ModBase(71, -a * (5 + num / 3), hide: false);
			ModBase(72, -a * (4 + num / 4), hide: false);
			ModBase(74, a * (6 + num / 2), hide: false);
			ModBase(75, a * (2 + num / 6), hide: false);


この病気には以下の4つの主能力への修正をかけます。

  • 耐久が (5 + キャラのLv/ 3) 減少
  • 器用が (4 + キャラのLv / 4) 減少
  • 学習が (6 + キャラのLv / 2) 増加
  • 意志が (2 + キャラのLv / 6) 増加

殺戮への飢え(Violence)

		case 1556:
			ModBase(64, -a * (10 + num), hide: false);
			ModBase(67, a * (5 + num / 2), hide: false);
			break;
  • この病気は、あなたのDVを-(10+キャラのLv)減少させるが、あなたのダメージ修正を(5+キャラのLv/2)増加させます。

太い首(Neck)

		case 1555:
			ModBase(65, a * (12 + num), hide: false);
			ModBase(77, -a * (5 + num / 5), hide: false);
			if (!hint && a > 0)
			{
				chara?.body.UnequipAll(31);
			}
			break;
  • この病気にかかると、PVが(12+キャラのLv)上昇しますが、魅力が(5+キャラのLv/5)減少します。
  • また、首装備を強制的に解除します。

エーテルの翼 (Wing)

		case 1554:
			ModBase(404, a * 10, hide: false);
			ModBase(401, a, hide: false);
			ModBase(79, a * (10 + num / 5), hide: false);
			if (!hint && a > 0)
			{
				chara?.body.UnequipAll(33);
			}
			break;
  • この病気は、レベルごとに運搬重量(weightMod)を10%減少させます。
  • また、病気のレベルごとに浮遊レベルが与えられます。(浮遊レベルは複数あるのでしょうか?
  • 病気のレベルごとに速度が(10 + キャラのLv/ 5)増加します。
  • 背中装備を強制的に解除します。

第三/四の眼 (Eye)

		case 1553:
			ModBase(73, a * (5 + num / 3), hide: false);
			ModBase(77, -a * (5 + num / 3), hide: false);
			break;
  • この病気は、あなたの感覚を(5 + キャラのLv / 3)だけ向上させますが、同時に同じ量だけあなたの魅力を減少させます。

蹄変化 (Feet)

		case 1552:
			ModBase(79, a * Mathf.Min(30 + num / 5, 100), hide: false);
			if (!hint && a > 0)
			{
				chara?.body.UnequipAll(39);
			}
			break;
  • この病気にかかると、速度が(30+キャラのLv/5)上昇し、最大で100(Lv350で到達)まで上昇します。
  • また、足装備を装備できなくなります。

重い甲殻(Armor)

		case 1562:
			ModBase(65, a * (15 + num / 2), hide: false);
			ModBase(79, -a * (10 + num / 5), hide: false);
			break;
  • この病気にかかると、あなたのPVは(15+キャラのLv/2)増加しますが、速度が(10+キャラのLv/5)減少します。

顔のただれ(Ugly)

		case 1551:
			ModBase(77, -a * (4 + num / 5), hide: false);
			break;
  • この病気にかかると、病気のレベルごとに(4 + キャラのLv / 5)だけ魅力が減少します。病気のレベルは3段階あります。

重力発生 (Gravity)

		case 1550:
			ModBase(404, -a * 10, hide: false);
			break;
  • この病気にかかると、病気のレベルごとに運搬中重量(weightMod)が10%増加します。病気のレベルは3段階あります。