For several months this has been bugging me, and finally It was called out as an issue on my game. I did a test using several of the handler object calls which use:
Code:
if (!number) {
  number = #
  num = get_number(&name);
}
 
I took out number = get_number(&t) and put NULL for all the spell calls in do_cast(). I was curious to see if in fact this bit of code actually worked. The reason i say this is because "num" is not referenced at all after this bit of code. If number is being referenced in the following:
Code:
struct obj_data *get_obj_in_list_vis(struct char_data *ch, char *name, int *number, struct obj_data *list)
{
  struct obj_data *i;
  int num;
  if (!list || !*name || !name)
   return NULL;
  if (!number) {
    number = #
    num = get_number(&name);
  }
  if (*number == 0)
    return (NULL);
  for (i = list; i && *number; i = i->next_content)
    if (is_name(name, i->name))
      if (CAN_SEE_OBJ(ch, i))
        if (--(*number) == 0)
          return (i);
  return NULL;
}
 
Upon doing this we tried cast 'remove curse' 2.rock and 3.rock and it did not work. I logged and was proven correct, number stays at 1.
Cunning: cast 'remove curse' 2.stone
GET_OBJ_IN_LIST: num = 1
GET_OBJ_IN_LIST: number = 1, num = 1
GET_NUMBER: number = 2
GET_OBJ_IN_LIST: num = 1
GET_OBJ_IN_LIST: number = 1, num = 1
My point is that we do all that work when we send NULL into a function, and we calculate that value for num and we never transfer it to number. We assign the value of num to number before we even calculate get_number() and assign it to num. I think we should update all these calls in handler.c to the following:
Code:
if (!number) {
    num = get_number(&name);
    number = #
  }
 
Take into account the overlap Thomas and I have discussed a few times in another thread with my change to get_number()
Code:
int get_number(char **name)
{
  int i;
  char number[MAX_INPUT_LENGTH], *ppos;
  /*
   * These lines was added to make possible the dot sign to be used as a magic
   * char on isname() function.
   */
  if (!isdigit(**name))
    return (1);
  *number = '\0';
  if ((ppos = strchr(*name, '.'))) {
    *ppos++ = '\0';
    strlcpy(number, *name, sizeof(number));
    memmove(*name, ppos, strlen(ppos) +1); <======== This corrects the string overlap
    for (i = 0; *(number + i); i++)
      if (!isdigit(*(number + i)))
        return (0);
    return (atoi(number));
  }
  return (1);
}