… | |
… | |
118 | sint64 omin = r_min; |
118 | sint64 omin = r_min; |
119 | sint64 range = max (0, r_max - r_min + 1); |
119 | sint64 range = max (0, r_max - r_min + 1); |
120 | int base = range > 2 ? 20 : 50; /* d2 and d3 are corner cases */ |
120 | int base = range > 2 ? 20 : 50; /* d2 and d3 are corner cases */ |
121 | |
121 | |
122 | /* |
122 | /* |
123 | * Make a call to get two 32 bit unsigned random numbers, and just to |
123 | * Make a call to get two 32 bit unsigned random numbers, and just do |
124 | * a little bitshifting. |
124 | * a little bitshifting. |
125 | */ |
125 | */ |
126 | sint64 ran = (sint64) rndm.next () ^ ((sint64) rndm.next () << 31); |
126 | sint64 ran = (sint64) rndm.next () ^ ((sint64) rndm.next () << 31); |
127 | |
127 | |
128 | if (op->type != PLAYER) |
128 | if (op->stats.luck) |
129 | return ((ran % range) + r_min); |
129 | { |
130 | |
|
|
131 | int luck = op->stats.luck; |
130 | int luck = op->stats.luck; |
132 | |
131 | |
133 | if (rndm (base) < min (10, abs (luck))) |
132 | if (rndm (base) < min (10, abs (luck))) |
134 | { |
133 | { |
135 | /* we have a winner */ |
134 | /* we have a winner */ |
136 | ((luck > 0) ? (luck = 1) : (luck = -1)); |
135 | luck = luck > 0 ? 1 : -1; |
|
|
136 | |
137 | range -= luck; |
137 | range -= luck; |
138 | if (range < 1) |
138 | if (range < 1) |
139 | return (omin); /*check again */ |
139 | return omin; /*check again */ |
140 | |
140 | |
141 | ((goodbad) ? (r_min += luck) : (range)); |
141 | if (goodbad) |
|
|
142 | r_min += luck; |
142 | |
143 | |
143 | return (max (omin, min (r_max, (ran % range) + r_min))); |
144 | return (max (omin, min (r_max, (ran % range) + r_min))); |
|
|
145 | } |
144 | } |
146 | } |
145 | |
147 | |
146 | return ran % range + r_min; |
148 | return ran % range + r_min; |
147 | } |
149 | } |
148 | |
150 | |