Elin:Code Analysis/Ether Diseases

From Ylvapedia
Version EA23.61: This article is behind the latest stable release of Elin, but maybe close enough to be reliable.


This page analyze the Ether Diseases of this world. The latest version this analysis is updated to is EA23.61 Hotfix3.

Be careful when adding information from here to the main wiki, since a lot of the information here is not obtainable unless you dig into codes.

Ether Diseases

Depiction of Ether Disease in code: an Index

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;
  • All ether disease is depicted with integer (i.e. level). There are 16 kinds of diseases, and we will review each of them.
  • If you want to see for the effect yourself, just search for that number in code.

Mana Battery

    case 1564:
			ModBase(961, a * 5, hide: false);
			break;
  • This disease increase your magic resistance (961) by 5 per level (there is only one level currently).
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);
	}
  • Once detect PC have mana battery, it will take the charges in a rod, then call Gainability(this spell, 100 * charge number) to give PC this spell.
  • This does not mean you get 100 wish spells for 1 charge of wish rod! Each spell have a unique charge parameter (see SourceGame/Element for more), and depend on the charge number it will give you number of spell casting.
    • This value is modified by your memorization skill. If you have the skill, a flat 20% is added, then for each skill level, 1% added.
    • For example, for a wish rod, and you have lvl 80 memorization, the num will equal to = 100 * 1 (Wish has a charge number of 1) * (80+100+20) / 100 / 100 = 2
    • Which is pretty good, yes, you get 2 wishes out of 1 rod, but can you cast it, hum?
  • After that, if you are not PC, your mana will be drained by 50 per charge of rod. Then the rod goes to 0 charges.

Poison Hand

    case 1565:
			ModBase(955, a * 20, hide: false);
			break;
  • Each level of poison hand raise your poison resistance by 20 (there is only 1 level).
    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;
			}
  • When you attack with no weapon, all your attack will be transformed into element Poison (915).
  • We see in the code a -50% penalty will be applied to your damage as well but this need confirmation.
    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;
	}
  • This is the code use to make all your potions in your bag poison.
  • A random chance of 50% is applied first, so there is 50% chance your potion will be spared.
  • It also looks like it will transform a whole stack of your potions at once.

Provoke (Enemy Of All Living Things)

    case 1563:
			ModBase(77, -a * (3 + num / 4), hide: false);
			break;
  • This negatively modify your charisma (Evalue 77) by (3 + Character level / 4) per level of disease.
    • We saved a bit of code analysis for aesthetic purpose. See vPotential = Char.LV for more detail.
    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);
		}
  • Every living thing will turn against you, unless:
    • It is your own faction member or pets.
    • It is not Neutral towards you already.
    • It is an animal.
    • You are not in a town.
    • You are in your own Faction area.
  • A random number still need to be rolled for this effect to apply, and it looks like the possibility is pretty, pretty low (2%).
  • This effect apply if ANYONE in your party have this ether disease, so watch out.
    if (EClass.pc.party.HasElement(1563) && num < 0)
				{
					num = num * 30 / 100;
				}
  • This code appears when a Karma negative modification need to be calculated. Your karma decrease will be cut to 30%, round down to nearest integer.
  • So -5 becomes -1, -1 becomes 0.

Stupid (Dementia)

    case 1561:
			ModBase(61, -a * 15, hide: false);
			ModBase(76, -a * (4 + num / 3), hide: false);
			break;
  • This disease decrease your mana by a flat 15, then decrease your MAG by (4 + Character LV / 3).

Weak (Weakening)

    case 1560:
			ModBase(60, -a * 15, hide: false);
			ModBase(70, -a * (4 + num / 3), hide: false);
			break;
  • This disease decrease your life by a flat 15, then decrease your STG by (4 + Character LV / 3).

Addict (Potion 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();
			}
		}
  • For a 1/30 chance each round, you will consume a potion, and end your turn.

Rain (Living Humidifier)

    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;
				}
			}
		}
  • Whenever it is time to set weather of the world, for EACH MEMBER of your team with this disease, 25% chance this will change the weather to rain.

Head (Enlarged 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);
  • Four modifier for this disease:
    • END by - (5 + Character LV / 3)
    • DEX by - (4 + Character LV / 4)
    • LEN by + (6 + Character LV / 2)
    • WIL by + (2 + Character LV / 6)

Violence (Hunger For Slaughter)

		case 1556:
			ModBase(64, -a * (10 + num), hide: false);
			ModBase(67, a * (5 + num / 2), hide: false);
			break;
  • This disease modify you DV by -(10 + Character Level), but increase your DMG by (5 + Character level / 2).

Neck (Thick 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;
  • This disease increase you PV by (12 + Character Level), but also decrease you CHA by -(5+ Character level / 5).
  • It also forcees you to unequip everything on your neck.

Wing (Ether 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;
  • This disease modify your weight (weightMod) by -10% per level.
  • It also give you a level of levitation per level of disease. (Are there multiple level of levitations?)
  • It increases your Speed by (10 + Character LV / 5) per level.
  • It force you to unequip everything on your back.

Eye (Third/Fourth Eye)

		case 1553:
			ModBase(73, a * (5 + num / 3), hide: false);
			ModBase(77, -a * (5 + num / 3), hide: false);
			break;
  • This disease modify your PER by (5 + Character LV / 3), but also decrease your CHA by the same amount per level.

Feet (Hoof Transformation)

		case 1552:
			ModBase(79, a * Mathf.Min(30 + num / 5, 100), hide: false);
			if (!hint && a > 0)
			{
				chara?.body.UnequipAll(39);
			}
			break;
  • This disease increase your speed by (30 + Character Lv / 5), with a maximum of 100 (reached at Character LV 350).
  • It also prevent you from equip anything on your feet.

Armor (Heavy Shell)

		case 1562:
			ModBase(65, a * (15 + num / 2), hide: false);
			ModBase(79, -a * (10 + num / 5), hide: false);
			break;
  • This disease increase your PV by (15 + Character LV / 2), but also modify your speed by -(10 + Character LV / 5).

Ugly (Crumbling Face)

		case 1551:
			ModBase(77, -a * (4 + num / 5), hide: false);
			break;
  • This disease decrease your CHA by (4 + Character LV / 5) per level. There are three levels.

Gravity (Immense Gravity)

		case 1550:
			ModBase(404, -a * 10, hide: false);
			break;
  • This disease increase your weight (weightMod) by 10% per level. There are three levels.