The negative effects stack and sometimes may get extremely large, e.g. 200 turns of poison. Maybe, something softer might be better?
I.e. Let's imagine, snake has 80 turns of poison. This is normal. However, as player gets poisoned twice, those become 160 turns of poison. Next 240 which almost means stop to the dungeon exploration and retreat to surface to wait it wear off. Setting snake's poison to 20 will make it hardly mean anything.
So, how about "Result = NewValue + OldValue/2". This way:
Snake poisons player: duration = 60;
Snake poisons player second time: duration = 60+60/2 = 90
Snake poisons player third time: duration = 60+90/2 = 105
and fourth time: duration = 60 + 105/2 = 112 which is close to "saturation" and will not get larger than 2*60.
If some creatures will have same effect but different value, then the formula may be changed:"Result = OldValue + NewValue * NewValue / (OldValue + NewValue)".
i.e. if character with 100 units of poison gets poisoned again by 40-unit poison then new poison level will be 112. And if the same character will get poisoned by 80-unit poison, it'll become 135. So, let's try for 60-unit snake poison:
Snake poisons player first time: 60; second time: 90 (+30); third time: 114 (+24); fourth time: 135 (+21); fifth: 153 (+18) instead of 300.
This one gets to saturation slower, but still better. The formula may be adjusted with some coefficient: "Result = OldValue + NewValue * NewValue / (OldValue * Coef + NewValue)". Let's try Coef=2 then:
First: 60; Second: 80(+20); Third: 96(+16); Fourth: 110(+14).
Or same for Coef=3:
First: 60; Second: 75(+15); Third: 88(+13); Fourth: 99(+11) instead of 240.
This way while the poison (or Hex, Confusion or any other status) will accumulate almost indefinitely, it'll accumulate much slower.
I made some change with my last commit:
If duration > oldValue/2 then newValue = duration + oldValue/2
Else newValue = oldValue + 10
Let me know how thid does works for you.