Elin:Code Analysis/Unclassified: Difference between revisions

From Ylvapedia
No edit summary
m (Move the beekeeping code from the Bee hive page.)
 
(10 intermediate revisions by 2 users 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));
}
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);
}
}
</syntaxhighlight>
</syntaxhighlight>


* This part of the code controls whether the corpse is considered human flesh:
* These code explains what happens when you drink water from well.
** If the food has id of "deadbody", then it is automatically True.
* These effects will be applied step by step.
** If the food is not meat or dish, it is automatically False.
* In 1/5 chance, potential of a main attribute will increase (50%) or decrease (50%).
*** Probably want to disinclude milk, eggs, etc.
** This will be forced to trigger if it i a holy well, and will be 100% increase.
** If the food components contains egg, then it is not considered human flesh.
* 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.
*** '''This can potentially be exploited to put human flesh and egg together and create a non-human flesh dish.'''
* Then in another 1/4 chance, a mutation will be applied to the PC.
*** Not many recipes put meat and egg together though.
* 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.
** The refCard effects '''need to be confirmed'''.
** 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.


=== 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.
* Overall Chances for non-holy, non-polluted well:
** It checks if the food in question is raw meat or a complete dish. If not returns false.
** 10% Main Attribute Potential Increase
** It then checks the refCards of the food & components. ('''Need confirmation''')
** 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.


=== How much does this food give you? ===
== Gamble Chest (EA23.96)==
* There are a few main contributing factor of a dish.
{{Version|23.96}}
** One of them is a overall modifier, in code this is depicted as '''num2'''
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
bool flag = EClass._zone.IsPCFaction && c.IsInSpot<TraitSpotDining>();
public override IEnumerable<AIAct.Status> Run()
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;
this.owner.Say("lockpick_start", this.owner, this.target, null, null);
if (num2 < 0.1f)
this.owner.PlaySound("lock_pick", 1f, true);
while (this.target.Num > 0 && this.IsValid())
{
{
num2 = 0.1f;
this.owner.PlaySound("lock_open_small", 1f, true);
}
this.owner.LookAt(this.target);
</syntaxhighlight>
this.target.renderer.PlayAnime(AnimeID.Shiver, default(Vector3), false);
* 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.
yield return base.KeepRunning();
** 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.
EClass.player.stats.gambleChest++;
** If this value is less than 0.1, it is set at 0.1.
Rand.SetSeed(EClass.game.seed + EClass.player.stats.gambleChest);
 
bool flag = this.owner.Evalue(280) + 5 >= EClass.rnd(this.target.c_lockLv + 10);
<syntaxhighlight lang="c#" line="1">
if (EClass.rnd(20) == 0)
bool flag2 = IsHumanFlesh(food);
{
bool flag3 = IsUndeadFlesh(food);
flag = true;
bool flag4 = c.HasElement(1205);
}
bool flag5 = food.IsDecayed || flag3;
if (EClass.rnd(20) == 0)
    if (food.IsBlessed)
{
{
flag = false;
num2 *= 1.5f;
}
}
int num = 20 + this.target.c_lockLv / 3;
if (food.IsCursed)
if (flag)
{
num2 *= 0.5f;
}
if (flag4)
{
if (flag2)
{
{
num5 *= 2f;
num *= 3;
num2 *= 1.5f;
EClass.player.stats.gambleChestOpen++;
Rand.SetSeed(EClass.game.seed + EClass.player.stats.gambleChestOpen);
bool flag2 = 100 + this.owner.LUC > EClass.rnd(10000);
if (EClass.debug.enable && EClass.rnd(2) == 0)
{
flag2 = true;
}
if (flag2)
{
this.owner.PlaySound("money", 1f, true);
this.owner.PlayAnime(AnimeID.Jump, false);
Thing thing = ThingGen.Create("money", -1, -1).SetNum(EClass.rndHalf(50 * (100 + this.target.c_lockLv * 10)));
this.owner.Pick(thing, false, true);
this.owner.Say("gambleChest_win", thing, null, null);
}
else
{
this.owner.Say("gambleChest_loss", null, null);
}
Rand.SetSeed(-1);
}
}
else
else
{
{
num5 *= 0.5f;
this.owner.Say("gambleChest_broke", this.target.GetName(NameStyle.Full, 1), null);
num2 /= 2f;
this.owner.PlaySound("rock_dead", 1f, true);
num3 /= 2;
}
this.target.ModNum(-1, true);
this.owner.ModExp(280, num);
if (EClass.rnd(2) == 0)
{
this.owner.stamina.Mod(-1);
}
}
}
}
        else if (flag2)
