Elin:解析/基本ステータス

From Ylvapedia
Revision as of 13:11, 14 December 2024 by Inno (talk | contribs) (→‎狂気度: confirmed to be working.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

このページでは、PCとNPC基本ステータスに関する解析情報を記載しています。

最終更新バージョンはEA23.54

最大HP

public override int MaxHP => Mathf.Max(1, ((base.END * 2 + base.STR + base.WIL / 2) * Mathf.Min(base.LV, 25) / 25 + base.END + 10) 
                             * Evalue(60) / 100 * ((IsPCFaction ? 100 : (100 + (int)base.rarity * 300)) + (IsPC ? (EClass.player.lastEmptyAlly * Evalue(1646)) : 0)) / 100);

最大HPは以下の要素によって決まります:

  • レベルに基づくHP:
    • レベル25まで、最大HPはレベルによって修正されます。レベル25以降はレベルアップしても最大HPは上がることはない。(レベルごとに4%)
      • 例えば、キャラクターがレベル1から2に成長する場合、そのHPは基本値の二倍に増加します。
      • 計算式は:(2 * END + 1 * STR + 0.5 * WIL) * (レベルの4%)
    • さらに、1 * ENDと10の基本HPがレベルに関係なく付与されます。
    • つまり、ゲーム開始時(レベル1)において、ENDが最大HPの最も大きな要素(1.04)であり、STR(0.04)や WIL(0.02)よりもはるかに大きい。
    • レベル25以上のキャラクターでは、ENDの各ポイントがHPの基本値を3増加させ、STRが1増加させ、WILが0.5増加させます。
    • HPの基本値はさらにキャラクターの生命値%によって修正されます。
  • キャラクター派閥の修正:
    • キャラクターがPC派閥に属している場合、HPは変わらない。
    • キャラクターがPC派閥に属していない場合、HPはキャラクターのレアリティによってさらに増幅されます。
    • 通常の場合、100%; High Qualityの場合、400%; Legendaryの場合、700%; Mythicalの場合、1000%; Artifactの場合、1300%。
    • ボスや進化したモンスターのレアリティはLegendaryです。
    • ユニークキャラクター、例えばフィアマ、グウェン、イノス・トゥラスは、Artifactのレアリティであり、彼らがPCファクションに属していない場合、このHPバフが彼らに適用される可能性がある。(要確認
  • この値は、キャラクターがPCである場合、孤独な魂のフィートによって最終的に修正されます。

最大MP

public override int max => Mathf.Max(1, ((BaseStats.CC.MAG * 2 + BaseStats.CC.WIL + BaseStats.CC.LER / 2) * Mathf.Min(BaseStats.CC.LV, 25) / 25 + BaseStats.CC.MAG + 10) 
                           * BaseStats.CC.Evalue(61) / 100 * ((BaseStats.CC.IsPCFaction ? 100 : (100 + (int)BaseStats.CC.rarity * 250)) 
                           + (BaseStats.CC.IsPC ? (EClass.player.lastEmptyAlly * BaseStats.CC.Evalue(1646)) : 0)) / 100);

最大MPは以下の要素によって決まります:

  • レベルに基づくMP:
    • レベル25まで、最大MPはレベルによって修正されます。レベル25以降はレベルアップしても最大MPは上がることはない。(レベルごとに4%)
      • 例えば、キャラクターがレベル1から2に成長する場合、そのHPは基本値の二倍に増加します。
      • 計算式は:(2 * MAG + 1 * WIL + 0.5 * LER) * (レベルの4%)
    • さらに、1 * MAGと10の基本MPがレベルに関係なく付与されます。
    • つまり、ゲーム開始時(レベル1)において、MAGが最大MPの最も大きな要素(1.04)であり、WIL(0.04)や LER(0.02)よりもはるかに大きい。
    • レベル25以上のキャラクターでは、MAGの各ポイントがMPの基本値を3増加させ、WILが1増加させ、LERが0.5増加させます。
  • MPの基本値はさらにキャラクターのマナ値%によって修正されます。
  • キャラクター派閥の修正:
    • キャラクターがPC派閥に属している場合、MPは変わらない。
    • キャラクターがPC派閥に属していない場合、MPはキャラクターのレアリティによってさらに増幅されます。
    • 通常の場合、100%; High Qualityの場合、350%; Legendaryの場合、600%; Mythicalの場合、850%; Artifactの場合、1100%。
    • ボスや進化したモンスターのレアリティはLegendaryです。
    • ユニークキャラクター、例えばフィアマ、グウェン、イノス・トゥラスは、Artifactのレアリティであり、彼らがPCファクションに属していない場合、このMPバフが彼らに適用される可能性がある。(要確認
  • この値は、キャラクターがPCである場合、孤独な魂のフィートによって最終的に修正されます。

進化したモンスターとネフィアボスのレアリティと基礎能力

    public Rarity rarity = Rarity.Random;
	public static SpawnSetting Evolved(int fixedLv = -1)
	{
		return new SpawnSetting
		{
			fixedLv = fixedLv,
			rarity = Rarity.Legendary,
			forcedHostility = Hostility.Neutral,
			isEvolved = true,
			tries = 10000
		};
	}

	public static SpawnSetting Boss(int filterLv, int fixedLv = -1)
	{
		return new SpawnSetting
		{
			filterLv = filterLv - 2,
			fixedLv = fixedLv,
			rarity = Rarity.Legendary,
			isBoss = true,
			tries = 10000,
			levelRange = 5,
			forcedHostility = Hostility.Enemy
		};
	}
  • ネフィアのボスと進化したモンスターは、Rarity.Legendaryで生成されます。上記の分析結果に基づくと、生成されたモンスターは通常のバージョンの最大HPが700%、最大MPが600%になります」。でもネフィアボスの能力のバフはこれだけじゃない気がする…
  • ネフィアのボスは常に、ネフィアの深さからで-7レベルから+3レベルのモンスターの中から選ばれる(確認が必要)。


最大スタミナ

	public void CalculateMaxStamina()
	{
		int num = base.END;
		int num2 = 0;
		foreach (Element value in elements.dict.Values)
		{
			if (value.source.category == "skill")
			{
				num = ((!IsPC) ? (num + Mathf.Max(value.ValueWithoutLink, 0)) : (num + Mathf.Max(value.vBase, 0)));
			}
		}
		num2 = EClass.curve(num, 30, 10, 60);
		if (num2 < 10)
		{
			num2 = 10;
		}
		_maxStamina = num2 + 15;
	}
    ....
    public override int max => BaseStats.CC._maxStamina * BaseStats.CC.Evalue(62) / 100;

キャラクターの最大スタミナは以下の要素によって決まります:

  • まずは基本体力値を計算します。
    • 1 END は基本体力値を1増加させます。
    • キャラクターが持っているスキルごとに、そのスキルのレベルに応じて基本体力値を増加させます。
    • 例えば、両手武器のレベルが50であれば、基本体力値 += 50。料理のレベルが50であれば、さらに+= 50と続きます。
    • 最大体力値の主な決定要因は、保有するスキルの合計レベルであり、耐久力(END)ではありません。
  • 基本体力値は「CURVE」関数を通過します(基本体力値、30、10、60)。
    • これは、基本体力値が30未満の場合、その値を返すことを意味します。
    • 基本体力値が大きくなるほど、出力のメリットは減少します。例えば:
      • 基本体力値60の場合、出力は44.8です。
      • 基本体力値90の場合、出力は53.36です。
      • 基本体力値300の場合、出力は77.9です。
      • 基本体力値1500の場合、出力は110.0です。
      • 基本体力値15000の場合、出力は195.6です。
      • スタミナの限界こそ存在しませんが、約120を超えると非常に上げにくくなります
  • この出力数値をさらに15増加し、その後にプレイヤーの活力%によって修正されます。
    • したがって、合計スキルレベルが1500のプレイヤーは、最大スタミナが約125になり、そのキャラクターの活力によって修正されます。
    • 耐久力(END)が20で、合計スキルレベルが40の新しいPCは、最大スタミナが60しかありません。

運搬重量限界

public override int WeightLimit => (base.STR * 500 + base.END * 250 + Evalue(207) * 2000) * ((!HasElement(1411)) ? 1 : 5) + 45000;

キャラクターの運搬重量限界は以下の要素によって決まります:

  • 基本限界は、0.5s * STR + 0.25s * END + 2s * スキル「重量上げ」のレベルに基づきます。(ゲーム内の「s」はcodeでは1000に相当します。)
  • キャラクターが黄金の騎士である場合、これはさらに500%修正されます。
  • 最後に、45sの基本運搬重量が最終結果に加算されます。

狂気度

プレイヤーの狂気度に影響を与える要因は多数存在します。分析のために、コード内で主要な要因を選びます:

	public void Cure(CureType type, int p = 100, BlessedState state = BlessedState.Normal)
	{
		bool flag = state == BlessedState.Blessed;
		switch (type)
		{
		case CureType.Heal:
		case CureType.Prayer:
			CureCondition<ConFear>();
			CureCondition<ConBlind>(2 * p / 100 + 5);
			CureCondition<ConPoison>(5 * p / 100 + 5);
			CureCondition<ConConfuse>(10 * p / 100 + 10);
			CureCondition<ConDim>(p / 100 + 5);
			CureCondition<ConBleed>(2 * p / 100 + 10);
			if (flag)
			{
				SAN.Mod(-5);
			}
			break;
  • プレイヤーが神に祈る際に、もし使用されるアイテムの状態が「祝福された」場合、キャラクターの狂気度が5を減少します。
    • どう考えてもこれはかなり変です。なぜなら、神に祈る行為はアイテム使用ではなく、「祝福された」状態を割り当てることもできないため、このコードは恐らく未使用です。
	case EffectId.RemedyJure:
		TC.HealHP(1000000, HealSource.Magic);
		TC.CureHost(CureType.Jure, power, state);
		TC.Say("heal_jure", TC);
		break;
    if (type == CureType.Jure)
			{
				SAN.Mod(-999);
  • この効果は、癒しの羽根(または★ジュアの抱き枕?)を使用すると発生し、狂気度が-999になります。(「レイハンド」はEffectId.JureHealとなります。)
		case Type.Dojin:
			c.PlaySound("wow");
			c.Say("book_decode", c, owner);
			if (!c.IsPC)
			{
				c.Talk("wow");
			}
			switch (BookType)
			{
			case Type.Ero:
				if (c.IsPC)
				{
					EClass.pc.SAN.Mod(-(EClass.rnd(5) + 1));
				}
  • この効果は、プレイヤーキャラクターが危ない本を読むと発生します。狂気度は-1から-5のランダムな値で変更されます。
		case 914:
			flag2 = false;
			if (EClass.rnd(3) != 0)
			{
				if (Chance(30 + eleP / 5, 100))
				{
					Chara.AddCondition<ConConfuse>(eleP);
				}
			}
			else if (Chance(30 + eleP / 5, 100))
			{
				Chara.AddCondition<ConSleep>(eleP);
			}
			if (Chance(50, 100))
			{
				Chara.SAN.Mod(EClass.rnd(2));
			}
			break;
            ...
		case 920:
			flag2 = false;
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConBlind>(eleP / 2);
			}
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConParalyze>(eleP / 2);
			}
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConConfuse>(eleP / 2);
			}
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConPoison>(eleP / 2);
			}
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConSleep>(eleP / 2);
			}
			if (Chance(5 + eleP / 25, 40))
			{
				Chara.AddCondition<ConDim>(eleP / 2);
			}
			if (Chance(30 + eleP / 10, 100))
			{
				Chara.SAN.Mod(EClass.rnd(2));
			}
			break;
            ...
        bool Chance(int a, int max)
		{
			if (dmg > 0 || (origin != null && origin.HasElement(1345)))
			{
				return Mathf.Min(a, max) > EClass.rnd(100);
			}
			return false;
		}

狂気度を増加させる攻撃は2種類であり、これは人々が狂気度を上昇する主なる要因であると観察されています。

  • Element ID 914または幻惑属性攻撃は、受けた攻撃ごとに50%の確率で狂気度が0 - 1増加します。
  • Element ID 920または混沌属性攻撃は、受けた攻撃ごとに確率で狂気度が0 - 1増加します。この確率は攻撃のエレメントパワーによって異なり、30%から100%の範囲になります。
  • 狂気度を固定で増加させる効果もいくつか存在します。"気持ちいいこと"を行うと狂気度が10増加します(要確認)。人肉を食べること(カニバリズム)は固定で狂気度が15増加します。

狂気度と眠気の関係

    public class StatsSleepiness : Stats
    {
	    public const int Sleepy = 1;
 
    	public const int VerySleepy = 2;

    	public const int VeryVerySleepy = 3;

    	public override bool TrackPhaseChange => BaseStats.CC.IsPC;
    }
    ...
    public Stats sleepiness => Stats.Sleepiness.Set(_cints, 17, this);
    public Stats SAN => Stats.SAN.Set(_cints, 17, this);

    public bool CanSleep()
	{
		if (EClass._zone.events.GetEvent<ZoneEventQuest>() != null)
		{
			return false;
		}
		if (!EClass.debug.godMode && sleepiness.GetPhase() == 0)
		{
			return stamina.GetPhase() <= 1;
		}
		return true;
	}
    public override int GetPhase()
	{
		return base.source.phase[(int)Mathf.Clamp(10f * (float)value / (float)max, 0f, 9f)];
	}

	public virtual void Set(int a)
	{
		value = a;
		if (value < min)
		{
			value = min;
		}
		else if (value > max)
		{
			value = max;
		}
	}
  • 面白いことに、キャラクターの狂気度と睡眠値は同じID(17)のパラメータによって決定している。
  • 実際にプレイの時も、眠気1段階は常に狂気度が40になった瞬間に発動している。つまり、睡眠値(眠気)と狂気度は常に連動していると見っても問題ないかと思います。
    • 実際に自分自身に「狂気の手」を連続で使って、たとえさっき起床したばかりとしでも、狂気度が40になった瞬間PCが眠気状態になるのは確認済み。
    • 狂気度は「ひどい眠気」の状態で「徐々に狂気度が上昇」ではなく、最初から時間とともに「徐々に上昇」して、ある段階に達すると「眠気」或いは「ひどい眠気」の状態になるのが正しと思います。
    • 狂気度は時間とともに0から上昇するという現象は確認済み。
  • これは推測ですが、狂気度と睡眠値は元々異なる値になるはずだが、EA23.54の段階ではこの二つの値は一つになるバグが存在すると思います。
    • 実際、どれだけElin Decompiledで探しても、時間とともにSAN値を増加するコードは見つかりませんでした。
    • だが、時間とともにSleepinessを増加するコードはある。SAN=Sleepiness、だからSAN値も時間とともに増えているだけだと思います。