// Add a new item to a list or increase quantity if already in the list void List::add(size_t over_item_number, int image_id, Uint16 id, int quantity) { do_drop_item_sound(); // Add to quanity if already in list // if new item has proper ID, try to use it if (id != unset_item_uid) { // match only against items with the same id for (size_t i=0; i<quantities.size(); ++i) if (item_ids[i] == id) { quantities[i] += quantity; return; } // or with items that don't have a proper id but do match the image for (size_t i=0; i<quantities.size(); ++i) if ((item_ids[i] == unset_item_uid) && (image_ids[i] == image_id)) { quantities[i] += quantity; return; } } // if the new items does not have a proper id, just look for a matching image id else { for (size_t i=0; i<quantities.size(); ++i) if (image_ids[i] == image_id) { quantities[i] += quantity; return; } } // otherwise insert the new item or add it to the end if (over_item_number < get_num_items()) { image_ids.insert(image_ids.begin()+over_item_number, image_id); item_ids.insert(item_ids.begin()+over_item_number, id); quantities.insert(quantities.begin()+over_item_number, quantity); } else { image_ids.push_back(image_id); item_ids.push_back(id); quantities.push_back(quantity); } }
int click_storage_handler(window_info * win, int mx, int my, Uint32 flags) { if(flags&ELW_WHEEL_UP) { if(mx>10 && mx<130) { vscrollbar_scroll_up(storage_win, STORAGE_SCROLLBAR_CATEGORIES); } else if(mx>150 && mx<352){ vscrollbar_scroll_up(storage_win, STORAGE_SCROLLBAR_ITEMS); } } else if(flags&ELW_WHEEL_DOWN) { if(mx>10 && mx<130) { vscrollbar_scroll_down(storage_win, STORAGE_SCROLLBAR_CATEGORIES); } else if(mx>150 && mx<352){ vscrollbar_scroll_down(storage_win, STORAGE_SCROLLBAR_ITEMS); } } else if ( (flags & ELW_MOUSE_BUTTON) == 0) { return 0; } else { if(my>10 && my<202){ if(mx>10 && mx<130){ int cat=-1; cat=(my-20)/13 + vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES); move_to_category(cat); do_click_sound(); } else if(mx>150 && mx<352){ if(view_only_storage && item_dragged!=-1 && left_click){ drop_fail_time = SDL_GetTicks(); do_alert1_sound(); } else if(!view_only_storage && item_dragged!=-1 && left_click){ Uint8 str[6]; str[0]=DEPOSITE_ITEM; str[1]=item_list[item_dragged].pos; *((Uint32*)(str+2))=SDL_SwapLE32(item_quantity); my_tcp_send(my_socket, str, 6); do_drop_item_sound(); if(item_list[item_dragged].quantity<=item_quantity) item_dragged=-1;//Stop dragging this item... } else if(right_click || (view_only_storage && left_click)){ storage_item_dragged=-1; item_dragged=-1; if(cur_item_over!=-1) { Uint8 str[3]; str[0]=LOOK_AT_STORAGE_ITEM; *((Uint16*)(str+1))=SDL_SwapLE16(storage_items[cur_item_over].pos); my_tcp_send(my_socket, str, 3); active_storage_item=storage_items[cur_item_over].pos; do_click_sound(); } } else if(!view_only_storage && cur_item_over!=-1){ storage_item_dragged=cur_item_over; active_storage_item=storage_items[cur_item_over].pos; do_drag_item_sound(); } } } } return 1; }
int click_ground_items_handler(window_info *win, int mx, int my, Uint32 flags) { int pos; Uint8 str[10]; int right_click = flags & ELW_RIGHT_MOUSE; int ctrl_on = flags & ELW_CTRL; int yoffset = get_window_scroll_pos(win->window_id); // only handle mouse button clicks, not scroll wheels moves if ( (flags & ELW_MOUSE_BUTTON) == 0) { return 0; } if(right_click) { if(item_dragged != -1) { item_dragged = -1; } else if(item_action_mode == ACTION_LOOK) { item_action_mode = ACTION_WALK; } else { item_action_mode = ACTION_LOOK; } return 1; } // see if we clicked on the "Get All" box if(mx>(win->len_x-GRIDSIZE) && mx<win->len_x && my>ELW_BOX_SIZE && my<GRIDSIZE+ELW_BOX_SIZE){ pick_up_all_items(); do_get_item_sound(); return 1; } pos = (my<0) ?-1 :get_mouse_pos_in_grid(mx,my+yoffset+1,ground_items_grid_cols,ground_items_grid_rows,0,0,GRIDSIZE,GRIDSIZE); if(pos==-1 || pos>=ITEMS_PER_BAG){ } else if(!ground_item_list[pos].quantity) { if (item_dragged != -1){ str[0] = DROP_ITEM; str[1] = item_dragged; *((Uint32 *) (str + 2)) = SDL_SwapLE32(item_quantity); my_tcp_send(my_socket, str, 6); do_drop_item_sound(); } } else if(item_action_mode==ACTION_LOOK) { str[0]= LOOK_AT_GROUND_ITEM; str[1]= ground_item_list[pos].pos; my_tcp_send(my_socket,str,2); } else { int quantity; quantity= ground_item_list[pos].quantity; if(quantity > item_quantity && !ctrl_on) quantity= item_quantity; str[0]= PICK_UP_ITEM; str[1]= ground_item_list[pos].pos; *((Uint32 *)(str+2))= SDL_SwapLE32(quantity); my_tcp_send(my_socket,str,6); do_get_item_sound(); } return 1; }