Elin:Code Analysis/Unclassified: Difference between revisions

From Ylvapedia
No edit summary
 
(6 intermediate revisions by the same user not shown)
Line 7: Line 7:
'''For authors''': Please note the version of game tested on for each section added.
'''For authors''': Please note the version of game tested on for each section added.


==Sword Mage - Talisman Trait (EA23.54)==
== Drink from well (EA23.67)==
{{Version|23.67}}
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
    case MixType.Talisman:
public override void TrySetAct(ActPlan p)
{
int num2 = EClass.pc.Evalue(1418);
Thing thing4 = ai.ings[1];
SourceElement.Row source2 = (thing4.trait as TraitSpellbook).source;
int num3 = thing4.c_charges * source2.charge * (100 + num2 * 50) / 500 + 1;
int num4 = 100;
Thing thing5 = ThingGen.Create("talisman").SetNum(num3);
thing5.refVal = source2.id;
thing5.encLV = num4 * (100 + num2 * 10) / 100;
thing.ammoData = thing5;
thing.c_ammo = num3;
EClass.pc.Say("talisman", thing, thing5);
thing4.Destroy();
break;
}
</syntaxhighlight>
 
* The "talisman mastery 2" trait of swordmage positively influence the effect of created talismans. Specifically:
** The number of charges created by swordmage will be '''(magic_book_charges * num_of_charge_gained_if_read * 2 / 5) + 1'''.
** For a normal PC, the number of charges will be '''(magic_book_charges * num_of_charge_gained_if_read * 1 / 5) + 1'''.
*** For example, for a magic book with 3 reads left with each read giving PC 10 charges, the number of talisman charge by swordmage would be 13, while by normal PC would be 7.
** The talisman level created by swordmage is fixed at 120, while fixed at 100 by normal PC.
 
== Food Effect (EA 23.62 Hotfix 1) ==
'''Food Effect''' is one of the most important part of Elin and Elona. As the saying goes "you are what you eat." We shall put the entire code here, and track any changes affecting the biggest part of the game: cooking and eating.
 
=== Human or not human? ===
<syntaxhighlight lang="c#" line="1">
    public static bool IsHumanFlesh(Thing food)
{
{
if (food.HasTag(CTAG.notHumanMeat))
p.TrySetAct("actDrink", delegate
{
return false;
}
if (food.id == "deadbody")
{
return true;
}
if (food.source._origin != "meat" && food.source._origin != "dish")
{
return false;
}
string[] components = food.source.components;
for (int i = 0; i < components.Length; i++)
{
{
if (components[i].Contains("egg"))
if (Charges <= 0)
{
{
EClass.pc.Say("drinkWell_empty", EClass.pc, owner);
return false;
return false;
}
}
}
EClass.pc.Say("drinkWell", EClass.pc, owner);
if (!IsHumanFlesh(food.refCard))
EClass.pc.PlaySound("drink");
{
EClass.pc.PlayAnime(AnimeID.Shiver);
return IsHumanFlesh(food.refCard2);
if (IsHoly || EClass.rnd(5) == 0)
}
{
return true;
ActEffect.Proc(EffectId.ModPotential, EClass.pc, null, (!polluted && (IsHoly || EClass.rnd(2) == 0)) ? 100 : (-100));
}
}
</syntaxhighlight>
else if (EClass.rnd(5) == 0)
 
* This part of the code controls whether the corpse is considered human flesh:
** If the food has id of "deadbody", then it is automatically True.
** If the food is not meat or dish, it is automatically False.
*** Probably want to disinclude milk, eggs, etc.
** If the food components contains egg, then it is not considered human flesh.
*** '''This can potentially be exploited to put human flesh and egg together and create a non-human flesh dish.'''
*** Not many recipes put meat and egg together though.
** The refCard effects '''need to be confirmed'''.
 
=== Undead or not? ===
<syntaxhighlight lang="c#" line="1">
public static bool IsUndeadFlesh(Thing food)
{
if (food.source._origin != "meat" && food.source._origin != "dish")
{
return false;
}
if (!IsUndeadFlesh(food.refCard))
{
return IsUndeadFlesh(food.refCard2);
}
return true;
}
</syntaxhighlight>
 
* The code for undead flesh is much more simple.
** It checks if the food in question is raw meat or a complete dish. If not returns false.
** It then checks the refCards of the food & components. ('''Need confirmation''')
 
=== How much does this food give you? ===
'''WARNING''': This section is not based on empirical analysis.
 
Please beware the editor's understanding of this part of the code is rudimentary only.
 
* There are a few main contributing factor of a dish.
** One of them is a overall modifier, in code this is depicted as '''num2'''
<syntaxhighlight lang="c#" line="1">
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;
}
</syntaxhighlight>
* This value is first set start from 100, if just cooked +10, if consumed in the eating area in PC region +10, if crafted by PC with 3 level of gourmet +5. Each level of food quality +10 ('''Need confirmation if it is the value shown on screen'''), then divided by 200.
** Example: A dish crafted by a normal PC, with food quality of lvl 5, consumed in the eating area, would have a value of 0.8.
** If this value is less than 0.1, it is set at 0.1.
 
<syntaxhighlight lang="c#" line="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;
BadEffect(EClass.pc);
num2 *= 1.5f;
}
}
else
else if (EClass.rnd(4) == 0)
{
{
num5 *= 0.5f;
ActEffect.Proc(EffectId.Mutation, EClass.pc);
num2 /= 2f;
num3 /= 2;
}
}
}
else if (EClass.rnd(EClass.debug.enable ? 2 : 10) == 0 && !polluted && !EClass.player.wellWished)
        else if (flag2)
{
num5 = 0f;
num2 *= 0.5f;
}
</syntaxhighlight>
 
