Type: Mod
Name: KenirasRandomRecipes
Description: Randomizes recipes for different ratios in every game.
License: MIT
Version: 1.6.5
Latest release: 2020-04-13
Tested-With-Factorio-Version: 0.18
Randomizes the amount of ingredients, crafting time and amount of products of recipes for different ratios / playstyles in every game. The probability for generated numbers is higher close to the default values which can also be customized.
Other properties like inserter speed, belt speed, turret and weapon damage, energy usage, pollution, energy produced, reactor power, item fuel value, mining speed, assembling machine speed, furnace speed, module stats and more can also be randomized and can be toggled on/off individually.
IMPORTANT: Due to factorio being deterministic, you need to change the "Random seed" in the ingame mod options everytime you want to get different recipes.
For more detailed options and the blacklist, see the readme and config.lua.
Mod compatibility
Mod compatibility should be okay, but can mess up certain recipe chains with bad luck - items can easily be added to the blacklist in the config.lua though.
Known Issues
If you randomize module stats, the results can be very nonsensical. Everything is toggleable though.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.2
Posted: Mon May 22, 2017 7:31 pm
by system
bug/feature: When some mod updated, its recipes got randomized again.
E.g. after updating angel smelting, rates for iron processing changed a lot.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.2
Posted: Mon May 22, 2017 9:40 pm
by Kenira
I definitely see it as a bug and yeah, things will also change if you either add or remove mods - anything that adds or removes recipes. So far very few people downloaded the mod so i didn't think it was worth putting too much effort into it, but i'll give it a shot tomorrow.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.2
Posted: Tue May 23, 2017 9:12 am
by Kenira
Sorry, i don't think this is possible after all - i'd need to store some data permanently, but at the time where you can change recipes you don't have access to the global table yet which afaik is the only way to store data permanently.
I'll still upload a new version in a bit but that's just for some balancing, as it was the probability of recipes getting more expensive was a bit too high from my experience.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.3
Posted: Tue May 23, 2017 10:51 pm
by zxr
Hey, stumbled upon your mod today and I think I've got a fix for your issue.
Generating a new random number for each recipe in order based on the same initial seed means that when a mod adds/removes a recipe, all other recipes after that one will be assigned a different random number than they were previously. Instead, if you create a new seed for each recipe based on the recipes name and the random seed from the settings, each recipe will be assigned the same random number every time (regardless of order) assuming the random seed is unchanged.
Since math.randomseed expects a 32bit integer, we need to generate a 32bit integer hash from the item.name and rand_seed. CRC32 seems perfect for this, and theres an open source lua implementation available here.
All in all its only a few extra lines required. Here's how I did it (in data-final-fixes.lua):
require("config")
require("functions")
local crc32 = require("crc32") -- <== new require, use the crc32 library above or some other
rand_seed = settings.startup["keniras-random-recipes-random-seed"].value
rand_all = settings.startup["keniras-random-recipes-randomize-all"].value
rand_products = settings.startup["keniras-random-recipes-products"].value
local function reseed (recipeName) -- <== new function
local seed = crc32.Hash(recipeName .. tostring(rand_seed)) -- generate new seed based on recipe name and rand_seed
math.randomseed(seed)
end
-- ...bulk of code here... (can remove the math.randomseed initialization stuff here since we're reseeding for each recipe anyway)
if listed == true then
for _, recipe in pairs(item_recipes) do
if recipe then
reseed(item.name) -- <== new function call here
local ingredient_one = false
-- etc...
I tested it a few times adding/removing recipe-changing mods, and recipe numbers stayed the same and only changed when I changed the random seed, so it appears to work but more testing is probably required if you decide to go with this method.
I hadn't thought of that, that's a great idea! Thanks zxr, new version out.
@darkfrei: And you were apparently not the only one wanting this: Personally I got the idea from someone on reddit and thought "that can't be too hard to make into a mod"
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.4
Posted: Wed May 24, 2017 3:22 pm
by system
Wow, that was a fast fix! I'll try on new modpack that i'm making.
Indeed an easy fix, didn't take long to figure out that there's an upper limit for ingredient count which you could get over with that Yuoki recipe with 30k ingredients. Just a matter of checking for the random value to not exceed that limit.
Should be fixed in new version.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 5:20 am
by system
Thx again.
Is there way to blacklist recipes based on name or ingridient name or result name?
E.g. i want to blacklist all that contain any of these words:
"barrel", "unicomp", "empty", "fill", "water", "gas"
Barreling, yuoki unicomp, etc allow to convert resources from one to another, and often it generate possibility to make resource infinite.
E.g. 2 recipes:
79 oil to barrel
oil barrel to 115 oil
Another alternative would be somehow to set these values equal.
{
type = "string-setting",
name = "keniras-random-recipes-blacklist-extra",
setting_type = "startup",
default_value = "enrichment-process,uranium-process,-barrel,2uc-recipe,y-ac-uc2,y_uc2",
order = "e",
},
------------------------------
--extra blacklist
local function split_string(sep, csv)
local sep, fields = sep or ",", {}
local pattern = string.format("([^%s]+)", sep)
csv:gsub(pattern, function(c) fields[#fields+1] = c end)
return fields
end
recipe_blacklist_extra = split_string(settings.startup["keniras-random-recipes-blacklist-extra"].value, ",")
-- check all items set as "listed" so far if they're on the blacklist
if listed == true and blacklist_enabled == true then
for _, item_from_blacklist in pairs(recipe_blacklist_extra) do
if (item.name ~= nil and string.find(item.name,item_from_blacklist)) then
listed = false
end
end
end
Can't find what i'm doing wrong, but they are not blacklisted...
function split_string(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result;
end
But I gave up, as there are recipes with catalysts (ingredients that not consumed) and reusable (like slag slurry processing). Too hard to exclude short chain replications.
PS: few more ideas to randomize: inserter/belt speed, damage, produced energy.
Last time i had: 1 raw wood -> 5 wood, 1 wood -> 1 chest. Making chests almost best fuel in game
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 11:33 am
by Kenira
If nothing else excluding barreling seems like a good idea, those i already have working, with unicomp as ingredient or product i'm still struggling and not sure where my error is. I made it easier for myself to put the second blacklist in the config.lua like the regular blacklist so i don't even need a function to split the strings
As for your other suggestions, i'll include them since it's not much work, although by default deactivate them - at least personally, i think it can be challenge enough to figure out how to build things now without having to worry about if the result sucks on top of that. Also, you can't check these things before starting the game, so you might end up finding out blue belts are even slower than yellow belts later into the game. Same with inserters, if stack inserters are super slow they're suddenly completely useless. With just recipe ingredients and crafting time random, at least you can check your luck before actually starting your game (which i do). It would be a truly chaotic experience. Which now that i say it could be fun, at least once (and maybe without biters). Having said that, anything else you think would be fun to randomize? Robot energy, roboport charging ports / charging speed, assembly machine speed, beacon stats, module stats, radar range, mining speed, energy consumption of everything, pollution?
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 12:10 pm
by system
I prefer to drop-in replacement for newer version of mods, that is why i made list configurable through UI.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 6:04 pm
by Ranakastrasz
Shouldn't you use the map's seed for the seed?
Or is it not possible to retrieve it?
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 6:09 pm
by Kenira
That's not possible because you need the random seed at the very beginning when booting up the game, before you even get to the main menu and could load a map. Same for any other places where you think you could get a random number from, factorio is made to be deterministic. Plus i like it better so that with a given seed the random numbers will always be the same, even independant of other mods installed.
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 8:07 pm
by Kenira
New version up.
Added a new blacklist for keywords. Recipes will be searched for recipe name, ingredient names, and product names for these keywords and not randomize any that have these keywords anywhere. Currently only used for barrel to preserve barreling recipes, and Yuoki's unicomp to preserve trading. As with the regular blacklist items can easily be added yourself in the magical config.lua.
Probabilities are finally working as well, up to 2 products with a probability at least. That means uranium processing is now also randomized.
And finally, a ton of new features that can be toggled on and off individually (or also in bulk): Randomize inserter speed, belt speed, turret damage, weapon damage, energy usage, pollution produced, energy produced, accumulator capacity and power, reactor power, item fuel values, mining speed, assembling machine speed, furnace speed, module stats (for extra hilarity, i don't really recommend it with how silly that can get).
Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5
Posted: Thu May 25, 2017 8:56 pm
by Ranakastrasz
Kenira wrote:That's not possible because you need the random seed at the very beginning when booting up the game, before you even get to the main menu and could load a map. Same for any other places where you think you could get a random number from, factorio is made to be deterministic. Plus i like it better so that with a given seed the random numbers will always be the same, even independant of other mods installed.
Oh, right. Forgot about that. Yea, it wouldn't work since you can't get the seed on startup, only once you choose a map.
-- if an item has normal and expensive recipes, randomize both.
if item.normal and item.expensive then
item_recipes = { item.normal,
item.expensive,
}
else
item_recipes = { item,
}
end
-- if an item has normal and expensive recipes, randomize both.
if item.normal and item.expensive then
item_recipes = { item.normal,
item.expensive,
}
else
item_recipes = { item.normal,
}
end
Crash on startup in data-final-fixes.lua:135 -- bad argument to pairs (table expected, got nil) Taking a look at it myself. If I figure it out, I'll post private message you the new files.
EDIT:
Here's my modlist:
Factorissimo2
Fabrication
KenirasRandomRecipes
EDIT (again):
from looking through your code, I think it's from the second blacklist, although I'm not entirely sure