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; }
int click_book_handler(window_info *win, int mx, int my, Uint32 flags) { int i,x,p; book *b=win->data; // only handle mouse button clicks, not scroll wheels moves if ( (flags & ELW_MOUSE_BUTTON) == 0) return 0; my -= win->len_y; if(my<-2 && my>-18) { if(mx>10 && mx < 20){ if(b->have_server_pages<b->server_pages) { if(b->active_page-b->type >= 0) b->active_page -= b->type; //We'll always have the first pages, you can't advance from 0-20 in 1 jump but must get them all. //TODO: Make it possible to jump that many pages. } else if(b->active_page-b->type >= 0) { b->active_page-=b->type; } } else if(mx>win->len_x-20 && mx<win->len_x-10){ if(b->have_server_pages<b->server_pages){ //Get a 2 new pages... char str[5]; int id=b->id; int pages=b->have_server_pages; str[0]=SEND_BOOK; *((Uint16*)(str+1))=SDL_SwapLE16(id); *((Uint16*)(str+3))=SDL_SwapLE16(pages); my_tcp_send(my_socket, (Uint8*)str, 5); if(b->active_page+b->type<b->no_pages) b->active_page+=b->type; else b->pages_to_scroll=b->type; } else if(b->active_page+b->type<b->no_pages) { b->active_page+=b->type; } } if(b->type==1){ x=50; p=b->active_page-5; if(p>=0 && mx>=x&&mx<x+25){ b->active_page-=5; } x=100; p=b->active_page-2; if(p>=0 && mx>=x&&mx<x+25){ b->active_page-=2; } x=140; if(mx>win->len_x/2-15 && mx < win->len_x/2+15) { // char str[5]; // int id=b->id; // // Lachesis: Please either fix this branching condition or remove it. // if (10000 > id > 11000) { // str[0]=SEND_BOOK; // *((Uint16*)(str+1))=SDL_SwapLE16(id); // *((Uint16*)(str+3))=SDL_SwapLE16(0xFFFF); // Swap not actually necessary.. But it's cleaner. // my_tcp_send(my_socket, str, 5); // } hide_window(win->window_id); book_opened=-1; } x=win->len_x-120; p=b->active_page+2; if(p<b->no_pages && mx>=x && mx<x+25){ b->active_page+=2; } x=win->len_x-70; p=b->active_page+5; if(p<b->no_pages && mx>=x && mx<x+25){ b->active_page+=5; } } else if(b->type==2){ x=win->len_x/2-60; for(i=1;i<5;i++){ p=b->active_page-i*b->type; if(mx>=x && mx<x+25 && p>=0){ b->active_page-=i*b->type; } x-=40; } if(mx>win->len_x/2-15 && mx < win->len_x/2+15) { // char str[5]; // int id=b->id; // // Lachesis: Please either fix this branching condition or remove it. // if (10000 > id > 11000) { // str[0]=SEND_BOOK; // *((Uint16*)(str+1))=SDL_SwapLE16(id); // *((Uint16*)(str+3))=SDL_SwapLE16(0xFFFF); // my_tcp_send(my_socket, str, 5); // } hide_window(win->window_id); book_opened=-1; } x=win->len_x/2+50; for(i=1;i<5;i++){ p=b->active_page+i*b->type; if(mx>=x && mx<x+25 && p<b->no_pages){ b->active_page+=i*b->type; } x+=40; } } } return 1; }
static int click_misc_handler(window_info *win, int mx, int my, Uint32 flags) { int clockheight = 0; int in_stats_bar = 0; // handle scrolling the stats bars if not all displayed if (show_stats_in_hud && (my >= 0) && (my < num_disp_stat*side_stats_bar_height)) { in_stats_bar = 1; if ((first_disp_stat > 0) && ((flags & ELW_WHEEL_UP) || ((flags & ELW_LEFT_MOUSE) && (flags & ELW_CTRL)))) { first_disp_stat--; return 1; } else if ((first_disp_stat + num_disp_stat < NUM_WATCH_STAT-1) && ((flags & ELW_WHEEL_DOWN) || ((flags & ELW_RIGHT_MOUSE) && (flags & ELW_CTRL)))) { first_disp_stat++; return 1; } } if (mouse_is_over_timer(win, mx, my)) return mouse_click_timer(flags); // only handle mouse button clicks, not scroll wheels moves if ( (flags & ELW_MOUSE_BUTTON) == 0) return 0; // reserve CTRL clicks for scrolling if (flags & ELW_CTRL) return 0; //check to see if we clicked on the clock if(view_digital_clock>0){ clockheight += digital_clock_height; } if(view_analog_clock>0){ clockheight += analog_clock_size; } if(my > (win->len_y - compass_size - clockheight) && my < (win->len_y - compass_size)) { unsigned char protocol_name; do_click_sound(); protocol_name= GET_TIME; my_tcp_send(my_socket,&protocol_name,1); return 1; } /* show research if click on the knowledge bar */ if (mouse_is_over_knowedge_bar(win, mx, my)) { do_click_sound(); send_input_text_line("#research", 9); return 1; } //check to see if we clicked on the compass if(my > (win->len_y - compass_size) && my < win->len_y) { unsigned char protocol_name; do_click_sound(); protocol_name= LOCATE_ME; if (flags & ELW_SHIFT) { copy_next_LOCATE_ME = 2; } my_tcp_send(my_socket,&protocol_name,1); return 1; } //check to see if we clicked on the stats if (in_stats_bar) { handle_stats_selection(first_disp_stat + (my / side_stats_bar_height) + 1, flags); return 1; } return 0; }
void update_camera() { const float c_delta = 0.1f; static int last_update = 0; int time_diff = cur_time - last_update; static float old_camera_x = 0; static float old_camera_y = 0; static float old_camera_z = 0; float adjust; actor *me = get_our_actor(); old_rx=rx; old_rz=rz; new_zoom_level=old_zoom_level=zoom_level; //printf("kludge: %f, hold: %f, rx: %f, rz %f, zoom: %f\n",camera_kludge, hold_camera,rx,rz,zoom_level); if (fol_cam && !fol_cam_behind) rz = hold_camera; if (me) camera_kludge = -me->z_rot; /* This is a BIG hack to not polluate the code but if this feature * is accepted and the flag is removed, all the code that * follows will have to be changed in order to get rid of * camera_rotation_duration and camera_tilt_duration. */ camera_rotation_duration = camera_rotation_speed != 0.0 ? time_diff : 0.0; camera_tilt_duration = camera_tilt_speed != 0.0 ? time_diff : 0.0; if(camera_rotation_duration > 0){ if (time_diff <= camera_rotation_duration) rz+=camera_rotation_speed*time_diff; else rz+=camera_rotation_speed*camera_rotation_duration; camera_rotation_duration-=time_diff; adjust_view++; } if(camera_x_duration > 0){ if(camera_x_speed>1E-4 || camera_x_speed<-1E-4){ if (time_diff <= camera_x_duration) camera_x-=camera_x_speed*time_diff; else camera_x-=camera_x_speed*camera_x_duration; if(fabs(camera_x-old_camera_x) >= c_delta){ adjust_view++; } } camera_x_duration-=time_diff; } if(camera_y_duration > 0){ if(camera_y_speed>1E-4 || camera_y_speed<-1E-4){ if (time_diff <= camera_y_duration) camera_y-=camera_y_speed*time_diff; else camera_y-=camera_y_speed*camera_y_duration; if(fabs(camera_y-old_camera_y) >= c_delta){ adjust_view++; } } camera_y_duration-=time_diff; } if(camera_z_duration > 0){ if(camera_z_speed>1E-4 || camera_z_speed<-1E-4){ if (time_diff <= camera_z_duration) camera_z-=camera_z_speed*time_diff; else camera_z-=camera_z_speed*camera_z_duration; if(fabs(camera_z-old_camera_z) >= c_delta){ adjust_view++; } } camera_z_duration-=time_diff; } if(camera_tilt_duration > 0) { if (time_diff <= camera_tilt_duration) rx+=camera_tilt_speed*time_diff; else rx+=camera_tilt_speed*camera_tilt_duration; camera_tilt_duration-=time_diff; adjust_view++; } if(camera_zoom_duration > 0) { if (time_diff <= camera_zoom_duration) new_zoom_level += camera_zoom_speed*(camera_zoom_dir==1?0.003f:-0.003f)*time_diff; else new_zoom_level += camera_zoom_speed*(camera_zoom_dir==1?0.003f:-0.003f)*camera_zoom_duration; camera_zoom_duration-=time_diff; adjust_view++; } else camera_zoom_speed = 1; if (camera_rotation_speed > 0.0) { camera_rotation_speed -= time_diff * camera_rotation_deceleration; if (camera_rotation_speed < 0.0) camera_rotation_speed = 0.0; } else if (camera_rotation_speed < 0.0) { camera_rotation_speed += time_diff * camera_rotation_deceleration; if (camera_rotation_speed > 0.0) camera_rotation_speed = 0.0; } if (camera_tilt_speed > 0.0) { camera_tilt_speed -= time_diff * camera_tilt_deceleration; if (camera_tilt_speed < 0.0) camera_tilt_speed = 0.0; } else if (camera_tilt_speed < 0.0) { camera_tilt_speed += time_diff * camera_tilt_deceleration; if (camera_tilt_speed > 0.0) camera_tilt_speed = 0.0; } clamp_camera(); if (ext_cam && !first_person && me && rx <= -min_tilt_angle && rx >= -max_tilt_angle) { float rot_x[9], rot_z[9], rot[9], dir[3]; float vect[3] = {0.0, 0.0, new_zoom_level*camera_distance}; int tx, ty; float tz; // we compute the camera position MAT3_ROT_X(rot_x, -rx*M_PI/180.0); MAT3_ROT_Z(rot_z, -rz*M_PI/180.0); MAT3_MULT(rot, rot_z, rot_x); MAT3_VECT3_MULT(dir, rot, vect); // we take the tile where the camera is tx = (int)((dir[0] - camera_x)*2); ty = (int)((dir[1] - camera_y)*2); if (get_tile_walkable(tx, ty)) { tz = get_tile_height(tx, ty); } else { // if the tile is outside the map, we take the height at the actor position tz = get_tile_height(me->x_tile_pos, me->y_tile_pos); } // here we use a shift of 0.2 to avoid to be too close to the ground if (tz + 0.2 > dir[2] - camera_z) { if (ext_cam_auto_zoom) // new behaviour { // if the camera is under the ground, we change the zoom level if (fabsf(dir[2]) > 1E-4) new_zoom_level *= (tz + camera_z + 0.2) / dir[2]; else new_zoom_level = 0.0; if (new_zoom_level < 1.0) { new_zoom_level = 1.0; camera_tilt_duration = camera_zoom_duration = 0; camera_tilt_speed = 0.0; if (fabsf(tz + camera_z + 0.2f) < fabsf(vect[2]) - 0.01) rx = -90.0 + 180.0 * asinf((tz + camera_z + 0.2) / vect[2]) / M_PI; } else if (new_zoom_level > old_zoom_level) { new_zoom_level = old_zoom_level; camera_tilt_duration = camera_zoom_duration = 0; camera_tilt_speed = 0.0; } } else // old freecam behaviour { new_zoom_level = old_zoom_level; camera_tilt_duration = camera_zoom_duration = 0; camera_tilt_speed = 0.0; if (fabsf(tz + camera_z + 0.2f) < fabsf(vect[2]) - 0.01) rx = -90.0 + 180.0 * asinf((tz + camera_z + 0.2) / vect[2]) / M_PI; } } } if(adjust_view){ set_all_intersect_update_needed(main_bbox_tree); old_camera_x= camera_x; old_camera_y= camera_y; old_camera_z= camera_z; } hold_camera = rz; if (fol_cam) { static int fol_cam_stop = 0; if ((SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2)) || camera_rotation_speed != 0) fol_cam_stop = 1; else if (me && me->moving && fol_cam_stop) fol_cam_stop = 0; if (last_kludge != camera_kludge && !fol_cam_stop) { set_all_intersect_update_needed(main_bbox_tree); adjust = (camera_kludge-last_kludge); //without this the camera will zip the wrong way when camera_kludge //flips from 180 <-> -180 if (adjust >= 180) adjust -= 360.0; else if (adjust <= -180) adjust += 360.0; if (fabs(adjust) < fol_strn) { last_kludge=camera_kludge; } else { last_kludge += fol_strn*( adjust*(fol_quad*fol_strn + fol_lin)+ fol_con*(adjust>0?1:-1))/ (fol_quad+fol_lin+fol_con+.000001f);//cheap no/0 } } if (fol_cam_behind) { if (!fol_cam_stop) rz = -last_kludge; else last_kludge = -rz; } else rz -= last_kludge; } //Make Character Turn with Camera if (have_mouse && !on_the_move (get_our_actor ())) { adjust = rz; //without this the character will turn the wrong way when camera_kludge //and character are in certain positions if (adjust >= 180) adjust -= 360.0; else if (adjust <= -180) adjust += 360.0; adjust+=camera_kludge; if (adjust >= 180) adjust -= 360.0; else if (adjust <= -180) adjust += 360.0; if (adjust > 35){ Uint8 str[2]; str[0] = TURN_LEFT; my_tcp_send (my_socket, str, 1); } else if (adjust < -35){ Uint8 str[2]; str[0] = TURN_RIGHT; my_tcp_send (my_socket, str, 1); } } adjust_view = 0; last_update = cur_time; }
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; }
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; }
void pf_move() { int x, y; actor *me; if (!pf_follow_path || !(me = get_our_actor())) { return; } x = me->x_tile_pos; y = me->y_tile_pos; if (PF_DIFF(x, pf_dst_tile->x) < 2 && PF_DIFF(y, pf_dst_tile->y) < 2) { pf_destroy_path(); } else { PF_TILE *t = pf_get_tile(x, y); int i = 0, j = 0; for (pf_cur_tile = pf_dst_tile; pf_cur_tile; pf_cur_tile = pf_cur_tile->parent) { if (pf_cur_tile == t) { break; } i++; } if (pf_cur_tile == t) { #ifdef FUZZY_PATHS int limit= i-(10+rand()%3); #else //FUZZY_PATHS int limit= i-12; #endif //FUZZY_PATHS for (pf_cur_tile = pf_dst_tile; pf_cur_tile; pf_cur_tile = pf_cur_tile->parent) { if (j++ == limit) { break; } } if (pf_cur_tile) { Uint8 str[5]; str[0] = MOVE_TO; *((short *)(str+1)) = SDL_SwapLE16((short)pf_cur_tile->x); *((short *)(str+3)) = SDL_SwapLE16((short)pf_cur_tile->y); my_tcp_send(my_socket, str, 5); return; } } for (pf_cur_tile = pf_dst_tile; pf_cur_tile; pf_cur_tile = pf_cur_tile->parent) { if (PF_DIFF(x, pf_cur_tile->x) <= 12 && PF_DIFF(y, pf_cur_tile->y) <= 12 && !pf_is_tile_occupied(pf_cur_tile->x, pf_cur_tile->y)) { Uint8 str[5]; str[0] = MOVE_TO; *((short *)(str+1)) = SDL_SwapLE16((short)pf_cur_tile->x); *((short *)(str+3)) = SDL_SwapLE16((short)pf_cur_tile->y); my_tcp_send(my_socket, str, 5); break; } } } }
void move_self_forward() { int i,x,y,rot,tx,ty; Uint8 str[10]; for(i=0;i<max_actors;i++) { if(actors_list[i] && actors_list[i]->actor_id==yourself) { lock_actors_lists(); x=actors_list[i]->x_tile_pos; y=actors_list[i]->y_tile_pos; rot=actors_list[i]->z_rot; rot=unwindAngle_Degrees(rot); switch(rot) { case 0: tx=x; ty=y+1; break; case 45: tx=x+1; ty=y+1; break; case 90: tx=x+1; ty=y; break; case 135: tx=x+1; ty=y-1; break; case 180: tx=x; ty=y-1; break; case 225: tx=x-1; ty=y-1; break; case 270: tx=x-1; ty=y; break; case 315: tx=x-1; ty=y+1; break; default: tx=x; ty=y; } //check to see if the coordinates are OUTSIDE the map if(ty<0 || tx<0 || tx>=tile_map_size_x*6 || ty>=tile_map_size_y*6)return; if (pf_follow_path) { pf_destroy_path(); } str[0]=MOVE_TO; *((short *)(str+1))=tx; *((short *)(str+3))=ty; my_tcp_send(my_socket,str,5); unlock_actors_lists(); return; } } }
static int click_buddy_handler (window_info *win, int mx, int my, Uint32 flags) { int x = mx; int y = my - buddy_border_space; char str[50]; // scroll the winow with the mouse wheel if(flags & ELW_WHEEL_UP) { vscrollbar_scroll_up(buddy_win,buddy_scroll_id); return 1; } else if(flags & ELW_WHEEL_DOWN) { vscrollbar_scroll_down(buddy_win,buddy_scroll_id); return 1; } // only handle mouse button clicks, not scroll wheels moves if ( (flags & ELW_MOUSE_BUTTON) == 0) return 0; if(x > (win->len_x - win->box_size)) { //Clicked on the scrollbar. Let it fall through. return 0; } else if(!queue_isempty(buddy_request_queue) && mx > (request_box_start_x - win->small_font_len_x) && y < (win->small_font_len_y + 1)) { //Clicked on the requests button while(!queue_isempty(buddy_request_queue)) { char *name = queue_pop(buddy_request_queue); select_window(display_accept_buddy(name)); free(name); } return 1; } // clicked on a buddy's name y /= buddy_name_step_y; if (y >= num_displayed_buddies) return 0; y += vscrollbar_get_pos(buddy_win,buddy_scroll_id); if((strlen(buddy_list[y].name) == 0)||(buddy_list[y].type > 0xFE)) { //There's no name. Fall through. return 0; } if(flags&ELW_RIGHT_MOUSE) { if(flags&ELW_CTRL) { //CTRL + right click, delete buddy. safe_snprintf(str, sizeof(str), "%c#del_buddy %s", RAW_TEXT, buddy_list[y].name); my_tcp_send(my_socket, (Uint8*)str, strlen(str+1)+1); } else { //Right click, open edit window display_buddy_change(&buddy_list[y]); } } else if (buddy_list[y].type < 0xFE) { //start a pm to them // clear the buffer clear_input_line(); // insert the person's name safe_snprintf (str, sizeof(str),"/%s ", buddy_list[y].name); //put_string_in_buffer (&input_text_line, str, 0); //We'll just reuse the paste function here paste_in_input_field((unsigned char*)str); } return 1; }