* With the previous value, if the food is blessed, increase 50%, if the food is cursed, cut by 50%.
* If the consumer have canniblism and the dish is human, increase 50%, if dish is not human, cut by 50%, while the nutrition of the dish is also cut by 50%.
* If the consumer doesn't have cannibilism and the dish is human, cut by 50%.
 
<syntaxhighlight lang="c#" line="1">
if (c.HasElement(1200))
{
num2 *= 1.25f;
}
if (!c.IsPC)
{
num2 *= 3f;
}
</syntaxhighlight>
 
* If the PC have the trait of Efficient Feeder (Juere), the value is increase by 25%.
* If the consumer is not PC, increased by 200%.
** This is the main reason why pets outpaces PC really fast... They eat 3 times more efficient than PC!
 
<syntaxhighlight lang="c#" line="1">
switch (food.source._origin)
{
{
case "meat":
if (EClass.player.CountKeyItem("well_wish") > 0)
if (c.IsPC)
{
{
c.Say("food_raw_meat");
EClass.player.ModKeyItem("well_wish", -1);
ActEffect.Proc(EffectId.Wish, EClass.pc, null, 10 + EClass.player.CountKeyItem("well_enhance") * 10);
EClass.player.wellWished = true;
}
}
num2 *= 0.7f;
else
num5 = 0.5f;
break;
case "fish":
if (c.IsHuman)
{
{
if (c.IsPC)
Msg.SayNothingHappen();
{
c.Say("food_raw_fish");
}
num2 *= 0.9f;
num5 = 0.5f;
}
}
break;
}
case "dough":
else if (polluted)
if (c.IsPC)
{
c.Say("food_raw_powder");
}
num2 *= 0.9f;
num5 = 0.5f;
break;
</syntaxhighlight>
 
* If the food is not rotten:
** If the food is raw, depend on the category, its value is further decreased: meat -30%, fish -10%, dough -10%.
 
<syntaxhighlight lang="c#" line="1">
    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);
}
</syntaxhighlight>
 
* The nutrition value (num3) of food is loaded, and the actual nutrition can be absorbed by a character cannot exceed its current hunger value.
* If the character is hungry, then the actual nutrition is increased by 10%.
** A reminder, what is increased is not efficiency, but nutrition amount. I.e. the food becomes more filling.
* If the food is rot and the character cannot take rotten food, each of the characters main attribute will be heavily penalized, except Will, which will have a heavy increase.
** Guess eating rotten food train your will.
 
<syntaxhighlight lang="c#" line="1">
    else
{
num2 = num2 * num6 / 10f;
if (c.HasCondition<ConAnorexia>())
{
{
num2 = 0.01f;
EClass.pc.Say("drinkWater_dirty");
BadEffect(EClass.pc);
}
}
List<Element> list = food.ListValidTraits(isCraft: true, limit: false);
else
foreach (Element value in food.elements.dict.Values)
{
{
if (value.source.foodEffect.IsEmpty() || !list.Contains(value))
EClass.pc.Say("drinkWater_clear");
{
}
continue;
ModCharges(-1);
}
return true;
string[] foodEffect = value.source.foodEffect;
}, owner);
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);
}
}
</syntaxhighlight>
 
* The eventual gain of food is multiplied by its actual nutrition value, divided by 10.
* If the character is currently in Anorxeia, it can only gain 1% of the original benefit of eating.
<syntaxhighlight lang="c#" line="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;
}
</syntaxhighlight>
</syntaxhighlight>


