# How do I have multiple local functions interacting with one variable?

## Recommended Posts

Hello, it's me again.

The answer to this problem is most likely very simple, but alas, I am still quite new to the world of LUA and modding.

So I am making a character that gains sanity when near players, but loses it when near butterflies. I created two individual local functions for the two different effects.

Here is the code for each:

local function playersanfn(inst) --For gaining sanity near players
local x, y, z = inst.Transform:GetWorldPosition()
local delta = 0
local ents = TheSim:FindEntities(x, y, z, 30, {"player"})
for k, v in pairs(ents) do
if v ~= inst then
local bonus_sanity = TUNING.SANITYAURA_LARGE
local distsq = math.max(inst:GetDistanceSqToInst(v), 1)
delta = delta + bonus_sanity / distsq
end
end
return delta
end

local function butterflysanfn(inst) --For losing sanity near evil butterfly demons
local x, y, z = inst.Transform:GetWorldPosition()
local delta = 0
local ents = TheSim:FindEntities(x, y, z, 30, {"butterfly"})
for k, v in pairs(ents) do
if v ~= inst then
local bonus_sanity = TUNING.SANITYAURA_LARGE
local distsq = math.max(inst:GetDistanceSqToInst(v), 1)
delta = (delta + bonus_sanity / distsq) * -1
end
end
return delta
end

And they both work just fine, but I can only use one at a time by setting inst.components.sanity.custom_rate_fn to either:

inst.components.sanity.custom_rate_fn = playersanfn

OR

inst.components.sanity.custom_rate_fn = butterflysanfn

So my question is, how do I make them both interact with inst.components.sanity.custom_rate, so that my player can gain sanity from players and lose sanity from butterflies at the same time?

inst.components.sanity.custom_rate_fn = playersanfn + butterflysanfn

but my game crashes before I can load into the game. To be more clear as to what occured, I got past the loading screen, but the second that it finished and my character was in the world, I crashed.

I've also tried creating a separate local function, called totalsanityeffectfn, whose purpose is to switch in between the above functions (butterflysanfn and playersanfn) depending on whether or not there is a player around:

local function totalsanityeffectfn(inst)
local x, y, z = inst.Transform:GetWorldPosition()
local delta = 0
local ents = TheSim:FindEntities(x, y, z, 30, {"player"})
for k, v in pairs(ents) do
if v ~= inst then
local totalsanityeffectfn = sanityfn
else
local totalsanityeffectfn = butterflyfn
end
end
return delta
end

inst.components.sanity.custom_rate_fn = totalsanityeffectfn

but then neither playersanfn nor butterflysanfn work, and I neither gain nor lose sanity from players or butterflies. (but the game doesn't crash, which is a plus)

Previously, a user on these forums helped me learn how sanity aura works. Their name is DarkXero. I just thought i'd give credit where it's due.

I would be grateful for any help offered. Thanks!

And let me know if I can clarify anything.

##### Share on other sites

```local function sanityfn(inst)
local x, y, z = inst.Transform:GetWorldPosition()
local delta = 0
local ents = TheSim:FindEntities(x, y, z, 30, {"player", "butterfly"})
for k, v in pairs(ents) do
if v ~= inst then
local bonus_sanity = TUNING.SANITYAURA_LARGE
local distsq = math.max(inst:GetDistanceSqToInst(v), 1)
delta = (delta + bonus_sanity / distsq) * (v:HasTag("butterfly") and -1 or 1)
end
end
return delta
end

--
inst.components.sanity.custom_rate_fn = sanityfn```

Perhaps?

##### Share on other sites

Nope, it doesn't work, @alainmcd

The game didn't crash, but no sanity changes occured near butterflies or players.

However, I do appreciate that you are helping me at all, so thank you!

##### Share on other sites

This works:

```local function sanityfn(inst)
local x, y, z = inst.Transform:GetWorldPosition()
local delta = 0
local ents = TheSim:FindEntities(x, y, z, 30, nil, nil, {"player", "butterfly"})
for k, v in pairs(ents) do
if v ~= inst then
local bonus_sanity = TUNING.SANITYAURA_LARGE
local distsq = math.max(inst:GetDistanceSqToInst(v), 1)
delta = delta + bonus_sanity / distsq * (v:HasTag("butterfly") and -1 or 1)
end
end
return delta
end```

The fifth, sixth and seventh arguments to FindEntities are tags to look for if provided (AND, NOT and OR respectively), I mixed up the fifth and the seventh, so it was looking for entities with the "player" AND "butterfly" tags.

Also, this line in your butterflysanfn:

`delta = (delta + bonus_sanity / distsq) * -1`

probably doesn't work as you intended, your cummulative delta is multiplied by -1, so if there's an even number of butterflies within reach, you receive a positive sanity bonus. Fixed in the code above.

##### Share on other sites

Yup! Works perfectly.

Thank you so much, @alainmcd!