afisakov
You can change this now in User CP.
- Reaction score
- 37
I am working on a map that has several bosses drop a random class-specific drop. Since there are 12 classes there is a 1/12 chance that a drop for your class will randomly appear and these bosses respawn.
However, in reality the nature of rng makes it that killing the same boss 12x does not guarantee you will get your drop and can sometimes take over 20 attempts.
(11/12)^12 has a 35% chance of not dropping what you want
(11/12)^20 has 17.5% chance of still failing which feels horrible to players
SO what I am trying to do is use hashtables to build a 'memory' into the drop trigger so it cannot repeat any of the last 6 drops. That way if you fail a couple of times the odds of a success start going up and getting 12+ fails becomes alot less likely.
Unfortunately it does not seem to be working properly and sometimes drops no item or repeats an item within 6 attempts. I posted the code below and am looking for advice on either fixing my code or how to do this better.
Thanks in advance for the help.
on initialize
However, in reality the nature of rng makes it that killing the same boss 12x does not guarantee you will get your drop and can sometimes take over 20 attempts.
(11/12)^12 has a 35% chance of not dropping what you want
(11/12)^20 has 17.5% chance of still failing which feels horrible to players
SO what I am trying to do is use hashtables to build a 'memory' into the drop trigger so it cannot repeat any of the last 6 drops. That way if you fail a couple of times the odds of a success start going up and getting 12+ fails becomes alot less likely.
Unfortunately it does not seem to be working properly and sometimes drops no item or repeats an item within 6 attempts. I posted the code below and am looking for advice on either fixing my code or how to do this better.
Thanks in advance for the help.
Code:
function Charspecificdrop takes integer gtype, real x, real y returns nothing
local integer i=1
local integer rand=GetRandomInt(1,12)
loop
exitwhen i>6
if LoadInteger(rv,6,gtype*10+i)==rand then
set rand=GetRandomInt(1,12)
set i=0
call DisplayTextToPlayer(GetLocalPlayer(),0,0,"rerolled drop")
endif
set i=i+i
endloop
set i=LoadInteger(rv,6,gtype*10+9)
if i<1 or i>5 then
set i=1
else
set i=i+1
endif
call SaveInteger(rv,6,gtype*10+9,i)
call DisplayTextToPlayer(GetLocalPlayer(),0,0,"drop # "+I2S(i)+", r "+I2S(rand))
call SaveInteger(rv,6,gtype*10+i,rand)
call CreateItem(jX[LoadInteger(rv,6,gtype*10)+rand],x,y)
endfunction
Code:
set i=0
loop
exitwhen i>40
call SaveInteger(rv,6,i,0)
set i=i+1
endloop
call SaveInteger(rv,6,0,350-1) //refers to original spots in array that random item spawned from
call SaveInteger(rv,6,10,260-1)
call SaveInteger(rv,6,20,275-1)
call SaveInteger(rv,6,30,335-1)