* The food effect for attribute experiences and attribute potential is different.
* These code explains what happens when you drink water from well.
** For attribute experiences, the experience gained is (overall modifier (num2)) (actual nutrition (num6)) / 10 * dish exp level * 8 / 3.
* These effects will be applied step by step.
** For potential increase, the increase is a value between 50% and 100% of (overall modifier (num2)) * (actual nutrition (num6)) / 10 * dish exp level / 5 + 1.
* In 1/5 chance, potential of a main attribute will increase (50%) or decrease (50%).
*** However the value will be further penalized if the temporal potential is already over 150.
** This will be forced to trigger if it i a holy well, and will be 100% increase.
* Then in another 1/5 chance, bad effect will be applied to the PC, with equal chance of being one of the seven: Blind, Paralyze, Sleep, Poison, Faint, Disease, Confuse.
* Then in another 1/4 chance, a mutation will be applied to the PC.
* Then in another 1/10 chance, and when PC hasn't wished in this year, and when the well isn't polluted, a wish is granted.
** This chance is increased to 1/2 if user in debug mode.
** The strength of wish is 10 + 10 * the amount of saliva a PC have.
* Then, the normal effect will be triggered.
** If the well is polluted, debuff will be applied to the PC.
** If the well is clean, it is as if the PC drank real water.


=== Is this food tasty? ===


* Overall Chances for non-holy, non-polluted well:
** 10% Main Attribute Potential Increase
** 10% Main Attribute Potential Decrease
** 16% 1 of 7 type of Bad effect on PC
** 16% Random Mutation on PC
** '''4.8% Wish''' (if PC meet the requirement)
** 43.2% Plain Water.


[[Category:EN]]
[[Category:EN]]
[[Category:Elin Spoiler]]
[[Category:Elin Spoiler]]

Latest revision as of 15:09, 27 December 2024


This page is designed to feature code analysis that are currently unclassified into other pages, either due to being too minor detail, or don't have enough stuff to justify having its entire page.

Material in this page will be moved into other pages constantly. Please refrain from linking wiki articles onto this page.

For authors: Please note the version of game tested on for each section added.

Drink from well (EA23.67)

Version EA23.67: This article is behind the latest stable release of Elin, but maybe close enough to be reliable.
public override void TrySetAct(ActPlan p)
	{
		p.TrySetAct("actDrink", delegate
		{
			if (Charges <= 0)
			{
				EClass.pc.Say("drinkWell_empty", EClass.pc, owner);
				return false;
			}
			EClass.pc.Say("drinkWell", EClass.pc, owner);
			EClass.pc.PlaySound("drink");
			EClass.pc.PlayAnime(AnimeID.Shiver);
			if (IsHoly || EClass.rnd(5) == 0)
			{
				ActEffect.Proc(EffectId.ModPotential, EClass.pc, null, (!polluted && (IsHoly || EClass.rnd(2) == 0)) ? 100 : (-100));
			}
			else if (EClass.rnd(5) == 0)
			{
				BadEffect(EClass.pc);
			}
			else if (EClass.rnd(4) == 0)
			{
				ActEffect.Proc(EffectId.Mutation, EClass.pc);
			}
			else if (EClass.rnd(EClass.debug.enable ? 2 : 10) == 0 && !polluted && !EClass.player.wellWished)
			{
				if (EClass.player.CountKeyItem("well_wish") > 0)
				{
					EClass.player.ModKeyItem("well_wish", -1);
					ActEffect.Proc(EffectId.Wish, EClass.pc, null, 10 + EClass.player.CountKeyItem("well_enhance") * 10);
					EClass.player.wellWished = true;
				}
				else
				{
					Msg.SayNothingHappen();
				}
			}
			else if (polluted)
			{
				EClass.pc.Say("drinkWater_dirty");
				BadEffect(EClass.pc);
			}
			else
			{
				EClass.pc.Say("drinkWater_clear");
			}
			ModCharges(-1);
			return true;
		}, owner);
	}
  • These code explains what happens when you drink water from well.
  • These effects will be applied step by step.
  • In 1/5 chance, potential of a main attribute will increase (50%) or decrease (50%).
    • This will be forced to trigger if it i a holy well, and will be 100% increase.
  • Then in another 1/5 chance, bad effect will be applied to the PC, with equal chance of being one of the seven: Blind, Paralyze, Sleep, Poison, Faint, Disease, Confuse.
  • Then in another 1/4 chance, a mutation will be applied to the PC.
  • Then in another 1/10 chance, and when PC hasn't wished in this year, and when the well isn't polluted, a wish is granted.
    • This chance is increased to 1/2 if user in debug mode.
    • The strength of wish is 10 + 10 * the amount of saliva a PC have.
  • Then, the normal effect will be triggered.
    • If the well is polluted, debuff will be applied to the PC.
    • If the well is clean, it is as if the PC drank real water.


  • Overall Chances for non-holy, non-polluted well:
    • 10% Main Attribute Potential Increase
    • 10% Main Attribute Potential Decrease
    • 16% 1 of 7 type of Bad effect on PC
    • 16% Random Mutation on PC
    • 4.8% Wish (if PC meet the requirement)
    • 43.2% Plain Water.