i=0;
while (i < size) {
- /* zero weight items get 0 length straws! */
- if (weights[reverse[i]] == 0) {
- bucket->straws[reverse[i]] = 0;
+ if (map->straw_calc_version == 0) {
+ /* zero weight items get 0 length straws! */
+ if (weights[reverse[i]] == 0) {
+ bucket->straws[reverse[i]] = 0;
+ i++;
+ continue;
+ }
+
+ /* set this item's straw */
+ bucket->straws[reverse[i]] = straw * 0x10000;
+ dprintk("item %d at %d weight %d straw %d (%lf)\n",
+ bucket->h.items[reverse[i]],
+ reverse[i], weights[reverse[i]],
+ bucket->straws[reverse[i]], straw);
i++;
- continue;
- }
+ if (i == size)
+ break;
- /* set this item's straw */
- bucket->straws[reverse[i]] = straw * 0x10000;
- dprintk("item %d at %d weight %d straw %d (%lf)\n",
- bucket->h.items[reverse[i]],
- reverse[i], weights[reverse[i]],
- bucket->straws[reverse[i]], straw);
- i++;
- if (i == size) break;
-
- /* same weight as previous? */
- if (weights[reverse[i]] == weights[reverse[i-1]]) {
- /*dprintk("same as previous\n");*/
- continue;
- }
+ /* same weight as previous? */
+ if (weights[reverse[i]] == weights[reverse[i-1]]) {
+ dprintk("same as previous\n");
+ continue;
+ }
- /* adjust straw for next guy */
- wbelow += ((double)weights[reverse[i-1]] - lastw) * numleft;
- for (j=i; j<size; j++)
- if (weights[reverse[j]] == weights[reverse[i]])
- numleft--;
- else
+ /* adjust straw for next guy */
+ wbelow += ((double)weights[reverse[i-1]] - lastw) *
+ numleft;
+ for (j=i; j<size; j++)
+ if (weights[reverse[j]] == weights[reverse[i]])
+ numleft--;
+ else
+ break;
+ wnext = numleft * (weights[reverse[i]] -
+ weights[reverse[i-1]]);
+ pbelow = wbelow / (wbelow + wnext);
+ dprintk("wbelow %lf wnext %lf pbelow %lf numleft %d\n",
+ wbelow, wnext, pbelow, numleft);
+
+ straw *= pow((double)1.0 / pbelow, (double)1.0 /
+ (double)numleft);
+
+ lastw = weights[reverse[i-1]];
+ } else if (map->straw_calc_version >= 1) {
+ /* zero weight items get 0 length straws! */
+ if (weights[reverse[i]] == 0) {
+ bucket->straws[reverse[i]] = 0;
+ i++;
+ continue;
+ }
+
+ /* set this item's straw */
+ bucket->straws[reverse[i]] = straw * 0x10000;
+ dprintk("item %d at %d weight %d straw %d (%lf)\n",
+ bucket->h.items[reverse[i]],
+ reverse[i], weights[reverse[i]],
+ bucket->straws[reverse[i]], straw);
+ i++;
+ if (i == size)
break;
- wnext = numleft * (weights[reverse[i]] - weights[reverse[i-1]]);
- pbelow = wbelow / (wbelow + wnext);
- dprintk("wbelow %lf wnext %lf pbelow %lf numleft %d\n",
- wbelow, wnext, pbelow, numleft);
- straw *= pow((double)1.0 / pbelow, (double)1.0 / (double)numleft);
+ /* same weight as previous? */
+ if (weights[reverse[i]] == weights[reverse[i-1]]) {
+ dprintk("same as previous\n");
+ continue;
+ }
- lastw = weights[reverse[i-1]];
+ /* adjust straw for next guy */
+ wbelow += ((double)weights[reverse[i-1]] - lastw) *
+ numleft;
+ for (j=i; j<size; j++)
+ if (weights[reverse[j]] == weights[reverse[i]])
+ numleft--;
+ else
+ break;
+ wnext = numleft * (weights[reverse[i]] -
+ weights[reverse[i-1]]);
+ pbelow = wbelow / (wbelow + wnext);
+ dprintk("wbelow %lf wnext %lf pbelow %lf numleft %d\n",
+ wbelow, wnext, pbelow, numleft);
+
+ straw *= pow((double)1.0 / pbelow, (double)1.0 /
+ (double)numleft);
+
+ lastw = weights[reverse[i-1]];
+ }
}
free(reverse);