static int recipe_controls_click_handler(int mx, int my, Uint32 flags){ int wpx=SLOT_SIZE*NUM_MIX_SLOTS+2; int wpy=manufacture_menu_y_len-37; int lpx=18; int lpy=SLOT_SIZE; if (mx>wpx&&mx<wpx+lpx&&my>wpy+lpy-10&&my<wpy+lpy){ //arrow if (flags & ELW_WHEEL_UP) { cur_recipe=(cur_recipe-1+num_recipe_entries)%num_recipe_entries; use_recipe(cur_recipe); } else if (flags & ELW_WHEEL_DOWN) { cur_recipe=(cur_recipe+1)%num_recipe_entries; use_recipe(cur_recipe); } else { //normal click toggle_recipe_window(); } build_manufacture_list(); do_click_sound(); } else if (mx>wpx+3&&mx<wpx+lpx-3&&my>wpy&&my<wpy+15){ //+ button copy_recipe_from_manu_list(recipes_store[cur_recipe].items); clear_recipe_name(cur_recipe); build_manufacture_list(); do_click_sound(); // save recipes to disk to avoid loss on disconnects/crashes save_recipes(); } return 0; }
//CLICK HANDLERS int recipe_dropdown_click_handler(window_info *win, int mx, int my, Uint32 flags){ static int last_clicked=0; static int last_recipe=0; if (flags & ELW_WHEEL_UP) { cur_recipe=(cur_recipe-1+SHOW_MAX_RECIPE)%SHOW_MAX_RECIPE; } else if (flags & ELW_WHEEL_DOWN) { cur_recipe=(cur_recipe+1)%SHOW_MAX_RECIPE; } else { //normal click select_window(recipe_win); cur_recipe=my/(33+1); if ( ((SDL_GetTicks() - last_clicked) < 400)&& last_recipe==cur_recipe){ //double click on the same recipe to select it and close the dropdown use_recipe(cur_recipe); recipes_shown=0; hide_window(recipe_win); } last_clicked = SDL_GetTicks(); } build_manufacture_list(); last_recipe = cur_recipe; do_click_sound(); return 1; }
int clear_handler() { int i; for(i=0; i<6; i++) manu_recipe[i].quantity= manu_recipe[i].image_id= 0; // clear the recipe build_manufacture_list(); return 1; }
static int clear_handler() { int i; for(i=0; i<NUM_MIX_SLOTS; i++) manu_recipe.items[i].quantity= manu_recipe.items[i].image_id= 0; // clear the recipe build_manufacture_list(); return 1; }
/* select the specified recipe and and make sure the window is hidden */ static void select_recipe(int the_recipe) { cur_recipe = the_recipe; use_recipe(cur_recipe); recipes_shown=0; clear_recipe_filter(); hide_window(recipe_win); build_manufacture_list(); }
static int clear_handler() { int i; // clear the recipe for(i=0; i<NUM_MIX_SLOTS; i++) manu_recipe.items[i].quantity = manu_recipe.items[i].image_id = manu_recipe.items[i].id = 0; build_manufacture_list(); last_changed_slot = -1; return 1; }
int recipe_controls_click_handler(int mx, int my, Uint32 flags){ int i; int wpx=33*6+2; int wpy=manufacture_menu_y_len-37; int lpx=18; int lpy=33; if (mx>wpx&&mx<wpx+lpx&&my>wpy+lpy-10&&my<wpy+lpy){ //arrow if (flags & ELW_WHEEL_UP) { cur_recipe=(cur_recipe-1+SHOW_MAX_RECIPE)%SHOW_MAX_RECIPE; use_recipe(cur_recipe); } else if (flags & ELW_WHEEL_DOWN) { cur_recipe=(cur_recipe+1)%SHOW_MAX_RECIPE; use_recipe(cur_recipe); } else { //normal click recipes_shown=!recipes_shown; } build_manufacture_list(); if (recipes_shown) show_window(recipe_win); else hide_window(recipe_win); do_click_sound(); } else if (mx>wpx+3&&mx<wpx+lpx-3&&my>wpy&&my<wpy+15){ //+ button //copy the recipe for(i=36;i<36+6;i++) recipes[cur_recipe][i-36]=manufacture_list[i]; clear_recipe_name(cur_recipe); build_manufacture_list(); do_click_sound(); // save recipes to disk to avoid loss on disconnects/crashes save_recipes(); } return 0; }
static int recipe_controls_click_handler(window_info *win, int mx, int my, Uint32 flags){ int wpx=pipeline_x + SLOT_SIZE*NUM_MIX_SLOTS; int wpy=manufacture_menu_y_len-recipe_y_offset; int lpx=PIPE_CONTROL_X; int lpy=SLOT_SIZE; if (!recipes_loaded) return 0; if (mx>wpx && mx<wpx+lpx && my>wpy+lpy-control_elem_size*2 && my<wpy+lpy){ //arrow if (flags & ELW_WHEEL_UP) { cur_recipe=(cur_recipe-1+num_recipe_entries)%num_recipe_entries; use_recipe(cur_recipe); } else if (flags & ELW_WHEEL_DOWN) { cur_recipe=(cur_recipe+1)%num_recipe_entries; use_recipe(cur_recipe); } else { //normal click toggle_recipe_window(); } build_manufacture_list(); do_click_sound(); } else if (mx>wpx+win->small_font_len_x/2 && mx<wpx+lpx-win->small_font_len_x/2 && my>wpy && my<wpy+win->small_font_len_y){ //+ button copy_recipe_from_manu_list(recipes_store[cur_recipe].items); clear_recipe_name(cur_recipe); build_manufacture_list(); do_click_sound(); // save recipes to disk to avoid loss on disconnects/crashes save_recipes(); } return 0; }
int mix_handler(Uint8 quantity, const char* empty_error_str) { Uint8 str[32]; int items_no=0; int i; int cannot_manu = 1; if(manufacture_win < 0) build_manufacture_list(); for(i=MIX_SLOT_OFFSET;i<MIX_SLOT_OFFSET+NUM_MIX_SLOTS;i++) if(manufacture_list[i].quantity > 0) { cannot_manu = 0; break; } if (cannot_manu) { set_shown_string(c_red2, empty_error_str); return 1; } str[0]=MANUFACTURE_THIS; for(i=MIX_SLOT_OFFSET;i<MIX_SLOT_OFFSET+NUM_MIX_SLOTS;i++){ if(manufacture_list[i].quantity > 0){ str[items_no*3+2]=manufacture_list[i].pos; *((Uint16 *)(str+items_no*3+2+1))=SDL_SwapLE16(manufacture_list[i].quantity); items_no++; } } str[1]=items_no; if(items_no){ //don't send an empty string save_last_mix(); str[items_no*3+2]= quantity; my_tcp_send(my_socket,str,items_no*3+3); } return 1; }
static int click_manufacture_handler(window_info *win, int mx, int my, Uint32 flags) { int pos; Uint8 str[100]; int quantitytomove=1; if ((flags & ELW_CTRL) || (flags & ELW_SHIFT) || (flags & ELW_ALT)) quantitytomove = 10; /* if the eye cursor is active and we right click, change to standard walk */ if(action_mode==ACTION_LOOK && (flags&ELW_RIGHT_MOUSE)) action_mode = ACTION_WALK; //see if we clicked on any item in the main category pos=get_mouse_pos_in_grid(mx, my, GRID_COLS, GRID_ROWS, 0, 0, SLOT_SIZE, SLOT_SIZE); if (pos >= 0 && manufacture_list[pos].quantity > 0) { if(action_mode==ACTION_LOOK || (flags&ELW_RIGHT_MOUSE)) { str[0]=LOOK_AT_INVENTORY_ITEM; str[1]=manufacture_list[pos].pos; my_tcp_send(my_socket,str,2); return 1; } else { int j; last_changed_slot=-1; for(j=MIX_SLOT_OFFSET;j<MIX_SLOT_OFFSET+NUM_MIX_SLOTS;j++) if(manufacture_list[j].pos==manufacture_list[pos].pos && manufacture_list[j].quantity > 0){ //found an empty space in the "production pipe" if (flags & ELW_WHEEL_UP) { if (manufacture_list[j].quantity < quantitytomove) quantitytomove = -manufacture_list[j].quantity; else quantitytomove*=-1; } else if (manufacture_list[pos].quantity < quantitytomove) quantitytomove = manufacture_list[pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[pos].pos; manufacture_list[j].image_id=manufacture_list[pos].image_id; manufacture_list[j].id=manufacture_list[pos].id; manufacture_list[pos].quantity -= quantitytomove; copy_recipe_from_manu_list(manu_recipe.items); do_click_sound(); return 1; } for(j=MIX_SLOT_OFFSET;j<MIX_SLOT_OFFSET+NUM_MIX_SLOTS;j++) if(manufacture_list[j].quantity <= 0){ //found an empty space in the "production pipe" if (flags & ELW_WHEEL_UP) return 1; //quantity already 0 in production pipeline if (manufacture_list[pos].quantity < quantitytomove) quantitytomove = manufacture_list[pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[pos].pos; manufacture_list[j].image_id=manufacture_list[pos].image_id; manufacture_list[j].id=manufacture_list[pos].id; manufacture_list[pos].quantity -= quantitytomove; copy_recipe_from_manu_list(manu_recipe.items); do_click_sound(); return 1; } } } else if (pos>=0) last_changed_slot=-1; //see if we clicked on any item from the "production pipe" pos=get_mouse_pos_in_grid(mx, my, NUM_MIX_SLOTS, 1, pipeline_x, manufacture_menu_y_len-recipe_y_offset, SLOT_SIZE, SLOT_SIZE); if (pos >= 0 && manufacture_list[MIX_SLOT_OFFSET+pos].quantity > 0) { if(action_mode==ACTION_LOOK || (flags&ELW_RIGHT_MOUSE)){ str[0]=LOOK_AT_INVENTORY_ITEM; str[1]=manufacture_list[MIX_SLOT_OFFSET+pos].pos; my_tcp_send(my_socket,str,2); return 1; } else { int j; last_changed_slot=pos; for(j=0;j<MIX_SLOT_OFFSET;j++) if(manufacture_list[j].quantity && manufacture_list[j].pos==manufacture_list[MIX_SLOT_OFFSET+pos].pos){ //found item in ingredients slot, move from "production pipe" back to this slot if (flags & ELW_WHEEL_DOWN) { if (manufacture_list[MIX_SLOT_OFFSET+pos].quantity < quantitytomove) quantitytomove = -manufacture_list[MIX_SLOT_OFFSET+pos].quantity; else quantitytomove*=-1; } else if (manufacture_list[MIX_SLOT_OFFSET+pos].quantity < quantitytomove) quantitytomove = manufacture_list[MIX_SLOT_OFFSET+pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[MIX_SLOT_OFFSET+pos].pos; manufacture_list[j].image_id=manufacture_list[MIX_SLOT_OFFSET+pos].image_id; manufacture_list[j].id=manufacture_list[MIX_SLOT_OFFSET+pos].id; manufacture_list[MIX_SLOT_OFFSET+pos].quantity -= quantitytomove; copy_recipe_from_manu_list(manu_recipe.items); do_click_sound(); return 1; } for(j=0;j<MIX_SLOT_OFFSET;j++) if(!manufacture_list[j].quantity){ //found item in ingredients slot, move from "production pipe" back to this slot if (manufacture_list[MIX_SLOT_OFFSET+pos].quantity < quantitytomove) quantitytomove = manufacture_list[MIX_SLOT_OFFSET+pos].quantity; //handles mouse wheel if (flags & ELW_WHEEL_DOWN) return 1; //No more items to put in production pipe manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[MIX_SLOT_OFFSET+pos].pos; manufacture_list[j].image_id=manufacture_list[MIX_SLOT_OFFSET+pos].image_id; manufacture_list[j].id=manufacture_list[MIX_SLOT_OFFSET+pos].id; manufacture_list[MIX_SLOT_OFFSET+pos].quantity -= quantitytomove; copy_recipe_from_manu_list(manu_recipe.items); do_click_sound(); return 1; } } } else if (pos>=0) { //click on an empty slot //handle the mouse wheel if (recipes_loaded && (pos!=last_changed_slot)) { if (((flags&ELW_WHEEL_UP)||(flags&ELW_WHEEL_DOWN)) && recipe_win >= 0 && recipe_win < windows_list.num_windows) { //simulate a click on the dropdown last_changed_slot=-1; recipe_dropdown_click_handler(&windows_list.window[recipe_win],0,0,flags); use_recipe(cur_recipe); build_manufacture_list(); } else { toggle_recipe_window(); } do_click_sound(); return 0; } } else last_changed_slot=-1; //see if we clicked on the recipe handler recipe_controls_click_handler(win,mx,my,flags); // clear the message area if double-clicked if ((my > manufacture_menu_y_len-text_y_offset) && my < (manufacture_menu_y_len-recipe_y_offset)) { static Uint32 last_click = 0; if (safe_button_click(&last_click)) { set_shown_string(0,""); return 1; } } return 0; }
void display_manufacture_menu() { if(manufacture_win < 0){ int our_root_win = -1; if (!windows_on_top) { our_root_win = game_root_win; } manufacture_win= create_window(win_manufacture, our_root_win, 0, manufacture_menu_x, manufacture_menu_y, 0, 0, ELW_USE_UISCALE|ELW_WIN_DEFAULT); set_window_handler(manufacture_win, ELW_HANDLER_DISPLAY, &display_manufacture_handler ); set_window_handler(manufacture_win, ELW_HANDLER_CLICK, &click_manufacture_handler ); set_window_handler(manufacture_win, ELW_HANDLER_MOUSEOVER, &mouseover_manufacture_slot_handler ); set_window_handler(manufacture_win, ELW_HANDLER_KEYPRESS, &keypress_manufacture_handler ); set_window_handler(manufacture_win, ELW_HANDLER_UI_SCALE, &ui_scale_manufacture_handler ); mixone_button_id=button_add_extended(manufacture_win, mixone_button_id, NULL, 0, 0, 0, 0, 0, 1.0f, 0.77f, 0.57f, 0.39f, ">"); widget_set_OnClick(manufacture_win, mixone_button_id, mixone_handler); widget_set_OnMouseover(manufacture_win, mixone_button_id, mouseover_mixone_handler); mixall_button_id=button_add_extended(manufacture_win, mixall_button_id, NULL, 0, 0, 0, 0, 0, 1.0f, 0.77f, 0.57f, 0.39f, ">>"); widget_set_OnClick(manufacture_win, mixall_button_id, mixall_handler); widget_set_OnMouseover(manufacture_win, mixall_button_id, mouseover_mixall_handler); clear_button_id=button_add_extended(manufacture_win, clear_button_id, NULL, 0, 0, 0, 0, 0, 1.0f, 0.77f, 0.57f, 0.39f, clear_str); widget_set_OnClick(manufacture_win, clear_button_id, clear_handler); if ((manufacture_win > -1) && (manufacture_win < windows_list.num_windows)) { cm_add(windows_list.window[manufacture_win].cm_id, cm_manuwin_menu_str, NULL); cm_bool_line(windows_list.window[manufacture_win].cm_id, ELW_CM_MENU_LEN+1, &disable_manuwin_keypress, NULL); } //Create a child window to show recipes in a dropdown panel recipe_win= create_window("w_recipe", manufacture_win, 0, 0, 0, 0, 0, ELW_USE_UISCALE|ELW_TITLE_NONE|ELW_SHOW|ELW_USE_BACKGROUND|ELW_ALPHA_BORDER|ELW_SWITCHABLE_OPAQUE|ELW_USE_BORDER|ELW_RESIZEABLE); set_window_handler(recipe_win, ELW_HANDLER_DISPLAY, &recipe_dropdown_draw); set_window_handler(recipe_win, ELW_HANDLER_CLICK, &recipe_dropdown_click_handler ); set_window_handler(recipe_win, ELW_HANDLER_MOUSEOVER, &mouseover_recipe_handler ); set_window_handler(recipe_win, ELW_HANDLER_RESIZE, &resize_recipe_handler ); set_window_handler(recipe_win, ELW_HANDLER_KEYPRESS, keypress_recipe_handler ); recipe_win_scroll_id = vscrollbar_add_extended(recipe_win, 1, NULL, 0, 0, 0, 0, 0, 1.0, 0.77f, 0.57f, 0.39f, 0, 1, num_recipe_entries-num_displayed_recipes); if ((manufacture_win > -1) && (manufacture_win < windows_list.num_windows)) ui_scale_manufacture_handler(&windows_list.window[manufacture_win]); // context menu cm_recipewin = cm_create(cm_recipe_menu_str, context_recipe_handler); cm_add_window(cm_recipewin, recipe_win); cm_set_pre_show_handler(cm_recipewin, context_recipe_pre_show_handler); hide_window(recipe_win); //start hidden build_manufacture_list(); } else { show_window(manufacture_win); if (!recipes_shown) hide_window(recipe_win); else show_window(recipe_win); select_window(manufacture_win); } }
int click_manufacture_handler(window_info *win, int mx, int my, Uint32 flags) { int pos; static int last_slot=-1; Uint8 str[100]; int quantitytomove=1; if ((flags & ELW_CTRL) || (flags & ELW_SHIFT) || (flags & ELW_ALT)) quantitytomove = 10; /* if the eye cursor is active and we right click, change to standard walk */ if(action_mode==ACTION_LOOK && (flags&ELW_RIGHT_MOUSE)) action_mode = ACTION_WALK; //see if we clicked on any item in the main category pos=get_mouse_pos_in_grid(mx, my, 12, 3, 0, 0, 33, 33); if (pos >= 0 && manufacture_list[pos].quantity > 0) { if(action_mode==ACTION_LOOK || (flags&ELW_RIGHT_MOUSE)) { str[0]=LOOK_AT_INVENTORY_ITEM; str[1]=manufacture_list[pos].pos; my_tcp_send(my_socket,str,2); return 1; } else { int j; last_slot=-1; for(j=36;j<36+6;j++) if(manufacture_list[j].pos==manufacture_list[pos].pos && manufacture_list[j].quantity > 0){ //found an empty space in the "production pipe" if (flags & ELW_WHEEL_UP) { if (manufacture_list[j].quantity < quantitytomove) quantitytomove = -manufacture_list[j].quantity; else quantitytomove*=-1; } else if (manufacture_list[pos].quantity < quantitytomove) quantitytomove = manufacture_list[pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[pos].pos; manufacture_list[j].image_id=manufacture_list[pos].image_id; manufacture_list[pos].quantity -= quantitytomove; copy_recipe(); return 1; } for(j=36;j<36+6;j++) if(!manufacture_list[j].quantity > 0){ //found an empty space in the "production pipe" if (flags & ELW_WHEEL_UP) return 1; //quantity already 0 in production pipeline if (manufacture_list[pos].quantity < quantitytomove) quantitytomove = manufacture_list[pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[pos].pos; manufacture_list[j].image_id=manufacture_list[pos].image_id; manufacture_list[pos].quantity -= quantitytomove; copy_recipe(); return 1; } } } else if (pos>=0) last_slot=-1; //see if we clicked on any item from the "production pipe" pos=get_mouse_pos_in_grid(mx, my, 6, 1, 5, manufacture_menu_y_len-37, 33, 33); if (pos >= 0 && manufacture_list[36+pos].quantity > 0) { if(action_mode==ACTION_LOOK || (flags&ELW_RIGHT_MOUSE)){ str[0]=LOOK_AT_INVENTORY_ITEM; str[1]=manufacture_list[36+pos].pos; my_tcp_send(my_socket,str,2); return 1; } else { int j; last_slot=pos; for(j=0;j<36;j++) if(manufacture_list[j].quantity && manufacture_list[j].pos==manufacture_list[36+pos].pos){ //found item in ingredients slot, move from "production pipe" back to this slot if (flags & ELW_WHEEL_DOWN) { if (manufacture_list[36+pos].quantity < quantitytomove) quantitytomove = -manufacture_list[36+pos].quantity; else quantitytomove*=-1; } else if (manufacture_list[36+pos].quantity < quantitytomove) quantitytomove = manufacture_list[36+pos].quantity; manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[36+pos].pos; manufacture_list[j].image_id=manufacture_list[36+pos].image_id; manufacture_list[36+pos].quantity -= quantitytomove; copy_recipe(); return 1; } for(j=0;j<36;j++) if(!manufacture_list[j].quantity){ //found item in ingredients slot, move from "production pipe" back to this slot if (manufacture_list[36+pos].quantity < quantitytomove) quantitytomove = manufacture_list[36+pos].quantity; //handles mouse wheel if (flags & ELW_WHEEL_DOWN) return 1; //No more items to put in production pipe manufacture_list[j].quantity += quantitytomove; manufacture_list[j].pos=manufacture_list[36+pos].pos; manufacture_list[j].image_id=manufacture_list[36+pos].image_id; manufacture_list[36+pos].quantity -= quantitytomove; copy_recipe(); return 1; } } } else if (pos>=0) { //click on an empty slot //handle the mouse wheel if (pos!=last_slot && ((flags&ELW_WHEEL_UP)||(flags&ELW_WHEEL_DOWN))) { //simulate a click on the dropdown last_slot=-1; recipe_dropdown_click_handler(win,0,0,flags); use_recipe(cur_recipe); build_manufacture_list(); return 0; } } else last_slot=-1; //see if we clicked on the recipe handler recipe_controls_click_handler(mx,my,flags); // clear the message area if double-clicked if ((my > manufacture_menu_y_len-85) && my < (manufacture_menu_y_len-37)) { static Uint32 last_click = 0; if (safe_button_click(&last_click)) { set_shown_string(0,""); return 1; } } return 0; }