Page 1 of 1

### Weird saltpetre math Posted: Fri Jan 25, 2019 2:42 am
So I was curious about the effect of saltpetre on plants, specifically its effect on production stats
Code: Select all
`myseed.adjust_production(-round(salt/100)-prob(salt%100))myseed.adjust_potency(round(salt*0.5))`

so i wrote a quick python script to test values of this, using an interpretation of .dm's prob() function

Spoiler:
Code: Select all
`import randomdef splash(salt): #calculates one addition of a given amount of saltpetre    rng = random.randrange(1,101) #this block is just my recreation the prob() function    if rng < salt%100:        rng = 1    else:        rng = 0            prod_adj = (-round(salt/100)-rng)    pot_adj = round(salt*0.5)        return (prod_adj, pot_adj)for i in range(25,101,5): #i = the units tested, from 25 to 100 in steps of 5    avgProdList = [] #fills up with the test values for production changes, and potency changes go below    avgPotList = []    for j in range(50): #run each one 50 times, idunno        a = splash(i)         avgProdList.append(a)        avgPotList.append(a)    if len(avgProdList) > 1 and len(avgPotList) > 1: #conditional to avoid div by 0, calculates the average of each, prints em        avgProd = sum(avgProdList)/len(avgProdList)        avgPot = sum(avgPotList)/len(avgPotList)        print(i,"u: prod change = ",avgProd," | pot change = ",avgPot)    else:        pass`

which in short just tests every 5u interval a bunch of times and prints the avg effect on production and potency, but what I found gets really weird around the 100u mark

test outputs:
Spoiler:
Code: Select all
`25 u: prod change =  -0.08  | pot change =  12.030 u: prod change =  -0.32  | pot change =  15.035 u: prod change =  -0.26  | pot change =  18.040 u: prod change =  -0.38  | pot change =  20.045 u: prod change =  -0.4  | pot change =  22.050 u: prod change =  -0.44  | pot change =  25.055 u: prod change =  -1.5  | pot change =  28.060 u: prod change =  -1.56  | pot change =  30.065 u: prod change =  -1.6  | pot change =  32.070 u: prod change =  -1.62  | pot change =  35.075 u: prod change =  -1.76  | pot change =  38.080 u: prod change =  -1.78  | pot change =  40.085 u: prod change =  -1.78  | pot change =  42.090 u: prod change =  -1.96  | pot change =  45.095 u: prod change =  -1.98  | pot change =  48.0100 u: prod change =  -1.0  | pot change =  50.0`

do I have a poor understanding of the prob() math or is the original coding just bad??

### Re: Weird saltpetre math Posted: Fri Jan 25, 2019 3:20 am
100%100 is 0, so potloss with 100u is always round(100/100) [-1] - 0

It's just awful code

### Re: Weird saltpetre math Posted: Fri Jan 25, 2019 7:14 am
sound about right lol

### Re: Weird saltpetre math Posted: Fri Jan 25, 2019 11:51 am
You got the python wrong lol

(Round is the floor operation in byond)

### Re: Weird saltpetre math Posted: Sat Jan 26, 2019 2:11 am
4dplanner wrote:You got the python wrong lol

(Round is the floor operation in byond)

alright but what would have been the correct way of doing this?

### Re: Weird saltpetre math Posted: Sat Jan 26, 2019 3:50 pm
Code: Select all
`import randomimport math #for floor, can't remember if you need itdef splash(salt): #calculates one addition of a given amount of saltpetre    rng = random.randrange(0,100) #we want rng < 100 to be a 100% chance, rng < 1 to be a 1% chance etc    if rng < salt%100:        rng = 1    else:        rng = 0            prod_adj = (-math.floor(salt/100)-rng) #this is what was giving your weird result    pot_adj = round(salt*0.5)        return (prod_adj, pot_adj)for i in range(25,101,5): #i = the units tested, from 25 to 100 in steps of 5    avgProdList = [] #fills up with the test values for production changes, and potency changes go below    avgPotList = []    for j in range(5000): #gotta get that SAMPLE SIZE        a = splash(i)         avgProdList.append(a)        avgPotList.append(a)    if len(avgProdList) > 1 and len(avgPotList) > 1: #conditional to avoid div by 0, calculates the average of each, prints em        avgProd = sum(avgProdList)/len(avgProdList)        avgPot = sum(avgPotList)/len(avgPotList)        print(i,"u: prod change = ",avgProd," | pot change = ",avgPot)    else:        pass`

### Re: Weird saltpetre math Posted: Sun Jan 27, 2019 3:26 am
4dplanner wrote:
Code: Select all
`smart man stuff`

aite cool thx, next time I play botanist I'll test this out in game

### Re: Weird saltpetre math Posted: Tue Jan 29, 2019 1:34 pm
Alright update, tested it in game and found that 99u is indeed the best way to reduce production time, with 100u not doing anything outside of potency. Will make a new maffs function for this soon.

Update: I like the function y = round(-0.1 - 0.04x + 0.0005 x^2)
(y = prod change, x = saltp amount.)
Might add a prob into this for some RNG goodness.

This means that dumping gigantic amounts of saltpetre (above 50u at once, which is currently the ideal) will increase potency but have diminishing returns or even cause damage (90u+) to production speed.
This partially mirrors the effect of potassium nitrate irl, as a plant with an excessive amount of potassium ions in its soil/internal chemistry will have difficulty absorbing other nutrients such as nitrogen and magnesium.

### Re: Weird saltpetre math Posted: Sat Feb 02, 2019 10:09 pm
are you saying this crap is actually not crap

### Re: Weird saltpetre math Posted: Sun Feb 03, 2019 1:00 am
I've just tested and 100u definitely does work as intended.

### Re: Weird saltpetre math Posted: Sun Feb 03, 2019 1:01 am
Basically this doesn't need changing, it works fine