Page 1 of 5

[MOD 0.18.x] KenirasRandomRecipes

Posted: Sat May 06, 2017 4:58 pm
by Kenira
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

Mod Portal Link

Long description
Mod compatibility
Known Issues

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):

Code: Select all

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.

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.3

Posted: Tue May 23, 2017 11:06 pm
by darkfrei
Thanks! It was my suggestion :)
viewtopic.php?f=33&t=41569

If you need your number generator, I've write this in excel. The seed must be not integer, but rational / irrational.
Rnd_01.xlsx
(110.4 KiB) Downloaded 198 times

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.3

Posted: Wed May 24, 2017 7:13 am
by Kenira
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.

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.4

Posted: Wed May 24, 2017 3:43 pm
by system

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.4

Posted: Wed May 24, 2017 5:32 pm
by Kenira
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.

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5

Posted: Thu May 25, 2017 6:53 am
by system
Something like:

Code: Select all

   {
    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...

Re: [MOD 0.15.x] KenirasRandomRecipes 0.0.5

Posted: Thu May 25, 2017 11:23 am
by system
This split function actually works :)

Code: Select all

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 :D

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 :P

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? :P

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.

Re: [MOD 0.15.x] KenirasRandomRecipes 1.0.0

Posted: Thu May 25, 2017 9:44 pm
by FuzzCat927
EDIT:

Code: Select all

	-- 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
should be

Code: Select all

	-- 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