yield break;
{
}
num5 = 0f;
num2 *= 0.5f;
}
</syntaxhighlight>
</syntaxhighlight>


* With the previous value, if the food is blessed, increase 50%, if the food is cursed, cut by 50%.
* This code defines what happens when you open a gamble chest.
* If the consumer have canniblism and the dish is human, increase 50%, if dish is not human, cut by 50%.
* Winning only grants you orens.
* If the consumer doesn't have cannibilism and the dish is human, cut by 50%.
* The maximum orens you can win is (500 × Chest Level) + 5000.
** For example, if the chest's name ends with +50, based on this formula, you can win an amount between 15000 and 30000 orens.
* If a gamble chest is unlocked by an informer, a bug causes the winning amount to be between 2,500 and 3,000 orens.
* The minimum orens you can win is half of the maximum.
* The winning chance is based on the total number of gamble chests opened, allowing players to exploit it through save scumming. For example, if you save your progress, open chests, and win on the 9th one, reloading will always result in a win on the 9th chest.


== Honeycomb production <ref>The code was obtained from [https://www.reddit.com/r/ElinsInn/comments/1k10qxh/question_about_beehives/ u/grenadier42's decompilation of the Nightly code as of 18 Apr 2025.]</ref> ==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
if (c.HasElement(1200))
int soilCost = EClass._zone.GetSoilCost();
{
CS$<>8__locals1.flower = 5;
num2 *= 1.25f;
int num = Mathf.Min(100, 70 + (this.MaxSoil - soilCost));
}
int num2 = 0;
if (!c.IsPC)
foreach (Thing thing3 in EClass._map.things)
{
{
num2 *= 3f;
    if (thing3.IsInstalled && thing3.trait is TraitBeekeep && !thing3.things.IsFull(0))
}
    {
        CS$<>8__locals1.flower -= 3 + EClass.rnd(5 + num2 * 4);
        num2++;
        if (CS$<>8__locals1.flower < 0)
        {
            break;
        }
        if (EClass.rnd(100) <= num)
        {
            Thing thing4 = ThingGen.Create("honey", -1, -1);
            thing4.SetEncLv(CS$<>8__locals1.lv / 10);
            thing4.elements.SetBase(2, EClass.curve(CS$<>8__locals1.lv, 50, 10, 80), 0);
            thing3.AddThing(thing4, true, -1, -1);
        }
    }
}
</syntaxhighlight>
</syntaxhighlight>


* If the PC have the trait of Efficient Feeder (Juere), the value is increase by 25%.
Every day a base is updated, the above code runs, which causes each beehive to process whether a honeycomb is produced or not depending on the number of flowers remaining on the map.
* If the consumer is not PC, increased by 200%.
To be eligible to run the code, the beehive must be installed on the map (rather than in a container or dropped on the floor) and it must have free slots in its inventory, otherwise it will be treated as if it does not exist.
** This is the main reason why pets outpaces PC really fast... They eat 3 times more efficient than PC!
As a tent is not a 'base', beehives do not work within tents.


<syntaxhighlight lang="c#" line="1">
The base 'flower power' of each map is 5, to which the sum total of the Flower, Blue Flower, Yellow Flower, White Flower and Cotton plants on the map is added; i.e. three eligible flowers results in a 'flower power' of 8.
switch (food.source._origin)
Each successive hive deducts 3 + random (0 to 5 + 4(n-1)) 'flower power' to produce one honeycomb - so the first takes 3 to 8 'flower power', the second takes 3 to 12 'flower power', and so on and so forth.
{
 
case "meat":
Finally, eligible hives have a probability ([Available Fertility] + 70%) of creating honeycombs; hives on maps with 30 Fertility will have a 100% chance of producing honeycombs if enough 'flower power' is available, while maps with -70 Fertility have a close to 0% chance (the random number generated has to be exactly zero to produce a honeycomb). Because growing flowers takes Fertility in itself, adding flowers increases the maximum number of beehives that can potentially produce honeycombs at the same time it also reduces the probability each beehive actually produces any honeycombs. As the required 'flower power' increases with the number of hives on a map in a geometric manner but the fertility effect is linear, honeycomb production tends to be flower-limited at smaller numbers and Fertility-limited at large numbers.
if (c.IsPC)
 
{
When honeycombs are produced, their quality is dependent on the quality of the best eligible flower on the map; a single +70 flower in a field of +0 flowers will still result in all hives producing stacks of +7 honeycombs.
c.Say("food_raw_meat");
Flowers can still contribute to honeycomb production even if defertilized (e.g. to survive winter without the usage of sun lamps).
}
 
num2 *= 0.7f;
Bee hives spawn neutral bees around them. Killing the bees has no effect on hives or honeycomb production, and there does not need to be a valid path from the beehive to the flowers for honeycombs to be produced.
num5 = 0.5f;
break;
case "fish":
if (c.IsHuman)
{
if (c.IsPC)
{
c.Say("food_raw_fish");
}
num2 *= 0.9f;
num5 = 0.5f;
}
break;
case "dough":
if (c.IsPC)
{
c.Say("food_raw_powder");
}
num2 *= 0.9f;
num5 = 0.5f;
break;
</syntaxhighlight>


* If the food is not rotten:
See the table below for a summary of the number of flowers each hive requires as per the above formula.
** If the food is raw, depend on the category, its value is further decreased: meat -30%, fish -10%, dough -10%.
Remember to deduct the base 'flower power' of 5 from these numbers; for instance, 25 flowers has a non-zero chance of producing honeycombs from the 10th beehive.


[[File:Beehive.jpg|alt=Table of hive number vs flower count|Number of flowers needed for each hive]]


[[Category:EN]]
[[Category:EN]]
[[Category:Elin Spoiler]]
[[Category:Elin Spoiler]]
<references />

Latest revision as of 12:27, 18 April 2025


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 at least 20 minor version or a major version behind the latest stable release of Elin. Please help update the page.
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.

Gamble Chest (EA23.96)

Version EA23.96: This article is at least 20 minor version or a major version behind the latest stable release of Elin. Please help update the page.
public override IEnumerable<AIAct.Status> Run()
	{
		this.owner.Say("lockpick_start", this.owner, this.target, null, null);
		this.owner.PlaySound("lock_pick", 1f, true);
		while (this.target.Num > 0 && this.IsValid())
		{
			this.owner.PlaySound("lock_open_small", 1f, true);
			this.owner.LookAt(this.target);
			this.target.renderer.PlayAnime(AnimeID.Shiver, default(Vector3), false);
			yield return base.KeepRunning();
			EClass.player.stats.gambleChest++;
			Rand.SetSeed(EClass.game.seed + EClass.player.stats.gambleChest);
			bool flag = this.owner.Evalue(280) + 5 >= EClass.rnd(this.target.c_lockLv + 10);
			if (EClass.rnd(20) == 0)
			{
				flag = true;
			}
			if (EClass.rnd(20) == 0)
			{
				flag = false;
			}
			int num = 20 + this.target.c_lockLv / 3;
			if (flag)
			{
				num *= 3;
				EClass.player.stats.gambleChestOpen++;
				Rand.SetSeed(EClass.game.seed + EClass.player.stats.gambleChestOpen);
				bool flag2 = 100 + this.owner.LUC > EClass.rnd(10000);
				if (EClass.debug.enable && EClass.rnd(2) == 0)
				{
					flag2 = true;
				}
				if (flag2)
				{
					this.owner.PlaySound("money", 1f, true);
					this.owner.PlayAnime(AnimeID.Jump, false);
					Thing thing = ThingGen.Create("money", -1, -1).SetNum(EClass.rndHalf(50 * (100 + this.target.c_lockLv * 10)));
					this.owner.Pick(thing, false, true);
					this.owner.Say("gambleChest_win", thing, null, null);
				}
				else
				{
					this.owner.Say("gambleChest_loss", null, null);
				}
				Rand.SetSeed(-1);
			}
			else
			{
				this.owner.Say("gambleChest_broke", this.target.GetName(NameStyle.Full, 1), null);
				this.owner.PlaySound("rock_dead", 1f, true);
			}
			this.target.ModNum(-1, true);
			this.owner.ModExp(280, num);
			if (EClass.rnd(2) == 0)
			{
				this.owner.stamina.Mod(-1);
			}
		}
		yield break;
	}
  • This code defines what happens when you open a gamble chest.
  • Winning only grants you orens.
  • The maximum orens you can win is (500 × Chest Level) + 5000.
    • For example, if the chest's name ends with +50, based on this formula, you can win an amount between 15000 and 30000 orens.
  • If a gamble chest is unlocked by an informer, a bug causes the winning amount to be between 2,500 and 3,000 orens.
  • The minimum orens you can win is half of the maximum.
  • The winning chance is based on the total number of gamble chests opened, allowing players to exploit it through save scumming. For example, if you save your progress, open chests, and win on the 9th one, reloading will always result in a win on the 9th chest.

Honeycomb production [1]

int soilCost = EClass._zone.GetSoilCost();
CS$<>8__locals1.flower = 5;
int num = Mathf.Min(100, 70 + (this.MaxSoil - soilCost));
int num2 = 0;
foreach (Thing thing3 in EClass._map.things)
{
    if (thing3.IsInstalled && thing3.trait is TraitBeekeep && !thing3.things.IsFull(0))
    {
        CS$<>8__locals1.flower -= 3 + EClass.rnd(5 + num2 * 4);
        num2++;
        if (CS$<>8__locals1.flower < 0)
        {
            break;
        }
        if (EClass.rnd(100) <= num)
        {
            Thing thing4 = ThingGen.Create("honey", -1, -1);
            thing4.SetEncLv(CS$<>8__locals1.lv / 10);
            thing4.elements.SetBase(2, EClass.curve(CS$<>8__locals1.lv, 50, 10, 80), 0);
            thing3.AddThing(thing4, true, -1, -1);
        }
    }
}

Every day a base is updated, the above code runs, which causes each beehive to process whether a honeycomb is produced or not depending on the number of flowers remaining on the map. To be eligible to run the code, the beehive must be installed on the map (rather than in a container or dropped on the floor) and it must have free slots in its inventory, otherwise it will be treated as if it does not exist. As a tent is not a 'base', beehives do not work within tents.

The base 'flower power' of each map is 5, to which the sum total of the Flower, Blue Flower, Yellow Flower, White Flower and Cotton plants on the map is added; i.e. three eligible flowers results in a 'flower power' of 8. Each successive hive deducts 3 + random (0 to 5 + 4(n-1)) 'flower power' to produce one honeycomb - so the first takes 3 to 8 'flower power', the second takes 3 to 12 'flower power', and so on and so forth.

Finally, eligible hives have a probability ([Available Fertility] + 70%) of creating honeycombs; hives on maps with 30 Fertility will have a 100% chance of producing honeycombs if enough 'flower power' is available, while maps with -70 Fertility have a close to 0% chance (the random number generated has to be exactly zero to produce a honeycomb). Because growing flowers takes Fertility in itself, adding flowers increases the maximum number of beehives that can potentially produce honeycombs at the same time it also reduces the probability each beehive actually produces any honeycombs. As the required 'flower power' increases with the number of hives on a map in a geometric manner but the fertility effect is linear, honeycomb production tends to be flower-limited at smaller numbers and Fertility-limited at large numbers.

When honeycombs are produced, their quality is dependent on the quality of the best eligible flower on the map; a single +70 flower in a field of +0 flowers will still result in all hives producing stacks of +7 honeycombs. Flowers can still contribute to honeycomb production even if defertilized (e.g. to survive winter without the usage of sun lamps).

Bee hives spawn neutral bees around them. Killing the bees has no effect on hives or honeycomb production, and there does not need to be a valid path from the beehive to the flowers for honeycombs to be produced.

See the table below for a summary of the number of flowers each hive requires as per the above formula. Remember to deduct the base 'flower power' of 5 from these numbers; for instance, 25 flowers has a non-zero chance of producing honeycombs from the 10th beehive.

Table of hive number vs flower count