Elin:Code Analysis/Faith

From Ylvapedia
Jump to navigation Jump to search

Piety and Gift

Gift at which piety level?

    int num = EClass.pc.Evalue(85);
	if (giftRank == 0 && (num >= 15 || EClass.debug.enable))
		{
			Talk("pet");
			Chara chara = CharaGen.Create(source.rewards[0]);
			EClass._zone.AddCard(chara, point);
			chara.MakeAlly();
			chara.PlayEffect("aura_heaven");
			giftRank = 1;
			return true;
		}
	if (source.rewards.Length >= 2 && giftRank == 1 && (num >= 30 || EClass.debug.enable))
		{
			Talk("gift");
			string[] array = source.rewards[1].Split('|');
			string[] array2 = array;
			foreach (string text in array2)
			{
				Reforge(text, point, text == array[0]);
			}
			giftRank = 2;
			return true;
		}
  • As of EA23.61, there are two Gift ranks for each god, and each of them is hardcoded at piety level 15 and 30. You will recieve a gift after reach each of these levels then manually pray to the god.

What messages are shown at which threshold?

    int num = Mathf.Max(c.Evalue(306), 1);
    int num2 = 4;
	if (orCreateElement.vBase >= num)
		{
			c.elements.SetBase(orCreateElement.id, num);
		}
    else
		{
			num2 = Mathf.Clamp(orCreateElement.vBase * 100 / num / 25, 0, 3);
		}
	if (num2 == 4 || orCreateElement.Value != value)
		{
			Msg.Say("piety" + num2, c, c.faith.TextGodGender);
		}
  • The above code controls the faith message when your piety levels up.
  • There are 5 messages in all, determined by num2, ranging from (0~4).
  • num2 will be calculated using your (Piety level / Faith level) * 4,rounded down to the nearest integer.
    • So if <25%, num2 = 0; 25%~50%, num2 = 1, 50%~75%, num2 = 2, >75%, num2 = 3.
  • If you are already at the maximum piety level, num2 = 4
  • Then depend on num2, different message will be played.
  • If you are at maximum piety (num2 = 4), then a message will always be shown.

What message is shown at which offer value?

public int GetOfferingValue(Thing t, int num = -1)
	{
		if (num == -1)
		{
			num = t.Num;
		}
		int num2 = 0;
		if (t.source._origin == "meat")
		{
			num2 = Mathf.Clamp(t.SelfWeight / 10, 1, 1000);
			if (t.refCard == null)
			{
				num2 /= 10;
			}
		}
		else
		{
			string[] cat_offer = source.cat_offer;
			foreach (string key in cat_offer)
			{
				if (t.category.IsChildOf(key))
				{
					num2 = Mathf.Clamp(t.SelfWeight / 10, 50, 1000);
					num2 *= EClass.sources.categories.map[key].offer / 100;
					break;
				}
			}
		}
		if (num2 == 0)
		{
			return 0;
		}
		if (t.IsDecayed)
		{
			num2 /= 10;
		}
		num2 *= (t.LV * 2 + 100) / 100;
		return Mathf.Max(num2, 1) * num;
	}
  • The offer value is calculated with the following
  • num is the number of items you offered.
  • num2 will be the offering value per item, with minimum value of "1".
  • If the item is meat, then;
    • The weight of meat is divided by 10 (to know that 1000 weight = 1.0s), with minimum value of 1 and maximum value of 1000.
    • If this meat is unlabelled (i.e. not being a meat drop by entity) the value is further divided by 10. (Need confirmation)
      • So a labelled, 0.7s meat will generate a offer value of 70.
  • If the item is of category a god will take, then:
    • The weight of item is divided by 10, but with a minimum value of 50 and maximum value of 1000.
      • The weight of item will still count, but anything less than 0.5s will count as 0.5s.
    • The number is then multiplied by the category value (Need investigation).
  • If the item is decayed (rotten), the offer value is further divided by 10.
  • The offer value will increase by 2% per each level of the item. (What is the level of an item?)
public void _OnOffer(Chara c, Thing t, int takeoverMod = 0)
	{
		bool @bool = t.GetBool(115);
		int offeringValue = Deity.GetOfferingValue(t, t.Num);
		offeringValue = offeringValue * (c.HasElement(1228) ? 130 : 100) / 100;
		if (takeoverMod == 0)
		{
			if (offeringValue >= 200)
			{
				Msg.Say("god_offer1", t);
				EClass.pc.faith.Talk("offer");
			}
			else if (offeringValue >= 100)
			{
				Msg.Say("god_offer2", t);
			}
			else if (offeringValue >= 50)
			{
				Msg.Say("god_offer3", t);
			}
			else
			{
				Msg.Say("god_offer4", t);
			}
		}
		else
		{
			Msg.Say("god_offer1", t);
			offeringValue += Deity.GetOfferingValue(t, 1) * takeoverMod;
		}
        int num = Mathf.Max(c.Evalue(306), 1);
		Element orCreateElement = c.elements.GetOrCreateElement(85);
		int value = orCreateElement.Value;
		c.elements.ModExp(orCreateElement.id, offeringValue * 2 / 3);
  • The previously calculated offeringValue will return to this function, then the message displayed will be determined.
  • But first, if the character is demigod, the offeringValue will be further offset by 30%.
  • The offering value threshold for each message is 200, 100, 50.
    • So a piece of meat of 2.2s should generate the best possible message...should it?
  • HOWEVER, the experience gained towards Piety is only calculated at two-thirds of the offering value. (Then what exactly is the 30 piety value in the wiki?)

Ehekatl's School of Magic

The relevant code relating to the randomized mana and stamina costs is as such:

    if (a < 0 && BaseStats.CC.HasElement(1330, 1))        
    {            
        a = -EClass.rnd(-a * 130 / 100 + 2);       
    }

This means that if there is a mana or stamina cost, the new cost is determined by taking a random number between 0 and 1.3 times the original cost plus 2. So in a case where a spell has a cost of 40, it would be randomised between 0 and 54.