summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockCrops.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockCrops.h')
-rw-r--r--src/Blocks/BlockCrops.h44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/Blocks/BlockCrops.h b/src/Blocks/BlockCrops.h
index 1d612e685..827b26881 100644
--- a/src/Blocks/BlockCrops.h
+++ b/src/Blocks/BlockCrops.h
@@ -21,6 +21,17 @@ public:
private:
+ /** Calculate the number of seeds to drop when the crop is broken. */
+ static char CalculateSeedCount(char a_Min, char a_BaseRolls, char a_FortuneLevel)
+ {
+ std::binomial_distribution Binomial(a_BaseRolls + a_FortuneLevel, 0.57);
+ return a_Min + Binomial(GetRandomProvider().Engine());
+ }
+
+
+
+
+
virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cEntity * a_Digger, const cItem * a_Tool) const override
{
auto & rand = GetRandomProvider();
@@ -30,11 +41,12 @@ private:
{
switch (m_BlockType)
{
- case E_BLOCK_BEETROOTS: return cItem(E_ITEM_BEETROOT_SEEDS, 1, 0); break;
- case E_BLOCK_CROPS: return cItem(E_ITEM_SEEDS, 1, 0); break;
- case E_BLOCK_CARROTS: return cItem(E_ITEM_CARROT, 1, 0); break;
- case E_BLOCK_POTATOES: return cItem(E_ITEM_POTATO, 1, 0); break;
+ case E_BLOCK_BEETROOTS: return cItem(E_ITEM_BEETROOT_SEEDS);
+ case E_BLOCK_CROPS: return cItem(E_ITEM_SEEDS);
+ case E_BLOCK_CARROTS: return cItem(E_ITEM_CARROT);
+ case E_BLOCK_POTATOES: return cItem(E_ITEM_POTATO);
}
+
ASSERT(!"Unhandled block type");
return {};
}
@@ -45,30 +57,32 @@ private:
{
case E_BLOCK_BEETROOTS:
{
- char SeedCount = 1 + ((rand.RandInt<char>(2) + rand.RandInt<char>(2)) / 2); // [1 .. 3] with high preference of 2
- res.Add(E_ITEM_BEETROOT_SEEDS, SeedCount, 0);
- char BeetrootCount = 1 + ((rand.RandInt<char>(2) + rand.RandInt<char>(2)) / 2); // [1 .. 3] with high preference of 2
- res.Add(E_ITEM_BEETROOT, BeetrootCount, 0);
+ const auto SeedCount = CalculateSeedCount(0, 3, ToolFortuneLevel(a_Tool));
+ res.Add(E_ITEM_BEETROOT_SEEDS, SeedCount);
+ res.Add(E_ITEM_BEETROOT);
break;
}
case E_BLOCK_CROPS:
{
- res.Add(E_ITEM_WHEAT, 1, 0);
- res.Add(E_ITEM_SEEDS, 1 + ((rand.RandInt<char>(2) + rand.RandInt<char>(2)) / 2), 0); // [1 .. 3] with high preference of 2
+ res.Add(E_ITEM_WHEAT);
+ const auto SeedCount = CalculateSeedCount(1, 3, ToolFortuneLevel(a_Tool));
+ res.Add(E_ITEM_SEEDS, SeedCount);
break;
}
case E_BLOCK_CARROTS:
{
- res.Add(E_ITEM_CARROT, 1 + ((rand.RandInt<char>(2) + rand.RandInt<char>(2)) / 2), 0); // [1 .. 3] with high preference of 2
+ const auto CarrotCount = CalculateSeedCount(1, 4, ToolFortuneLevel(a_Tool));
+ res.Add(E_ITEM_CARROT, CarrotCount);
break;
}
case E_BLOCK_POTATOES:
{
- res.Add(E_ITEM_POTATO, 1 + ((rand.RandInt<char>(2) + rand.RandInt<char>(2)) / 2), 0); // [1 .. 3] with high preference of 2
- if (rand.RandBool(0.05))
+ const auto PotatoCount = CalculateSeedCount(2, 3, ToolFortuneLevel(a_Tool));
+ res.Add(E_ITEM_POTATO, PotatoCount);
+ if (rand.RandBool(0.02))
{
- // With a 5% chance, drop a poisonous potato as well
- res.emplace_back(E_ITEM_POISONOUS_POTATO, 1, 0);
+ // With a 2% chance, drop a poisonous potato as well
+ res.Add(E_ITEM_POISONOUS_POTATO);
}
break;
}