page * add_str_to_page(char * str, int type, book *b, page *p) { char ** lines=NULL; char ** newlines=NULL; char ** newlines_ptr; int i; if(!str) return NULL; if(!p)p=add_page(b); newlines=get_lines(str, b->max_width); newlines_ptr = newlines; lines=p->lines; for(i=0;*lines;i++,lines++); if(type==_AUTHOR){ *lines++=(char*)calloc(1,sizeof(char)); } else if (type==_TITLE){ *lines++=(char*)calloc(1,sizeof(char)); } for(;newlines && *newlines;i++) { if(type==_AUTHOR){ memmove(*newlines+1,*newlines,strlen(*newlines)+1); **newlines = to_color_char (c_orange3); } else if(type==_TITLE){ memmove(*newlines+1,*newlines,strlen(*newlines)+1); **newlines = to_color_char (c_orange4); } if(i>=b->max_lines){ *lines=NULL; p=add_page(b); lines=p->lines; i=0; } *lines++=*newlines++; // Grum: don't free *newlines, it's the pointer to actual line. // It's this pointer that is copied to p->lines, not the data // that it points to. //free(*newlines); } // This is a temporary array that holds the pointers to the lines. It // can safely be freed. free(newlines_ptr); if(i<b->max_lines){ if(type==_AUTHOR){ *lines++=(char*)calloc(1,sizeof(char)); } else if (type==_TITLE){ *lines++=(char*)calloc(1,sizeof(char)); } } *lines=NULL; return p; }
void move_to_category(int cat) { Uint8 str[4]; if(cat<0||cat>=no_storage_categories) return; storage_categories[cat].name[0] = to_color_char (c_red3); if (selected_category!=-1 && cat!=selected_category) storage_categories[selected_category].name[0] = to_color_char (c_orange1); set_window_name(" - ", storage_categories[cat].name+1); str[0]=GET_STORAGE_CATEGORY; *((Uint8 *)(str+1))=storage_categories[cat].id; my_tcp_send(my_socket, str, 2); }
void recolour_message(text_message *msg){ if (msg->chan_idx >= CHAT_CHANNEL1 && msg->chan_idx <= CHAT_CHANNEL3 && msg->len > 0 && msg->data[0] && !msg->deleted) { int i; for(i=0; i< MAX_CHANNEL_COLORS; i++) { if(channel_colors[i].nr == msg->channel) break; } if(i< MAX_CHANNEL_COLORS && channel_colors[i].color != -1) { msg->data[0] = to_color_char (channel_colors[i].color); } else if (active_channels[current_channel] != msg->channel){ msg->data[0] = to_color_char (c_grey2); } else { msg->data[0] = to_color_char (c_grey1); } } }
int mouseover_storage_handler(window_info *win, int mx, int my) { static int last_pos; int last_category; cur_item_over=-1; if (my < 0) mouse_over_titlebar = 1; else mouse_over_storage = 1; if(my>10 && my<202){ if(mx>10 && mx<130){ int i; int pos=last_pos=(my-20)/13; int p; for(i=p=vscrollbar_get_pos(storage_win,STORAGE_SCROLLBAR_CATEGORIES);i<no_storage_categories;i++){ if(i==selected_category) { } else if(i!=p+pos) { storage_categories[i].name[0] = to_color_char (c_orange1); } else { storage_categories[i].name[0] = to_color_char (c_green2); } } return 0; } else if (mx>150 && mx<352){ cur_item_over = get_mouse_pos_in_grid(mx, my, 6, 6, 160, 10, 32, 32)+vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_ITEMS)*6; if(cur_item_over>=no_storage||cur_item_over<0||!storage_items[cur_item_over].quantity) cur_item_over=-1; } } last_category = last_pos+vscrollbar_get_pos(storage_win,STORAGE_SCROLLBAR_CATEGORIES); if(last_pos>=0 && last_pos<13 && last_category != selected_category) { storage_categories[last_category].name[0] = to_color_char (c_orange1); last_pos=-1; } return 0; }
void display_storage_menu() { int i; /* Entropy suggested hack to determine if this is the view only "#sto" opened storage */ view_only_storage = 0; for (i = 0; i < no_storage_categories; i++) { if ((storage_categories[i].id != -1) && (strcmp(&storage_categories[i].name[1], "Quest") == 0)) { view_only_storage = 1; break; } } if(storage_win<=0){ int our_root_win = -1; if (!windows_on_top) { our_root_win = game_root_win; } storage_win=create_window(win_storage, our_root_win, 0, storage_win_x, storage_win_y, storage_win_x_len, storage_win_y_len, ELW_WIN_DEFAULT|ELW_TITLE_NAME); set_window_handler(storage_win, ELW_HANDLER_DISPLAY, &display_storage_handler); set_window_handler(storage_win, ELW_HANDLER_CLICK, &click_storage_handler); set_window_handler(storage_win, ELW_HANDLER_MOUSEOVER, &mouseover_storage_handler); set_window_handler(storage_win, ELW_HANDLER_KEYPRESS, &keypress_storage_handler ); vscrollbar_add_extended(storage_win, STORAGE_SCROLLBAR_CATEGORIES, NULL, 130, 10, 20, 192, 0, 1.0, newcol_r, newcol_g, newcol_b, 0, 1, max2i(no_storage_categories - STORAGE_CATEGORIES_DISPLAY, 0)); vscrollbar_add_extended(storage_win, STORAGE_SCROLLBAR_ITEMS, NULL, 352, 10, 20, 192, 0, 1.0, newcol_r, newcol_g, newcol_b, 0, 1, 28); cm_add(windows_list.window[storage_win].cm_id, cm_storage_menu_str, context_storage_handler); cm_add(windows_list.window[storage_win].cm_id, cm_dialog_options_str, context_storage_handler); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+2, &sort_storage_categories, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+3, &disable_storage_filter, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+4, &autoclose_storage_dialogue, NULL); cm_bool_line(windows_list.window[storage_win].cm_id, ELW_CM_MENU_LEN+5, &auto_select_storage_option, NULL); } else { no_storage=0; for(i = 0; i < no_storage_categories; i++) storage_categories[i].name[0] = to_color_char (c_orange1); show_window(storage_win); select_window(storage_win); vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, 0); vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_ITEMS, 0); } storage_text[0] = '\0'; set_window_name("", ""); }
void recolour_message(text_message *msg){ if (msg->chan_idx >= CHAT_CHANNEL1 && msg->chan_idx <= #if defined(OTHER_LIFE) && defined(OTHER_LIFE_EXTENDED_CHAT) ((loadsofchannels != 3) ? CHAT_CHANNEL32 : CHAT_CHANNEL3) #else CHAT_CHANNEL3 #endif // if defined(OTHER_LIFE) && defined(OTHER_LIFE_EXTENDED_CHAT) && msg->len > 0 && msg->data[0] && !msg->deleted) { int i; for(i=0; i< MAX_CHANNEL_COLORS; i++) { if(channel_colors[i].nr == msg->channel) break; } if(i< MAX_CHANNEL_COLORS && channel_colors[i].color != -1) { msg->data[0] = to_color_char (channel_colors[i].color); } else if (active_channels[current_channel] != msg->channel){ msg->data[0] = to_color_char (c_grey2); } else { msg->data[0] = to_color_char (c_grey1); } } }
void get_storage_categories (const char *in_data, int len) { int i; int idx, idxp; idx = 1; for (i = 0; i < in_data[0] && i < STORAGE_CATEGORIES_SIZE && idx < len; i++) { storage_categories[i].id = (Uint8)in_data[idx++]; storage_categories[i].name[0] = to_color_char (c_orange1); idxp = 1; while (idx < len && idxp < sizeof (storage_categories[i].name) - 1 && in_data[idx] != '\0') { storage_categories[i].name[idxp++] = in_data[idx++]; } // always make sure the string is terminated storage_categories[i].name[idxp] = '\0'; // was the string too long? if (idxp >= sizeof (storage_categories[i].name) - 1) { // skip rest of string while (idx < len && in_data[idx] != '\0') idx++; } idx++; } if (sort_storage_categories) qsort(storage_categories, i, sizeof(*storage_categories), category_cmp); for (i = in_data[0]; i < STORAGE_CATEGORIES_SIZE; i++) { storage_categories[i].id = -1; storage_categories[i].name[0] = 0; } no_storage_categories = in_data[0]; if (storage_win > 0) vscrollbar_set_bar_len(storage_win, STORAGE_SCROLLBAR_CATEGORIES, ( no_storage_categories - STORAGE_CATEGORIES_DISPLAY ) > 1 ? (no_storage_categories - STORAGE_CATEGORIES_DISPLAY) : 1); selected_category=-1; active_storage_item=-1; display_storage_menu(); if (!view_only_storage) display_items_menu(); }
void put_colored_text_in_buffer (Uint8 color, Uint8 channel, const Uint8 *text_to_add, int len) { text_message *msg; int minlen, text_color; Uint32 cnr = 0, ibreak = -1, jbreak = -1; char time_stamp[12]; struct tm *l_time; time_t c_time; check_chat_text_to_overtext (text_to_add, len, channel); // check for auto-length if (len < 0) len = strlen ((char*)text_to_add); // set the time when we got this message last_server_message_time = cur_time; // if the buffer is full, delete some old lines and move the remainder to the front if (++last_message >= DISPLAY_TEXT_BUFFER_SIZE) { const size_t num_move = DISPLAY_TEXT_BUFFER_SIZE - DISPLAY_TEXT_BUFFER_DEL; size_t i; for (i=0; i<DISPLAY_TEXT_BUFFER_DEL; i++) { msg = &(display_text_buffer[i]); if (msg->data) { msg->deleted = 1; update_text_windows(msg); free_text_message_data (msg); } } memmove(display_text_buffer, &display_text_buffer[DISPLAY_TEXT_BUFFER_DEL], sizeof(text_message)*num_move); last_message -= DISPLAY_TEXT_BUFFER_DEL; for (i = num_move; i < DISPLAY_TEXT_BUFFER_SIZE; i++) init_text_message (display_text_buffer + i, 0); } msg = &(display_text_buffer[last_message]); // Try to make a guess at the number of wrapping newlines required, // but allow al least for a null byte and up to 8 extra newlines and // colour codes minlen = len + 18 + (len/60); if (show_timestamp) { minlen += 12; time (&c_time); l_time = localtime (&c_time); strftime (time_stamp, sizeof(time_stamp), "[%H:%M:%S] ", l_time); } cnr = get_active_channel (channel); if (cnr != 0) // allow some space for the channel number minlen += 20; if (msg->data == NULL) alloc_text_message_data (msg, minlen); else resize_text_message_data (msg, minlen); if (cnr != 0) { for (ibreak = 0; ibreak < len; ibreak++) { if (text_to_add[ibreak] == ']') break; } } if (channel == CHAT_LOCAL) { for (jbreak = 0; jbreak < len; jbreak++) { if (text_to_add[jbreak] == ':' && text_to_add[jbreak+1] == ' ') break; } } if (dark_channeltext==1) text_color = c_grey2; else if (dark_channeltext==2) text_color = c_grey4; if (ibreak >= len) { // not a channel, or something's messed up if(!is_color (text_to_add[0])) { // force the color if (show_timestamp) { safe_snprintf (msg->data, msg->size, "%c%s%.*s", to_color_char (color), time_stamp, len, text_to_add); } else { safe_snprintf (msg->data, msg->size, "%c%.*s", to_color_char (color), len, text_to_add); } } else { // color set by server if (show_timestamp) { if(dark_channeltext && channel==CHAT_LOCAL && from_color_char(text_to_add[0])==c_grey1 && jbreak < (len-3)) { safe_snprintf (msg->data, msg->size, "%c%s%.*s%.*s", to_color_char (text_color), time_stamp, jbreak+1, &text_to_add[1], len-jbreak-3, &text_to_add[jbreak+3]); } else { safe_snprintf (msg->data, msg->size, "%c%s%.*s", text_to_add[0], time_stamp, len-1, &text_to_add[1]); } } else { if(dark_channeltext && channel==CHAT_LOCAL && from_color_char(text_to_add[0])==c_grey1 && jbreak < (len-3)) { safe_snprintf (msg->data, msg->size, "%c%.*s%.*s", to_color_char (text_color), jbreak+1, &text_to_add[1], len-jbreak-3, &text_to_add[jbreak+3]); } else { safe_snprintf (msg->data, msg->size, "%.*s", len, text_to_add); } } } } else { char nr_str[16]; int has_additional_color = is_color(text_to_add[ibreak+3]); if (cnr >= 1000000000) safe_snprintf (nr_str, sizeof (nr_str), "guild"); else safe_snprintf (nr_str, sizeof (nr_str), "%u", cnr); if(!is_color (text_to_add[0])) { // force the color if (show_timestamp) { if (dark_channeltext) { safe_snprintf (msg->data, msg->size, "%c%s%.*s @ %s%.*s%c%.*s", to_color_char (color), time_stamp, ibreak, text_to_add, nr_str, 3, &text_to_add[ibreak], to_color_char (text_color), len-ibreak-3-has_additional_color, &text_to_add[ibreak+3+has_additional_color]); } else { safe_snprintf (msg->data, msg->size, "%c%s%.*s @ %s%.*s", to_color_char (color), time_stamp, ibreak, text_to_add, nr_str, len-ibreak, &text_to_add[ibreak]); } } else { if (dark_channeltext) { safe_snprintf (msg->data, msg->size, "%c%.*s @ %s%.*s%c%.*s", to_color_char (color), ibreak, text_to_add, nr_str, 3, &text_to_add[ibreak], to_color_char (text_color), len-ibreak-3-has_additional_color, &text_to_add[ibreak+3+has_additional_color]); } else { safe_snprintf (msg->data, msg->size, "%c%.*s @ %s%.*s", to_color_char (color), ibreak, text_to_add, nr_str, len-ibreak, &text_to_add[ibreak]); } } } else { // color set by server if (show_timestamp) { if (dark_channeltext) { safe_snprintf (msg->data, msg->size, "%c%s%.*s @ %s%.*s%c%.*s", text_to_add[0], time_stamp, ibreak-1, &text_to_add[1], nr_str, 3, &text_to_add[ibreak], to_color_char (text_color), len-ibreak-3-has_additional_color, &text_to_add[ibreak+3+has_additional_color]); } else { safe_snprintf (msg->data, msg->size, "%c%s%.*s @ %s%.*s", text_to_add[0], time_stamp, ibreak-1, &text_to_add[1], nr_str, len-ibreak, &text_to_add[ibreak]); } } else { if (dark_channeltext) { safe_snprintf (msg->data, msg->size, "%.*s @ %s%.*s%c%.*s", ibreak, text_to_add, nr_str, 3, &text_to_add[ibreak], to_color_char (text_color), len-ibreak-3-has_additional_color, &text_to_add[ibreak+3+has_additional_color]); } else { safe_snprintf (msg->data, msg->size, "%.*s @ %s%.*s", ibreak, text_to_add, nr_str, len-ibreak, &text_to_add[ibreak]); } } } } msg->len = strlen (msg->data); msg->chan_idx = channel; msg->channel = cnr; // set invalid wrap data to force rewrapping msg->wrap_lines = 0; msg->wrap_zoom = 0.0f; msg->wrap_width = 0; msg->deleted = 0; recolour_message(msg); update_text_windows(msg); // log the message write_to_log (channel, (unsigned char*)msg->data, msg->len); return; }
void put_small_colored_text_in_box (Uint8 color, const Uint8 *text_to_add, int len, int pixels_limit, char *buffer) { int i; Uint8 cur_char; int last_text = 0; int x_chars_limit; // force the color if (!is_color (text_to_add[0])) buffer[last_text++] = to_color_char (color); //see if the text fits on the screen x_chars_limit = pixels_limit / 8; if (len <= x_chars_limit) { for (i = 0; i < len; i++) { cur_char = text_to_add[i]; if (cur_char == '\0') break; buffer[last_text++] = cur_char; } if (last_text > 0 && buffer[last_text-1] != '\n') buffer[last_text++] = '\n'; buffer[last_text] = '\0'; } else //we have to add new lines to our text... { int k; int new_line_pos = 0; char semaphore = 0; Uint8 current_color = to_color_char (color); // go trought all the text for (i = 0; i < len; i++) { if (!semaphore && new_line_pos + x_chars_limit < len) //don't go through the last line { //find the closest space from the end of this line //if we have one really big word, then parse the string from the //end of the line backwards, untill the beginning of the line +2 //the +2 is so we avoid parsing the ": " thing... for (k = new_line_pos + x_chars_limit - 1; k > new_line_pos + 2; k--) { cur_char = text_to_add[k]; if (k > len) continue; if (cur_char == ' ' || cur_char == '\n') { k++; // let the space on the previous line break; } } if (k == new_line_pos + 2) new_line_pos += x_chars_limit; else new_line_pos = k; semaphore = 1; } cur_char = text_to_add[i]; if (cur_char == '\0') break; if (is_color (cur_char)) // we have a color, save it { current_color = cur_char; if (last_text > 0 && is_color (buffer[last_text-1])) last_text--; } else if (cur_char == '\n') { new_line_pos = i; } if (i == new_line_pos) { buffer[last_text++] = '\n'; // don't add color codes after the last newline if (i < len-1) buffer[last_text++] = current_color; semaphore = 0; } //don't add another new line, if the current char is already a new line... if (cur_char != '\n') buffer[last_text++] = cur_char; } // don't add extra newlines if there already is one if (last_text > 0 && buffer[last_text-1] != '\n') buffer[last_text++] = '\n'; buffer[last_text] = '\0'; } }
void draw_messages (int x, int y, text_message *msgs, int msgs_size, Uint8 filter, int msg_start, int offset_start, int cursor, int width, int height, float text_zoom, select_info* select) { float displayed_font_x_size = DEFAULT_FONT_X_LEN * text_zoom; float displayed_font_y_size = DEFAULT_FONT_Y_LEN * text_zoom; float selection_red = 255 / 255.0f; float selection_green = 162 / 255.0f; float selection_blue = 0; unsigned char cur_char; int i; int imsg, ichar; int cur_x, cur_y; int cursor_x = x-1, cursor_y = y-1; unsigned char ch; int cur_line = 0; int cur_col = 0; unsigned char last_color_char = 0; int in_select = 0; imsg = msg_start; ichar = offset_start; if (msgs[imsg].data == NULL || msgs[imsg].deleted) return; if (width < displayed_font_x_size || height < displayed_font_y_size) // no point in trying return; #ifndef MAP_EDITOR2 if (filter != FILTER_ALL) { // skip all messages of the wrong channel while (1) { if (skip_message(&msgs[imsg], filter)) { ichar = 0; if (++imsg >= msgs_size) imsg = 0; if (msgs[imsg].data == NULL || imsg == msg_start || msgs[imsg].deleted) // nothing to draw return; } else { break; } } if (msgs[imsg].data == NULL || msgs[imsg].deleted) return; } #endif //! MAP_EDITOR2 ch = msgs[imsg].data[ichar]; if (!is_color (ch)) { // search backwards for the last color for (i = ichar-1; i >= 0; i--) { ch = msgs[imsg].data[i]; if (is_color (ch)) { find_font_char (ch); last_color_char = ch; break; } } if (i < 0) { // no color character found, try the message color if (msgs[imsg].r >= 0) glColor3f (msgs[imsg].r, msgs[imsg].g, msgs[imsg].b); } } glEnable (GL_ALPHA_TEST); // enable alpha filtering, so we have some alpha key glAlphaFunc (GL_GREATER, 0.1f); #ifdef NEW_TEXTURES bind_texture(font_text); #else /* NEW_TEXTURES */ get_and_set_texture_id(font_text); #endif /* NEW_TEXTURES */ i = 0; cur_x = x; cur_y = y; glBegin (GL_QUADS); while (1) { if (i == cursor) { cursor_x = cur_x; cursor_y = cur_y; if (cursor_x - x > width - displayed_font_x_size) { cursor_x = x; cursor_y = cur_y + displayed_font_y_size; } } cur_char = msgs[imsg].data[ichar]; // watch for special characters if (cur_char == '\0') { // end of message if (++imsg >= msgs_size) { imsg = 0; } #ifndef MAP_EDITOR2 if (filter != FILTER_ALL) { // skip all messages of the wrong channel while (skip_message (&msgs[imsg], filter)) { if (++imsg >= msgs_size) imsg = 0; if (msgs[imsg].data == NULL || imsg == msg_start) break; } } #endif if (msgs[imsg].data == NULL || imsg == msg_start || msgs[imsg].deleted) break; rewrap_message (&msgs[imsg], text_zoom, width, NULL); ichar = 0; last_color_char = 0; } if (select != NULL && select->lines && select->lines[cur_line].msg == -1) { select->lines[cur_line].msg = imsg; select->lines[cur_line].chr = ichar; } if (cur_char == '\n' || cur_char == '\r' || cur_char == '\0') { // newline cur_y += displayed_font_y_size; if (cur_y - y > height - displayed_font_y_size) break; cur_x = x; if (cur_char != '\0') ichar++; i++; cur_line++; cur_col = 0; continue; } if (pos_selected(imsg, ichar, select)) { if (!in_select) { glColor3f (selection_red, selection_green, selection_blue); in_select = 1; } } else { if (in_select) { if (last_color_char) find_font_char (last_color_char); else if (msgs[imsg].r < 0) find_font_char (to_color_char (c_grey1)); else glColor3f (msgs[imsg].r, msgs[imsg].g, msgs[imsg].b); in_select = 0; } } if (is_color (cur_char)) { last_color_char = cur_char; if (in_select) { // don't draw color characters in a selection i++; ichar++; continue; } } cur_x += draw_char_scaled (cur_char, cur_x, cur_y, displayed_font_x_size, displayed_font_y_size); cur_col++; ichar++; i++; if (cur_x - x > width - displayed_font_x_size) { // ignore rest of this line, but keep track of // color characters while (1) { ch = msgs[imsg].data[ichar]; if (ch == '\0' || ch == '\n' || ch == '\r') break; if (is_color (ch)) last_color_char = ch; ichar++; i++; } } } if (cursor_x >= x && cursor_y >= y && cursor_y - y <= height - displayed_font_y_size) { draw_char_scaled ('_', cursor_x, cursor_y, displayed_font_x_size, displayed_font_y_size); } glEnd(); glDisable(GL_ALPHA_TEST); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
void get_storage_items (const Uint8 *in_data, int len) { int i; int cat, pos; int idx; int plen; if (item_uid_enabled) plen=10; else plen=8; if (in_data[0] == 255) { // It's just an update - make sure we're in the right category idx = 2; active_storage_item = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); for (i = 0; i < STORAGE_ITEMS_SIZE; i++) { if ((storage_items[i].pos == SDL_SwapLE16(*((Uint16*)(&in_data[idx+6])))) && (storage_items[i].quantity > 0)) { storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; return; } } for (i = 0; i < STORAGE_ITEMS_SIZE; i++) { if (storage_items[i].quantity == 0) { if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; storage_items[i].pos = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); no_storage++; return; } } } no_storage = (len - 2) / plen; cat = find_category(in_data[1]); if (cat >= 0) { storage_categories[cat].name[0] = to_color_char (c_red3); if (selected_category != -1 && cat != selected_category) storage_categories[selected_category].name[0] = to_color_char (c_orange1); set_window_name(" - ", storage_categories[cat].name+1); selected_category = cat; } idx = 2; for (i = 0; i < no_storage && i < STORAGE_ITEMS_SIZE; i++, idx += plen) { storage_items[i].image_id = SDL_SwapLE16(*((Uint16*)(&in_data[idx]))); storage_items[i].quantity = SDL_SwapLE32(*((Uint32*)(&in_data[idx+2]))); storage_items[i].pos = SDL_SwapLE16(*((Uint16*)(&in_data[idx+6]))); if (item_uid_enabled) storage_items[i].id = SDL_SwapLE16(*((Uint16*)(&in_data[idx+8]))); else storage_items[i].id = unset_item_uid; } for ( ; i < STORAGE_ITEMS_SIZE; i++) { storage_items[i].quantity=0; } vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_ITEMS, 0); pos = vscrollbar_get_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES); if (cat < pos) { vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, cat); } else if (cat >= pos + STORAGE_CATEGORIES_DISPLAY) { vscrollbar_set_pos(storage_win, STORAGE_SCROLLBAR_CATEGORIES, cat - STORAGE_CATEGORIES_DISPLAY + 1); } if (selected_category != -1) category_updated(); }