summaryrefslogtreecommitdiff
path: root/src/interface.c
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:43:59 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:43:59 (GMT)
commite3594aba9e05c6865d396418c028049cda92c2f3 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /src/interface.c
parentfb43f7d23e99765ae093fc45608901cb5907d1d8 (diff)
downloadpowder-e3594aba9e05c6865d396418c028049cda92c2f3.zip
powder-e3594aba9e05c6865d396418c028049cda92c2f3.tar.gz
Remove old code
Diffstat (limited to 'src/interface.c')
-rw-r--r--src/interface.c7243
1 files changed, 0 insertions, 7243 deletions
diff --git a/src/interface.c b/src/interface.c
deleted file mode 100644
index 742272b..0000000
--- a/src/interface.c
+++ /dev/null
@@ -1,7243 +0,0 @@
-/**
- * Powder Toy - user interface
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef MACOSX
-#include <CoreFoundation/CFString.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <bzlib.h>
-#include <math.h>
-#include <time.h>
-#include <http.h>
-#include <md5.h>
-#include <font.h>
-#include <defines.h>
-#include <powder.h>
-#include <interface.h>
-#include <misc.h>
-#include <console.h>
-#include "gravity.h"
-#include <images.h>
-#if defined(WIN32) && !defined(__GNUC__)
-#include <io.h>
-#else
-#include <dirent.h>
-#endif
-#ifdef PYCONSOLE
-#include <pythonconsole.h>
-#endif
-#include <powdergraphics.h>
-#include "save.h"
-
-SDLMod sdl_mod;
-int sdl_key, sdl_rkey, sdl_wheel, sdl_ascii, sdl_zoom_trig=0;
-#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11)
-SDL_SysWMinfo sdl_wminfo;
-Atom XA_CLIPBOARD, XA_TARGETS;
-#endif
-
-char *shift_0="`1234567890-=[]\\;',./";
-char *shift_1="~!@#$%^&*()_+{}|:\"<>?";
-
-int svf_messages = 0;
-int svf_login = 0;
-int svf_admin = 0;
-int svf_mod = 0;
-char svf_user[64] = "";
-char svf_user_id[64] = "";
-char svf_pass[64] = "";
-char svf_session_id[64] = "";
-
-int svf_open = 0;
-int svf_own = 0;
-int svf_myvote = 0;
-int svf_publish = 0;
-char svf_filename[255] = "";
-int svf_fileopen = 0;
-char svf_id[16] = "";
-char svf_name[64] = "";
-char svf_description[255] = "";
-char svf_tags[256] = "";
-void *svf_last = NULL;
-int svf_lsize;
-
-char *search_ids[GRID_X*GRID_Y];
-char *search_dates[GRID_X*GRID_Y];
-int search_votes[GRID_X*GRID_Y];
-int search_publish[GRID_X*GRID_Y];
-int search_scoredown[GRID_X*GRID_Y];
-int search_scoreup[GRID_X*GRID_Y];
-char *search_names[GRID_X*GRID_Y];
-char *search_owners[GRID_X*GRID_Y];
-void *search_thumbs[GRID_X*GRID_Y];
-int search_thsizes[GRID_X*GRID_Y];
-
-int search_own = 0;
-int search_fav = 0;
-int search_date = 0;
-int search_page = 0;
-char search_expr[256] = "";
-
-char server_motd[512] = "";
-
-char *tag_names[TAG_MAX];
-int tag_votes[TAG_MAX];
-
-int zoom_en = 0;
-int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2;
-int zoom_wx=0, zoom_wy=0;
-unsigned char ZFACTOR = 256/ZSIZE_D;
-unsigned char ZSIZE = ZSIZE_D;
-
-int drawgrav_enable = 0;
-
-void menu_count(void)//puts the number of elements in each section into .itemcount
-{
- int i=0;
- for (i=0;i<SC_TOTAL;i++)
- {
- msections[i].itemcount = 0;
- }
- msections[SC_LIFE].itemcount = NGOLALT;
- msections[SC_WALL].itemcount = UI_WALLCOUNT-4;
- for (i=0; i<PT_NUM; i++)
- {
- if (ptypes[i].menusection<SC_TOTAL)
- {
- msections[ptypes[i].menusection].itemcount+=ptypes[i].menu;
- }
- }
-
-}
-
-void get_sign_pos(int i, int *x0, int *y0, int *w, int *h)
-{
- //Changing width if sign have special content
- if (strcmp(signs[i].text, "{p}")==0)
- *w = textwidth("Pressure: -000.00");
-
- if (strcmp(signs[i].text, "{t}")==0)
- *w = textwidth("Temp: 0000.00");
-
- if (sregexp(signs[i].text, "^{c:[0-9]*|.*}$")==0)
- {
- int sldr, startm;
- char buff[256];
- memset(buff, 0, sizeof(buff));
- for (sldr=3; signs[i].text[sldr-1] != '|'; sldr++)
- startm = sldr + 1;
-
- sldr = startm;
- while (signs[i].text[sldr] != '}')
- {
- buff[sldr - startm] = signs[i].text[sldr];
- sldr++;
- }
- *w = textwidth(buff) + 5;
- }
-
- //Ususal width
- if (strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}") && sregexp(signs[i].text, "^{c:[0-9]*|.*}$"))
- *w = textwidth(signs[i].text) + 5;
- *h = 14;
- *x0 = (signs[i].ju == 2) ? signs[i].x - *w :
- (signs[i].ju == 1) ? signs[i].x - *w/2 : signs[i].x;
- *y0 = (signs[i].y > 18) ? signs[i].y - 18 : signs[i].y + 4;
-}
-
-void add_sign_ui(pixel *vid_buf, int mx, int my)
-{
- int i, w, h, x, y, nm=0, ju;
- int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq;
- ui_edit ed;
-
- // if currently moving a sign, stop doing so
- if (MSIGN!=-1)
- {
- MSIGN = -1;
- return;
- }
-
- // check if it is an existing sign
- for (i=0; i<MAXSIGNS; i++)
- if (signs[i].text[0])
- {
- get_sign_pos(i, &x, &y, &w, &h);
- if (mx>=x && mx<=x+w && my>=y && my<=y+h)
- break;
- }
- // else look for empty spot
- if (i >= MAXSIGNS)
- {
- nm = 1;
- for (i=0; i<MAXSIGNS; i++)
- if (!signs[i].text[0])
- break;
- }
- if (i >= MAXSIGNS)
- return;
- if (nm)
- {
- signs[i].x = mx;
- signs[i].y = my;
- signs[i].ju = 1;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- ed.x = x0+25;
- ed.y = y0+25;
- ed.w = 158;
- ed.nx = 1;
- ed.def = "[message]";
- ed.focus = 1;
- ed.hide = 0;
- ed.cursor = strlen(signs[i].text);
- ed.multiline = 0;
- strcpy(ed.str, signs[i].text);
- ju = signs[i].ju;
-
- fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192);
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255);
- clearrect(vid_buf, x0, y0, 192, 80);
- drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255);
- drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255);
- drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255);
- ui_edit_draw(vid_buf, &ed);
- drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255);
- draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0);
- draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1);
- draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2);
-
-
-
-
-
- if (!nm)
- {
- drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255);
- drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255);
- drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255);
- drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255);
- drawrect(vid_buf,x0+104,y0+42,26,15,255,255,255,255);
- drawtext(vid_buf, x0+110, y0+48, "Mv.", 255, 255, 255, 255);
- }
-
- drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- ui_edit_process(mx, my, b, &ed);
-
- if (b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59)
- ju = 0;
- if (b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59)
- ju = 1;
- if (b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59)
- ju = 2;
-
- if (!nm && b && !bq && mx>=x0+104 && mx<=x0+130 && my>=y0+42 && my<=y0+59)
- {
- MSIGN = i;
- break;
- }
- if (b && !bq && mx>=x0+9 && mx<x0+23 && my>=y0+22 && my<y0+36)
- break;
- if (b && !bq && mx>=x0 && mx<x0+192 && my>=y0+64 && my<=y0+80)
- break;
-
- if (!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59)
- {
- signs[i].text[0] = 0;
- return;
- }
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- {
- if (!ed.focus)
- return;
- ed.focus = 0;
- }
- }
-
- strcpy(signs[i].text, ed.str);
- signs[i].ju = ju;
-}
-//TODO: Finish text wrapping in text edits
-void ui_edit_draw(pixel *vid_buf, ui_edit *ed)
-{
- int cx, i, cy;
- char echo[256], *str;
-
- if (ed->hide)
- {
- for (i=0; ed->str[i]; i++)
- echo[i] = 0x8D;
- echo[i] = 0;
- str = echo;
- }
- else
- str = ed->str;
-
- if (ed->str[0])
- {
- if (ed->multiline) {
- drawtextwrap(vid_buf, ed->x, ed->y, ed->w-14, str, 255, 255, 255, 255);
- drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255);
- } else {
- drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255);
- drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255);
- }
- }
- else if (!ed->focus)
- drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255);
- if (ed->focus)
- {
- if (ed->multiline) {
- textnpos(str, ed->cursor, ed->w-14, &cx, &cy);
- } else {
- cx = textnwidth(str, ed->cursor);
- cy = 0;
- }
-
- for (i=-3; i<9; i++)
- drawpixel(vid_buf, ed->x+cx, ed->y+i+cy, 255, 255, 255, 255);
- }
-}
-
-void ui_edit_process(int mx, int my, int mb, ui_edit *ed)
-{
- char ch, ts[2], echo[256], *str;
- int l, i;
-#ifdef RAWINPUT
- char *p;
-#endif
-
- if (mb)
- {
- if (ed->hide)
- {
- for (i=0; ed->str[i]; i++)
- echo[i] = 0x8D;
- echo[i] = 0;
- str = echo;
- }
- else
- str = ed->str;
-
- if (ed->multiline) {
- if (mx>=ed->x+ed->w-11 && mx<ed->x+ed->w && my>=ed->y-5 && my<ed->y+11)
- {
- ed->focus = 1;
- ed->cursor = 0;
- ed->str[0] = 0;
- }
- else if (mx>=ed->x-ed->nx && mx<ed->x+ed->w && my>=ed->y-5 && my<ed->y+ed->h)
- {
- ed->focus = 1;
- ed->cursor = textposxy(str, ed->w-14, mx-ed->x, my-ed->y);
- }
- else
- ed->focus = 0;
- } else {
- if (mx>=ed->x+ed->w-11 && mx<ed->x+ed->w && my>=ed->y-5 && my<ed->y+11)
- {
- ed->focus = 1;
- ed->cursor = 0;
- ed->str[0] = 0;
- }
- else if (mx>=ed->x-ed->nx && mx<ed->x+ed->w && my>=ed->y-5 && my<ed->y+11)
- {
- ed->focus = 1;
- ed->cursor = textwidthx(str, mx-ed->x);
- }
- else
- ed->focus = 0;
- }
- }
- if (ed->focus && sdl_key)
- {
- if (ed->hide)
- {
- for (i=0; ed->str[i]; i++)
- echo[i] = 0x8D;
- echo[i] = 0;
- str = echo;
- }
- else
- str = ed->str;
-
- l = strlen(ed->str);
- switch (sdl_key)
- {
- case SDLK_HOME:
- ed->cursor = 0;
- break;
- case SDLK_END:
- ed->cursor = l;
- break;
- case SDLK_LEFT:
- if (ed->cursor > 0)
- ed->cursor --;
- break;
- case SDLK_RIGHT:
- if (ed->cursor < l)
- ed->cursor ++;
- break;
- case SDLK_DELETE:
- if (sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))
- ed->str[ed->cursor] = 0;
- else if (ed->cursor < l)
- memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor);
- break;
- case SDLK_BACKSPACE:
- if (sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))
- {
- if (ed->cursor > 0)
- memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1);
- ed->cursor = 0;
- }
- else if (ed->cursor > 0)
- {
- ed->cursor--;
- memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor);
- }
- break;
- default:
- if(sdl_mod & (KMOD_CTRL) && sdl_key=='c')//copy
- {
- clipboard_push_text(ed->str);
- break;
- }
- else if(sdl_mod & (KMOD_CTRL) && sdl_key=='v')//paste
- {
- char *paste = clipboard_pull_text();
- int pl = strlen(paste);
- if ((textwidth(str)+textwidth(paste) > ed->w-14 && !ed->multiline) || (pl+strlen(ed->str)>255) || (float)(((textwidth(str)+textwidth(paste))/(ed->w-14)*12) > ed->h && ed->multiline))
- break;
- memmove(ed->str+ed->cursor+pl, ed->str+ed->cursor, l-ed->cursor+1);
- memcpy(ed->str+ed->cursor,paste,pl);
- ed->cursor += pl;
- break;
- }
-#ifdef RAWINPUT
- if (sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255)
- {
- ch = sdl_key;
- if ((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS)))
- {
- if (ch>='a' && ch<='z')
- ch &= ~0x20;
- p = strchr(shift_0, ch);
- if (p)
- ch = shift_1[p-shift_0];
- }
- ts[0]=ed->hide?0x8D:ch;
- ts[1]=0;
- if ((textwidth(str)+textwidth(ts) > ed->w-14 && !ed->multiline) || (float)(((textwidth(str)+textwidth(ts))/(ed->w-14)*12) > ed->h && ed->multiline))
- break;
- memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor);
- ed->str[ed->cursor] = ch;
- ed->cursor++;
- }
-#else
- if (sdl_ascii>=' ' && sdl_ascii<127 && l<255)
- {
- ch = sdl_ascii;
- ts[0]=ed->hide?0x8D:ch;
- ts[1]=0;
- if ((textwidth(str)+textwidth(ts) > ed->w-14 && !ed->multiline) || (float)(((textwidth(str)+textwidth(ts))/(ed->w-14)*12) > ed->h && ed->multiline))
- break;
- memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor);
- ed->str[ed->cursor] = ch;
- ed->cursor++;
- }
-#endif
- break;
- }
- }
-}
-
-void ui_list_process(pixel * vid_buf, int mx, int my, int mb, ui_list *ed)
-{
- int i, ystart, selected = 0;
- if(ed->selected > ed->count || ed->selected < -1)
- {
- ed->selected = -1;
- }
- if(mx > ed->x && mx < ed->x+ed->w && my > ed->y && my < ed->y+ed->h)
- {
- ed->focus = 1;
- if(mb)
- {
- ystart = ed->y-(ed->count*8);
- if(ystart < 5)
- ystart = 5;
- while (!sdl_poll())
- {
- mb = mouse_get_state(&mx, &my);
- if (!mb)
- break;
- }
-
- while (!sdl_poll() && !selected)
- {
- mb = mouse_get_state(&mx, &my);
- for(i = 0; i < ed->count; i++)
- {
- if(mx > ed->x && mx < ed->x+ed->w && my > (ystart + i*16) && my < (ystart + i * 16) + 16)
- {
- if(mb){
- ed->selected = i;
- selected = 1;
- }
- fillrect(vid_buf, ed->x, ystart + i * 16, ed->w, 16, 255, 255, 255, 25);
- drawtext(vid_buf, ed->x + 4, ystart + i * 16 + 5, ed->items[i], 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, ed->x + 4, ystart + i * 16 + 5, ed->items[i], 192, 192, 192, 255);
- }
- draw_line(vid_buf, ed->x, ystart + i * 16, ed->x+ed->w, ystart + i * 16, 128, 128, 128, XRES+BARSIZE);
- }
- drawrect(vid_buf, ed->x, ystart, ed->w, ed->count*16, 255, 255, 255, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- clearrect(vid_buf, ed->x-2, ystart-2, ed->w+4, (ed->count*16)+4);
-
- if(!selected && mb)
- break;
- }
- while (!sdl_poll())
- {
- mb = mouse_get_state(&mx, &my);
- if (!mb)
- break;
- }
-
- if(ed->selected!=-1)
- strcpy(ed->str, ed->items[ed->selected]);
- }
- }
- else
- {
- ed->focus = 0;
- }
-}
-
-void ui_list_draw(pixel *vid_buf, ui_list *ed)
-{
- if(ed->selected > ed->count || ed->selected < -1)
- {
- ed->selected = -1;
- }
- if (ed->focus)
- {
- drawrect(vid_buf, ed->x, ed->y, ed->w, ed->h, 255, 255, 255, 255);
- }
- else
- {
- drawrect(vid_buf, ed->x, ed->y, ed->w, ed->h, 192, 192, 192, 255);
- }
- if(ed->selected!=-1)
- {
- drawtext(vid_buf, ed->x+4, ed->y+5, ed->items[ed->selected], 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, ed->x+4, ed->y+5, ed->def, 192, 192, 192, 255);
- }
-}
-
-void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed)
-{
- int w = 12;
- if (ed->checked)
- {
- drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255);
- }
- if (ed->focus)
- {
- drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255);
- }
- else
- {
- drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255);
- }
-}
-
-void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed)
-{
- int w = 12;
-
- if (mb && !mbq)
- {
- if (mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w)
- {
- ed->checked = (ed->checked)?0:1;
- }
- }
- else
- {
- if (mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w)
- {
- ed->focus = 1;
- }
- else
- {
- ed->focus = 0;
- }
- }
-}
-
-void ui_radio_draw(pixel *vid_buf, ui_checkbox *ed)
-{
- if (ed->checked)
- {
- int nx, ny;
- for(nx=-6; nx<=6; nx++)
- for(ny=-6; ny<=6; ny++)
- if((nx*nx+ny*ny)<10)
- blendpixel(vid_buf, ed->x+6+nx, ed->y+6+ny, 128, 128, 128, 255);
- }
- if (ed->focus)
- {
- int nx, ny;
- for(nx=-6; nx<=6; nx++)
- for(ny=-6; ny<=6; ny++)
- if((nx*nx+ny*ny)<40 && (nx*nx+ny*ny)>28)
- blendpixel(vid_buf, ed->x+6+nx, ed->y+6+ny, 255, 255, 255, 255);
- }
- else
- {
- int nx, ny;
- for(nx=-6; nx<=6; nx++)
- for(ny=-6; ny<=6; ny++)
- if((nx*nx+ny*ny)<40 && (nx*nx+ny*ny)>28)
- blendpixel(vid_buf, ed->x+6+nx, ed->y+6+ny, 128, 128, 128, 255);
- }
-}
-
-void ui_radio_process(int mx, int my, int mb, int mbq, ui_checkbox *ed)
-{
- int w = 12;
-
- if (mb && !mbq)
- {
- if (mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w)
- {
- ed->checked = (ed->checked)?0:1;
- }
- }
- else
- {
- if (mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w)
- {
- ed->focus = 1;
- }
- else
- {
- ed->focus = 0;
- }
- }
-}
-
-void ui_copytext_draw(pixel *vid_buf, ui_copytext *ed)
-{
- int g = 180, i = 0;
- if (!ed->state) {
- if (ed->hover) {
- i = 0;
- } else {
- i = 100;
- }
- g = 255;
- drawtext(vid_buf, (ed->x+(ed->width/2))-(textwidth("Click the box to copy the text")/2), ed->y-12, "Click the box to copy the text", 255, 255, 255, 255-i);
- } else {
- i = 0;
- drawtext(vid_buf, (ed->x+(ed->width/2))-(textwidth("Copied!")/2), ed->y-12, "Copied!", 255, 255, 255, 255-i);
- g = 190;
- }
-
- drawrect(vid_buf, ed->x, ed->y, ed->width, ed->height, g, 255, g, 255-i);
- drawrect(vid_buf, ed->x+1, ed->y+1, ed->width-2, ed->height-2, g, 255, g, 100-i);
- drawtext(vid_buf, ed->x+6, ed->y+5, ed->text, g, 255, g, 230-i);
-}
-
-void ui_copytext_process(int mx, int my, int mb, int mbq, ui_copytext *ed)
-{
- if (my>=ed->y && my<=ed->y+ed->height && mx>=ed->x && mx<=ed->x+ed->width && !ed->state) {
- if (mb && !mbq) {
- clipboard_push_text(ed->text);
- ed->state = 1;
- }
- ed->hover = 1;
- } else {
- ed->hover = 0;
- }
-}
-
-void ui_richtext_draw(pixel *vid_buf, ui_richtext *ed)
-{
- ed->str[511] = 0;
- ed->printstr[511] = 0;
- drawtext(vid_buf, ed->x, ed->y, ed->printstr, 255, 255, 255, 255);
-}
-
-int markup_getregion(char *text, char *action, char *data, char *atext){
- int datamarker = 0;
- int terminator = 0;
- int minit;
- if (sregexp(text, "^{a:.*|.*}")==0)
- {
- *action = text[1];
- for (minit=3; text[minit-1] != '|'; minit++)
- datamarker = minit + 1;
- for (minit=datamarker; text[minit-1] != '}'; minit++)
- terminator = minit + 1;
- strncpy(data, text+3, datamarker-4);
- strncpy(atext, text+datamarker, terminator-datamarker-1);
- return terminator;
- }
- else
- {
- return 0;
- }
-}
-
-void ui_richtext_settext(char *text, ui_richtext *ed)
-{
- int pos = 0, action = 0, ppos = 0, ipos = 0;
- memset(ed->printstr, 0, 512);
- memset(ed->str, 0, 512);
- strcpy(ed->str, text);
- //strcpy(ed->printstr, text);
- for(action = 0; action < 6; action++){
- ed->action[action] = 0;
- memset(ed->actiondata[action], 0, 256);
- memset(ed->actiontext[action], 0, 256);
- }
- action = 0;
- for(pos = 0; pos<512; ){
- if(!ed->str[pos])
- break;
- if(ed->str[pos] == '{'){
- int mulen = 0;
- mulen = markup_getregion(ed->str+pos, &ed->action[action], ed->actiondata[action], ed->actiontext[action]);
- if(mulen){
- ed->regionss[action] = ipos;
- ed->regionsf[action] = ipos + strlen(ed->actiontext[action]);
- //printf("%c, %s, %s [%d, %d]\n", ed->action[action], ed->actiondata[action], ed->actiontext[action], ed->regionss[action], ed->regionsf[action]);
- strcpy(ed->printstr+ppos, ed->actiontext[action]);
- ppos+=strlen(ed->actiontext[action]);
- ipos+=strlen(ed->actiontext[action]);
- pos+=mulen;
- action++;
- }
- else
- {
- pos++;
- }
- } else {
- ed->printstr[ppos] = ed->str[pos];
- ppos++;
- pos++;
- ipos++;
- if(ed->str[pos] == '\b'){
- ipos-=2;
- }
- }
- }
- ed->printstr[ppos] = 0;
- //printf("%s\n", ed->printstr);
-}
-
-void ui_richtext_process(int mx, int my, int mb, int mbq, ui_richtext *ed)
-{
- int action = 0;
- int currentpos = 0;
- if(mx>ed->x && mx < ed->x+textwidth(ed->printstr) && my > ed->y && my < ed->y + 10 && mb && !mbq){
- currentpos = textwidthx(ed->printstr, mx-ed->x);
- for(action = 0; action < 6; action++){
- if(currentpos >= ed->regionss[action] && currentpos <= ed->regionsf[action])
- {
- //Do action
- if(ed->action[action]=='a'){
- //Open link
- open_link(ed->actiondata[action]);
- }
- break;
- }
- }
- }
-}
-
-void draw_svf_ui(pixel *vid_buf, int alternate)// all the buttons at the bottom
-{
- int c;
-
- //the open browser button
- if(alternate)
- {
- fillrect(vid_buf, 0, YRES+(MENUSIZE-16)-1, 18, 16, 255, 255, 255, 255);
- drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 0, 0, 0, 255);
- } else {
- drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255);
- drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255);
- }
-
- // the reload button
- c = (svf_last) ? 255 : 128;
- drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255);
- drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255);
-
- // the save sim button
- if(alternate)
- {
- fillrect(vid_buf, 36, YRES+(MENUSIZE-16)-1, 152, 16, 255, 255, 255, 255);
- drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", 0, 0, 0, 255);
- if(svf_fileopen)
- drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_filename, 0, 0, 0, 255);
- else
- drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[save to disk]", 0, 0, 0, 255);
- } else {
- c = svf_login ? 255 : 128;
- drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255);
- if (svf_open)
- drawtextmax(vid_buf, 58, YRES+(MENUSIZE-12), 125, svf_name, c, c, c, 255);
- else
- drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255);
- drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255);
- if (svf_open && svf_own)
- drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255);
- }
-
- c = (svf_login && svf_open) ? 255 : 128;
-
- //the vote buttons
- drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255);
- drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255);
-
- if (svf_myvote==1 && (svf_login && svf_open))
- {
- fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255);
- }
- else if (svf_myvote==-1 && (svf_login && svf_open))
- {
- fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255);
- }
- drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c);
- drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c);
-
- //the tags button
- drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255);
- if (svf_tags[0])
- drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), XRES+BARSIZE-405, svf_tags, c, c, c, 255);
- else
- drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255);
-
- drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255);
-
- //the clear sim button------------some of the commented values are wrong
- drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255);
-
- //the login button
- drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255);
- if (svf_login)
- drawtextmax(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), 66, svf_user, 255, 255, 255, 255);
- else
- drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255);
-
- //te pause button
- if (sys_pause)
- {
- fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255);
- drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255);
- }
- else
- {
- drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255);
- }
-
- //The simulation options button, used to be the heat sim button
- {
- drawtext(vid_buf, XRES-156+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xCF", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255);
- }
-
- //the view mode button
- addchar(vid_buf, XRES-29+BARSIZE, YRES+(MENUSIZE-13), 0xD8, 255, 0, 0, 255);
- addchar(vid_buf, XRES-29+BARSIZE, YRES+(MENUSIZE-13), 0xD9, 0, 255, 0, 255);
- addchar(vid_buf, XRES-29+BARSIZE, YRES+(MENUSIZE-13), 0xDA, 0, 0, 255, 255);
- drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255);
-
- // special icons for admin/mods
- if (svf_admin)
- {
- drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255);
- drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255);
- drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255);
- }
- else if (svf_mod)
- {
- drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255);
- drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255);
- }//else if(amd)
- // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here?
-}
-
-void error_ui(pixel *vid_buf, int err, char *txt)
-{
- int x0=(XRES-240)/2,y0=YRES/2,b=1,bq,mx,my,textheight;
- char *msg;
-
- msg = malloc(strlen(txt)+16);
- if (err)
- sprintf(msg, "%03d %s", err, txt);
- else
- sprintf(msg, "%s", txt);
- textheight = textwrapheight(msg, 240);
- y0 -= (52+textheight)/2;
- if (y0<2)
- y0 = 2;
- if (y0+50+textheight>YRES)
- textheight = YRES-50-y0;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, 244, 52+textheight);
- drawrect(vid_buf, x0, y0, 240, 48+textheight, 192, 192, 192, 255);
- if (err)
- drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255);
- else
- drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255);
- drawtextwrap(vid_buf, x0+8, y0+26, 224, msg, 255, 255, 255, 255);
- drawtext(vid_buf, x0+5, y0+textheight+37, "Dismiss", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+textheight+32, 240, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+240 && my>=y0+textheight+32 && my<=y0+textheight+48)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- free(msg);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-
-typedef struct int_pair
-{
- int first, second;
-} int_pair;
-
-int int_pair_cmp (const void * a, const void * b)
-{
- int_pair *ap = a;
- int_pair *bp = a;
- return ( ap->first - bp->first );
-}
-
-void element_search_ui(pixel *vid_buf, int * slp, int * srp)
-{
- int windowHeight = 300, windowWidth = 240;
- int x0 = (XRES-windowWidth)/2, y0 = (YRES-windowHeight)/2, b = 1, bq, mx, my;
- int toolx = 0, tooly = 0, i, xoff, yoff, c, found;
- char tempCompare[512];
- char tempString[512];
- int_pair tempInts[PT_NUM];
- ui_edit ed;
- int selectedl = -1;
- int selectedr = -1;
- int firstResult = -1, hover = -1;
-
- ed.x = x0+12;
- ed.y = y0+30;
- ed.w = windowWidth - 20;
- ed.nx = 1;
- ed.def = "[element name]";
- ed.focus = 1;
- ed.hide = 0;
- ed.cursor = 0;
- ed.multiline = 0;
- ed.str[0] = 0;
-
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, windowWidth+4, windowHeight+4);
- drawrect(vid_buf, x0, y0, windowWidth, windowHeight, 192, 192, 192, 255);
-
- drawtext(vid_buf, x0+8, y0+8, "Element Search", 255, 255, 255, 255);
-
- drawrect(vid_buf, ed.x-4, ed.y-5, ed.w+4, 16, 192, 192, 192, 255);
- ui_edit_draw(vid_buf, &ed);
- ui_edit_process(mx, my, b, &ed);
-
- drawrect(vid_buf, ed.x-4, (ed.y-5)+20, ed.w+4, windowHeight-((ed.y-5)), 192, 192, 192, 255);
- xoff = (ed.x-4)+6;
- yoff = ((ed.y-5)+20)+4;
- toolx = 0;
- tooly = 0;
-
- drawtext(vid_buf, xoff+toolx+4, yoff+tooly+3, "Matches:", 255, 255, 255, 180);
- draw_line(vid_buf, xoff+toolx+2, yoff+tooly+14, xoff+toolx+5+(ed.w-16), yoff+tooly+14, 180, 180, 180, XRES+BARSIZE);
- tooly += 17;
-
- //Covert input to lower case
- c = 0;
- while (ed.str[c]) { tempString[c] = tolower(ed.str[c]); c++; } tempString[c] = 0;
-
- firstResult = -1;
- hover = -1;
- for(i = 0; i < PT_NUM; i++)
- {
- c = 0;
- while (ptypes[i].name[c]) { tempCompare[c] = tolower(ptypes[i].name[c]); c++; } tempCompare[c] = 0;
- if(strstr(tempCompare, tempString)!=0 && ptypes[i].enabled)
- {
- if(firstResult==-1)
- firstResult = i;
- toolx += draw_tool_xy(vid_buf, toolx+xoff, tooly+yoff, i, ptypes[i].pcolors)+5;
- if (!bq && mx>=xoff+toolx-32 && mx<xoff+toolx && my>=yoff+tooly && my<yoff+tooly+15)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 255, 55, 55, 255);
- hover = i;
- }
- else if (i==selectedl || i==*slp)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 255, 55, 55, 255);
- }
- else if (i==selectedr || i==*srp)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 55, 55, 255, 255);
- }
- if(toolx > ed.w-4)
- {
- tooly += 18;
- toolx = 0;
- }
- if(tooly>windowHeight-((ed.y-5)+20))
- break;;
- }
- }
-
- if(toolx>0)
- {
- toolx = 0;
- tooly += 18;
- }
-
- if(tooly<windowHeight-((ed.y-5)+20))
- {
- drawtext(vid_buf, xoff+toolx+4, yoff+tooly+3, "Related:", 255, 255, 255, 180);
- draw_line(vid_buf, xoff+toolx+2, yoff+tooly+14, xoff+toolx+5+(ed.w-16), yoff+tooly+14, 180, 180, 180, XRES+BARSIZE);
- tooly += 17;
-
- found = 0;
- for(i = 0; i < PT_NUM; i++)
- {
- c = 0;
- while (ptypes[i].descs[c]) { tempCompare[c] = tolower(ptypes[i].descs[c]); c++; } tempCompare[c] = 0;
- if(strstr(tempCompare, tempString)!=0 && ptypes[i].enabled)
- {
- tempInts[found].first = strstr(tempCompare, tempString);
- tempInts[found++].second = i;
- }
- }
-
- qsort(tempInts, found, sizeof(int_pair), int_pair_cmp);
-
- for(i = 0; i < found; i++)
- {
- if(firstResult==-1)
- firstResult = tempInts[i].second;
- toolx += draw_tool_xy(vid_buf, toolx+xoff, tooly+yoff, tempInts[i].second, ptypes[tempInts[i].second].pcolors)+5;
- if (!bq && mx>=xoff+toolx-32 && mx<xoff+toolx && my>=yoff+tooly && my<yoff+tooly+15)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 255, 55, 55, 255);
- hover = tempInts[i].second;
- }
- else if (tempInts[i].second==selectedl || tempInts[i].second==*slp)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 255, 55, 55, 255);
- }
- else if (tempInts[i].second==selectedr || tempInts[i].second==*srp)
- {
- drawrect(vid_buf, xoff+toolx-32, yoff+tooly-1, 29, 17, 55, 55, 255, 255);
- }
- if(toolx > ed.w-4)
- {
- tooly += 18;
- toolx = 0;
- }
- if(tooly>windowHeight-((ed.y-5)+18))
- break;
- }
- }
-
- if(b==1 && hover!=-1)
- {
- selectedl = hover;
- break;
- }
- if(b==4 && hover!=-1)
- {
- selectedr = hover;
- break;
- }
-
- drawtext(vid_buf, x0+5, y0+windowHeight-12, "Dismiss", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+windowHeight-16, windowWidth, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+windowWidth && my>=y0+windowHeight-16 && my<=y0+windowHeight)
- break;
-
- if (sdl_key==SDLK_RETURN)
- {
- if(selectedl==-1)
- selectedl = firstResult;
- break;
- }
- if (sdl_key==SDLK_ESCAPE)
- {
- selectedl = -1;
- selectedr = -1;
- break;
- }
- }
-
- if(selectedl!=-1)
- *slp = selectedl;
- if(selectedr!=-1)
- *srp = selectedr;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-
-char *input_ui(pixel *vid_buf, char *title, char *prompt, char *text, char *shadow)
-{
- int xsize = 244;
- int ysize = 90;
- int edity, editx;
- int x0=(XRES-xsize)/2,y0=(YRES-MENUSIZE-ysize)/2,b=1,bq,mx,my;
- ui_edit ed;
-
- edity = y0+50;
- editx = x0+12;
-
- ed.x = editx;
- ed.y = edity;
- ed.w = xsize - 20;
- ed.nx = 1;
- ed.def = shadow;
- ed.focus = 0;
- ed.hide = 0;
- ed.cursor = 0;
- ed.multiline = 0;
- strncpy(ed.str, text, 254);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, title, 160, 160, 255, 255);
- drawtext(vid_buf, x0+8, y0+26, prompt, 255, 255, 255, 255);
-
- drawrect(vid_buf, ed.x-4, ed.y-5, ed.w+4, 16, 192, 192, 192, 255);
-
- ui_edit_draw(vid_buf, &ed);
- ui_edit_process(mx, my, b, &ed);
-
- drawtext(vid_buf, x0+5, y0+ysize-11, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+ysize-16, xsize, 16, 192, 192, 192, 255);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+xsize && my>=y0+ysize-16 && my<=y0+ysize)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- return mystrdup(ed.str);
-}
-
-void prop_edit_ui(pixel *vid_buf, int x, int y)
-{
- pixel * o_vid_buf;
- float valuef;
- unsigned char valuec;
- int valuei;
- int format;
- size_t propoffset;
- char *listitems[] = {"type", "life", "ctype", "temp", "tmp", "tmp2", "vy", "vx", "x", "y", "dcolour"};
- int listitemscount = 11;
- int xsize = 244;
- int ysize = 87;
- int edity, editx, edit2y, edit2x;
- int x0=(XRES-xsize)/2,y0=(YRES-MENUSIZE-ysize)/2,b=1,bq,mx,my;
- ui_list ed;
- ui_edit ed2;
-
- edity = y0+25;
- editx = x0+8;
-
- edit2y = y0+50;
- edit2x = x0+12;
-
- ed.x = editx;
- ed.y = edity;
- ed.w = xsize - 16;
- ed.h = 16;
- ed.def = "[property]";
- ed.selected = -1;
- ed.items = listitems;
- ed.count = listitemscount;
-
- ed2.x = edit2x;
- ed2.y = edit2y;
- ed2.w = xsize - 20;
- ed2.nx = 1;
- ed2.def = "[value]";
- ed2.focus = 0;
- ed2.hide = 0;
- ed2.cursor = 0;
- ed2.multiline = 0;
- ed2.str[0] = 0;
- strncpy(ed2.str, "0", 254);
- strncpy(ed.str, "ctype", 254);
-
- o_vid_buf = (pixel*)calloc((YRES+MENUSIZE) * (XRES+BARSIZE), PIXELSIZE);
- if (o_vid_buf)
- memcpy(o_vid_buf, vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- if (o_vid_buf)
- memcpy(vid_buf, o_vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, "Change particle property", 160, 160, 255, 255);
- //drawtext(vid_buf, x0+8, y0+26, prompt, 255, 255, 255, 255);
-
- //drawrect(vid_buf, ed.x-4, ed.y-5, ed.w+4, 16, 192, 192, 192, 255);
- drawrect(vid_buf, ed2.x-4, ed2.y-5, ed2.w+4, 16, 192, 192, 192, 255);
-
- ui_list_draw(vid_buf, &ed);
- ui_list_process(vid_buf, mx, my, b, &ed);
- ui_edit_draw(vid_buf, &ed2);
- ui_edit_process(mx, my, b, &ed2);
-
- drawtext(vid_buf, x0+5, y0+ysize-11, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+ysize-16, xsize, 16, 192, 192, 192, 255);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+xsize && my>=y0+ysize-16 && my<=y0+ysize)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- goto exit;
- }
-
- if(ed.selected!=-1)
- {
- if (strcmp(ed.str,"type")==0){
- propoffset = offsetof(particle, type);
- format = 1;
- } else if (strcmp(ed.str,"life")==0){
- propoffset = offsetof(particle, life);
- format = 0;
- } else if (strcmp(ed.str,"ctype")==0){
- propoffset = offsetof(particle, ctype);
- format = 1;
- } else if (strcmp(ed.str,"temp")==0){
- propoffset = offsetof(particle, temp);
- format = 2;
- } else if (strcmp(ed.str,"tmp")==0){
- propoffset = offsetof(particle, tmp);
- format = 0;
- } else if (strcmp(ed.str,"tmp2")==0){
- propoffset = offsetof(particle, tmp2);
- format = 0;
- } else if (strcmp(ed.str,"vy")==0){
- propoffset = offsetof(particle, vy);
- format = 2;
- } else if (strcmp(ed.str,"vx")==0){
- propoffset = offsetof(particle, vx);
- format = 2;
- } else if (strcmp(ed.str,"x")==0){
- propoffset = offsetof(particle, x);
- format = 2;
- } else if (strcmp(ed.str,"y")==0){
- propoffset = offsetof(particle, y);
- format = 2;
- } else if (strcmp(ed.str,"dcolour")==0){
- propoffset = offsetof(particle, dcolour);
- format = 3;
- }
- } else {
- error_ui(vid_buf, 0, "Invalid property");
- goto exit;
- }
-
- if(format==0){
- sscanf(ed2.str, "%d", &valuei);
- flood_prop(x, y, propoffset, &valuei, format);
- }
- if(format==1){
- int isint = 1, i;
- //Check if it's an element name
- for(i = 0; i < strlen(ed2.str); i++)
- {
- if(!(ed2.str[i] >= '0' && ed2.str[i] <= '9'))
- {
- isint = 0;
- break;
- }
- }
- if(isint)
- {
- sscanf(ed2.str, "%u", &valuei);
- }
- else
- {
- if(!console_parse_type(ed2.str, &valuei, NULL))
- {
- error_ui(vid_buf, 0, "Invalid element name");
- goto exit;
- }
- }
- valuec = (unsigned char)valuei;
- flood_prop(x, y, propoffset, &valuec, format);
- }
- if(format==2){
- sscanf(ed2.str, "%f", &valuef);
- flood_prop(x, y, propoffset, &valuef, format);
- }
- if(format==3){
- int j;
- unsigned int valueui;
- if(ed2.str[0] == '#') // #FFFFFFFF
- {
- //Convert to lower case
- for(j = 0; j < strlen(ed2.str); j++)
- ed2.str[j] = tolower(ed2.str[j]);
- sscanf(ed2.str, "#%x", &valueui);
- printf("%s, %u\n", ed2.str, valueui);
- }
- else if(ed2.str[0] == '0' && ed2.str[1] == 'x') // 0xFFFFFFFF
- {
- //Convert to lower case
- for(j = 0; j < strlen(ed2.str); j++)
- ed2.str[j] = tolower(ed2.str[j]);
- sscanf(ed2.str, "0x%x", &valueui);
- printf("%s, %u\n", ed2.str, valueui);
- }
- else
- {
- sscanf(ed2.str, "%d", &valueui);
- }
- flood_prop(x, y, propoffset, &valueui, 0);
- }
-exit:
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-
-void info_ui(pixel *vid_buf, char *top, char *txt)
-{
- int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, 244, 64);
- drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255);
- drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255);
- drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+240 && my>=y0+44 && my<=y0+60)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-
-void info_box(pixel *vid_buf, char *msg)
-{
- int w = textwidth(msg)+16;
- int x0=(XRES-w)/2,y0=(YRES-24)/2;
-
- clearrect(vid_buf, x0-2, y0-2, w+4, 28);
- drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255);
-#ifndef RENDERER
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-#endif
-}
-
-void info_box_overlay(pixel *vid_buf, char *msg)
-{
- int w = textwidth(msg)+16;
- int x0=(XRES-w)/2,y0=(YRES-24)/2;
-
- clearrect(vid_buf, x0-2, y0-2, w+4, 28);
- drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255);
-}
-
-void copytext_ui(pixel *vid_buf, char *top, char *txt, char *copytxt)
-{
- int state = 0;
- int i;
- int g = 255;
- int xsize = 244;
- int ysize = 90;
- int x0=(XRES-xsize)/2,y0=(YRES-MENUSIZE-ysize)/2,b=1,bq,mx,my;
- int buttonx = 0;
- int buttony = 0;
- int buttonwidth = 0;
- int buttonheight = 0;
- ui_copytext ed;
-
- buttonwidth = textwidth(copytxt)+12;
- buttonheight = 10+8;
- buttony = y0+50;
- buttonx = x0+(xsize/2)-(buttonwidth/2);
-
- ed.x = buttonx;
- ed.y = buttony;
- ed.width = buttonwidth;
- ed.height = buttonheight;
- ed.hover = 0;
- ed.state = 0;
- strcpy(ed.text, copytxt);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255);
- drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255);
-
- ui_copytext_draw(vid_buf, &ed);
- ui_copytext_process(mx, my, b, bq, &ed);
-
- drawtext(vid_buf, x0+5, y0+ysize-11, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+ysize-16, xsize, 16, 192, 192, 192, 255);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0 && mx<x0+xsize && my>=y0+ysize-16 && my<=y0+ysize)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn)
-{
- int x0=(XRES-240)/2,y0=YRES/2,b=1,bq,mx,my,textheight;
- int ret = 0;
-
- textheight = textwrapheight(msg, 240);
- y0 -= (52+textheight)/2;
- if (y0<2)
- y0 = 2;
- if (y0+50+textheight>YRES)
- textheight = YRES-50-y0;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, 244, 52+textheight);
- drawrect(vid_buf, x0, y0, 240, 48+textheight, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255);
- drawtextwrap(vid_buf, x0+8, y0+26, 224, msg, 255, 255, 255, 255);
- drawtext(vid_buf, x0+5, y0+textheight+37, "Cancel", 255, 255, 255, 255);
- drawtext(vid_buf, x0+165, y0+textheight+37, btn, 255, 216, 32, 255);
- drawrect(vid_buf, x0, y0+textheight+32, 160, 16, 192, 192, 192, 255);
- drawrect(vid_buf, x0+160, y0+textheight+32, 80, 16, 192, 192, 192, 255);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b && !bq && mx>=x0+160 && mx<x0+240 && my>=y0+textheight+32 && my<=y0+textheight+48)
- {
- ret = 1;
- break;
- }
-
- if (b && !bq && mx>=x0 && mx<x0+160 && my>=y0+textheight+32 && my<=y0+textheight+48)
- break;
-
- if (sdl_key==SDLK_RETURN)
- {
- ret = 1;
- break;
- }
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- return ret;
-}
-
-void login_ui(pixel *vid_buf)
-{
- int x0=(XRES+BARSIZE-192)/2,y0=(YRES+MENUSIZE-80)/2,b=1,bq,mx,my,err;
- ui_edit ed1,ed2;
- char *res;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- ed1.x = x0+25;
- ed1.y = y0+25;
- ed1.w = 158;
- ed1.nx = 1;
- ed1.def = "[user name]";
- ed1.focus = 1;
- ed1.hide = 0;
- ed1.multiline = 0;
- ed1.cursor = strlen(svf_user);
- strcpy(ed1.str, svf_user);
- ed2.x = x0+25;
- ed2.y = y0+45;
- ed2.w = 158;
- ed2.nx = 1;
- ed2.def = "[password]";
- ed2.focus = 0;
- ed2.hide = 1;
- ed2.cursor = 0;
- ed2.multiline = 0;
- strcpy(ed2.str, "");
-
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255);
- clearrect(vid_buf, x0, y0, 192, 80);
- drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255);
- drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255);
- drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255);
- drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255);
- drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255);
- drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255);
- ui_edit_draw(vid_buf, &ed1);
- ui_edit_draw(vid_buf, &ed2);
- drawtext(vid_buf, x0+5, y0+69, "Sign out", 255, 255, 255, 255);
- drawtext(vid_buf, x0+187-textwidth("Sign in"), y0+69, "Sign in", 255, 255, 55, 255);
- drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255);
- drawrect(vid_buf, x0, y0+64, 96, 16, 192, 192, 192, 255);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- ui_edit_process(mx, my, b, &ed1);
- ui_edit_process(mx, my, b, &ed2);
-
- if (b && !bq && mx>=x0+9 && mx<x0+23 && my>=y0+22 && my<y0+36)
- break;
- if (b && !bq && mx>=x0+9 && mx<x0+23 && my>=y0+42 && my<y0+46)
- break;
- if (b && !bq && mx>=x0 && mx<x0+96 && my>=y0+64 && my<=y0+80)
- goto fail;
- if (b && !bq && mx>=x0+97 && mx<x0+192 && my>=y0+64 && my<=y0+80)
- break;
-
- if (sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB)
- {
- if (!ed1.focus)
- break;
- ed1.focus = 0;
- ed2.focus = 1;
- }
- if (sdl_key==SDLK_ESCAPE)
- {
- if (!ed1.focus && !ed2.focus)
- return;
- ed1.focus = 0;
- ed2.focus = 0;
- }
- }
-
- strcpy(svf_user, ed1.str);
- md5_ascii(svf_pass, (unsigned char *)ed2.str, 0);
- res = http_multipart_post(
- "http://" SERVER "/Login.api",
- NULL, NULL, NULL,
- svf_user, svf_pass, NULL,
- &err, NULL);
- if (err != 200)
- {
- error_ui(vid_buf, err, http_ret_text(err));
- if (res)
- free(res);
- goto fail;
- }
- if (res && !strncmp(res, "OK ", 3))
- {
- char *s_id,*u_e,*nres,*u_m,*mres;
- s_id = strchr(res+3, ' ');
- if (!s_id)
- goto fail;
- *(s_id++) = 0;
-
- u_e = strchr(s_id, ' ');
- if (!u_e)
- goto fail;
- *(u_e++) = 0;
-
- u_m = strchr(u_e, ' ');
- if (!u_m) {
- u_m = malloc(1);
- memset(u_m, 0, 1);
- }
- else
- *(u_m++) = 0;
-
- strcpy(svf_user_id, res+3);
- strcpy(svf_session_id, s_id);
- mres = mystrdup(u_e);
- nres = mystrdup(u_m);
-
- #ifdef DEBUG
- printf("{%s} {%s} {%s} {%s}\n", svf_user_id, svf_session_id, nres, mres);
- #endif
-
- if (!strncmp(nres, "ADMIN", 5))
- {
- svf_admin = 1;
- svf_mod = 0;
- }
- else if (!strncmp(nres, "MOD", 3))
- {
- svf_admin = 0;
- svf_mod = 1;
- }
- else
- {
- svf_admin = 0;
- svf_mod = 0;
- }
- svf_messages = atoi(mres);
- free(res);
- svf_login = 1;
- return;
- }
- if (!res)
- res = mystrdup("Unspecified Error");
- error_ui(vid_buf, 0, res);
- free(res);
-
-fail:
- strcpy(svf_user, "");
- strcpy(svf_pass, "");
- strcpy(svf_user_id, "");
- strcpy(svf_session_id, "");
- svf_login = 0;
- svf_own = 0;
- svf_admin = 0;
- svf_mod = 0;
- svf_messages = 0;
- save_presets(0);
-}
-
-int stamp_ui(pixel *vid_buf)
-{
- int b=1,bq,mx,my,d=-1,i,j,k,x,gx,gy,y,w,h,r=-1,stamp_page=0,per_page=GRID_X*GRID_Y,page_count;
- char page_info[64];
- // stamp_count-1 to avoid an extra page when there are per_page stamps on each page
- page_count = (stamp_count-1)/per_page+1;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, -1, -1, XRES+BARSIZE+1, YRES+MENUSIZE+1);
- k = stamp_page*per_page;//0;
- r = -1;
- d = -1;
- for (j=0; j<GRID_Y; j++)
- for (i=0; i<GRID_X; i++)
- {
- if (stamps[k].name[0])
- {
- gx = ((XRES/GRID_X)*i) + (XRES/GRID_X-XRES/GRID_S)/2;
- gy = ((((YRES-MENUSIZE+20)+15)/GRID_Y)*j) + ((YRES-MENUSIZE+20)/GRID_Y-(YRES-MENUSIZE+20)/GRID_S+10)/2 + 18;
- x = (XRES*i)/GRID_X + XRES/(GRID_X*2);
- y = (YRES*j)/GRID_Y + YRES/(GRID_Y*2);
- gy -= 20;
- w = stamps[k].thumb_w;
- h = stamps[k].thumb_h;
- x -= w/2;
- y -= h/2;
- if (stamps[k].thumb)
- {
- draw_image(vid_buf, stamps[k].thumb, gx+(((XRES/GRID_S)/2)-(w/2)), gy+(((YRES/GRID_S)/2)-(h/2)), w, h, 255);
- xor_rect(vid_buf, gx+(((XRES/GRID_S)/2)-(w/2)), gy+(((YRES/GRID_S)/2)-(h/2)), w, h);
- }
- else
- {
- drawtext(vid_buf, gx+8, gy+((YRES/GRID_S)/2)-4, "Error loading stamp", 255, 255, 255, 255);
- }
- if (mx>=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my<gy+4)
- {
- d = k;
- drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255);
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255);
- }
- else
- {
- if (mx>=gx && mx<gx+(XRES/GRID_S) && my>=gy && my<gy+(YRES/GRID_S) && stamps[k].thumb)
- {
- r = k;
- drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 210, 255);
- }
- else
- {
- drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255);
- }
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 150, 48, 32, 255);
- }
- drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(stamps[k].name)/2, gy+YRES/GRID_S+7, stamps[k].name, 192, 192, 192, 255);
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255);
- }
- k++;
- }
-
- sprintf(page_info, "Page %d of %d", stamp_page+1, page_count);
-
- drawtext(vid_buf, (XRES/2)-(textwidth(page_info)/2), YRES+MENUSIZE-14, page_info, 255, 255, 255, 255);
-
- if (stamp_page)
- {
- drawtext(vid_buf, 4, YRES+MENUSIZE-14, "\x96", 255, 255, 255, 255);
- drawrect(vid_buf, 1, YRES+MENUSIZE-18, 16, 16, 255, 255, 255, 255);
- }
- if (stamp_page<page_count-1)
- {
- drawtext(vid_buf, XRES-15, YRES+MENUSIZE-14, "\x95", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-18, YRES+MENUSIZE-18, 16, 16, 255, 255, 255, 255);
- }
-
- if (b==1&&d!=-1)
- {
- if (confirm_ui(vid_buf, "Do you want to delete?", stamps[d].name, "Delete"))
- {
- del_stamp(d);
- }
- }
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (b==1&&r!=-1)
- break;
- if (b==4&&r!=-1)
- {
- r = -1;
- break;
- }
-
- if ((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my<YRES+MENUSIZE-2) || sdl_wheel>0)
- {
- if (stamp_page)
- {
- stamp_page --;
- }
- sdl_wheel = 0;
- }
- if ((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my<YRES+MENUSIZE-2) || sdl_wheel<0)
- {
- if (stamp_page<page_count-1)
- {
- stamp_page ++;
- }
- sdl_wheel = 0;
- }
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- {
- r = -1;
- break;
- }
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- return r;
-}
-
-void tag_list_ui(pixel *vid_buf)
-{
- int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn;
- char *p,*q,s;
- char *tag=NULL, *op=NULL;
- ui_edit ed;
- struct strlist *vote=NULL,*down=NULL;
-
- ed.x = x0+25;
- ed.y = y0+221;
- ed.w = 158;
- ed.nx = 1;
- ed.def = "[new tag]";
- ed.focus = 0;
- ed.hide = 0;
- ed.cursor = 0;
- ed.multiline = 0;
- strcpy(ed.str, "");
-
- fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192);
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- op = tag = NULL;
-
- drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255);
- clearrect(vid_buf, x0, y0, 192, 256);
- drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255);
- p = svf_tags;
- s = svf_tags[0] ? ' ' : 0;
- y = 36 + y0;
- while (s)
- {
- q = strchr(p, ' ');
- if (!q)
- q = p+strlen(p);
- s = *q;
- *q = 0;
- if (svf_own || svf_admin || svf_mod)
- {
- drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255);
- drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255);
- d = 14;
- if (b && !bq && mx>=x0+18 && mx<x0+32 && my>=y-2 && my<y+12)
- {
- op = "delete";
- tag = mystrdup(p);
- }
- }
- else
- d = 0;
- vp = strlist_find(&vote, p);
- vn = strlist_find(&down, p);
- if ((!vp && !vn && !svf_own) || svf_admin || svf_mod)
- {
- drawtext(vid_buf, x0+d+20, y-1, "\x88", 32, 144, 32, 255);
- drawtext(vid_buf, x0+d+20, y-1, "\x87", 255, 255, 255, 255);
- if (b && !bq && mx>=x0+d+18 && mx<x0+d+32 && my>=y-2 && my<y+12)
- {
- op = "vote";
- tag = mystrdup(p);
- strlist_add(&vote, p);
- }
- drawtext(vid_buf, x0+d+34, y-1, "\x88", 144, 48, 32, 255);
- drawtext(vid_buf, x0+d+34, y-1, "\xA2", 255, 255, 255, 255);
- if (b && !bq && mx>=x0+d+32 && mx<x0+d+46 && my>=y-2 && my<y+12)
- {
- op = "down";
- tag = mystrdup(p);
- strlist_add(&down, p);
- }
- }
- if (vp)
- drawtext(vid_buf, x0+d+48+textwidth(p), y, " - voted!", 48, 192, 48, 255);
- if (vn)
- drawtext(vid_buf, x0+d+48+textwidth(p), y, " - voted.", 192, 64, 32, 255);
- drawtext(vid_buf, x0+d+48, y, p, 192, 192, 192, 255);
- *q = s;
- p = q+1;
- y += 16;
- }
- drawtext(vid_buf, x0+11, y0+219, "\x86", 32, 144, 32, 255);
- drawtext(vid_buf, x0+11, y0+219, "\x89", 255, 255, 255, 255);
- drawrect(vid_buf, x0+8, y0+216, 176, 16, 192, 192, 192, 255);
- ui_edit_draw(vid_buf, &ed);
- drawtext(vid_buf, x0+5, y0+245, "Close", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+240, 192, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- ui_edit_process(mx, my, b, &ed);
-
- if (b && mx>=x0 && mx<=x0+192 && my>=y0+240 && my<y0+256)
- break;
-
- if (op)
- {
- d = execute_tagop(vid_buf, op, tag);
- free(tag);
- op = tag = NULL;
- if (d)
- goto finish;
- }
-
- if (b && !bq && mx>=x0+9 && mx<x0+23 && my>=y0+218 && my<y0+232)
- {
- d = execute_tagop(vid_buf, "add", ed.str);
- strcpy(ed.str, "");
- ed.cursor = 0;
- if (d)
- goto finish;
- }
-
- if (sdl_key==SDLK_RETURN)
- {
- if (!ed.focus)
- break;
- d = execute_tagop(vid_buf, "add", ed.str);
- strcpy(ed.str, "");
- ed.cursor = 0;
- if (d)
- goto finish;
- }
- if (sdl_key==SDLK_ESCAPE)
- {
- if (!ed.focus)
- break;
- strcpy(ed.str, "");
- ed.cursor = 0;
- ed.focus = 0;
- }
- }
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- sdl_key = 0;
-
-finish:
- strlist_free(&vote);
-}
-
-int save_name_ui(pixel *vid_buf)
-{
- int x0=(XRES-420)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,idtxtwidth,nd=0;
- void *th;
- pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- ui_edit ed;
- ui_edit ed2;
- ui_checkbox cb;
- ui_copytext ctb;
-
- th = build_thumb(&ths, 0);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- ed.x = x0+25;
- ed.y = y0+25;
- ed.w = 158;
- ed.nx = 1;
- ed.def = "[simulation name]";
- ed.focus = 1;
- ed.hide = 0;
- ed.cursor = strlen(svf_name);
- ed.multiline = 0;
- strcpy(ed.str, svf_name);
-
- ed2.x = x0+13;
- ed2.y = y0+45;
- ed2.w = 166;
- ed2.h = 85;
- ed2.nx = 1;
- ed2.def = "[simulation description]";
- ed2.focus = 0;
- ed2.hide = 0;
- ed2.cursor = strlen(svf_description);
- ed2.multiline = 1;
- strcpy(ed2.str, svf_description);
-
- ctb.x = 0;
- ctb.y = YRES+MENUSIZE-20;
- ctb.width = textwidth(svf_id)+12;
- ctb.height = 10+7;
- ctb.hover = 0;
- ctb.state = 0;
- strcpy(ctb.text, svf_id);
-
-
- cb.x = x0+10;
- cb.y = y0+53+YRES/4;
- cb.focus = 0;
- cb.checked = svf_publish;
-
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- draw_rgba_image(vid_buf, save_to_server_image, 0, 0, 0.7);
-
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- drawrect(vid_buf, x0, y0, 420, 90+YRES/4, 192, 192, 192, 255);
- clearrect(vid_buf, x0, y0, 420, 90+YRES/4);
- drawtext(vid_buf, x0+8, y0+8, "New simulation name:", 255, 255, 255, 255);
- drawtext(vid_buf, x0+10, y0+23, "\x82", 192, 192, 192, 255);
- drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255);
-
- drawrect(vid_buf, x0+8, y0+40, 176, 95, 192, 192, 192, 255);
-
- ui_edit_draw(vid_buf, &ed);
- ui_edit_draw(vid_buf, &ed2);
-
- drawrect(vid_buf, x0+(205-XRES/3)/2-2+205, y0+30, XRES/3+3, YRES/3+3, 128, 128, 128, 255);
- render_thumb(th, ths, 0, vid_buf, x0+(205-XRES/3)/2+205, y0+32, 3);
-
- ui_checkbox_draw(vid_buf, &cb);
- drawtext(vid_buf, x0+34, y0+50+YRES/4, "Publish? (Do not publish others'\nworks without permission)", 192, 192, 192, 255);
-
- drawtext(vid_buf, x0+5, y0+79+YRES/4, "Save simulation", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+74+YRES/4, 192, 16, 192, 192, 192, 255);
-
- draw_line(vid_buf, x0+192, y0, x0+192, y0+90+YRES/4, 150, 150, 150, XRES+BARSIZE);
-
- if (svf_id[0])
- {
- //Save ID text and copybox
- idtxtwidth = textwidth("Current save ID: ");
- idtxtwidth += ctb.width;
- ctb.x = textwidth("Current save ID: ")+(XRES+BARSIZE-idtxtwidth)/2;
- drawtext(vid_buf, (XRES+BARSIZE-idtxtwidth)/2, YRES+MENUSIZE-15, "Current save ID: ", 255, 255, 255, 255);
-
- ui_copytext_draw(vid_buf, &ctb);
- ui_copytext_process(mx, my, b, bq, &ctb);
- }
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- ui_edit_process(mx, my, b, &ed);
- ui_edit_process(mx, my, b, &ed2);
- ui_checkbox_process(mx, my, b, bq, &cb);
-
- if ((b && !bq && ((mx>=x0+9 && mx<x0+23 && my>=y0+22 && my<y0+36) ||
- (mx>=x0 && mx<x0+192 && my>=y0+74+YRES/4 && my<y0+90+YRES/4)))
- || sdl_key==SDLK_RETURN)
- {
- if (th) free(th);
- if (!ed.str[0])
- return 0;
- nd = strcmp(svf_name, ed.str) || !svf_own;
- strncpy(svf_name, ed.str, 63);
- svf_name[63] = 0;
- strncpy(svf_description, ed2.str, 254);
- svf_description[254] = 0;
- if (nd)
- {
- strcpy(svf_id, "");
- strcpy(svf_tags, "");
- }
- svf_open = 1;
- svf_own = 1;
- svf_publish = cb.checked;
- svf_filename[0] = 0;
- svf_fileopen = 0;
- free(old_vid);
- return nd+1;
- }
- if (sdl_key==SDLK_ESCAPE)
- {
- if (!ed.focus)
- break;
- ed.focus = 0;
- }
- }
- if (th) free(th);
- free(old_vid);
- return 0;
-}
-
-//unused old function, with all the elements drawn at the bottom
-/*
-void menu_ui(pixel *vid_buf, int i, int *sl, int *sr)
-{
- int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0;
- pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- if (!old_vid)
- return;
- fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192);
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
- rows = ceil((float)msections[i].itemcount/16.0f);
- height = (ceil((float)msections[i].itemcount/16.0f)*18);
- width = restrict_flt(msections[i].itemcount*31, 0, 16*31);
- //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1);
- h = -1;
- x = XRES-BARSIZE-26;
- y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1;
- sy = y;
- //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows);
- fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100);
- drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255);
- fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100);
- drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255);
- drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255);
- if (i==SC_WALL)
- {
- for (n = 122; n<122+UI_WALLCOUNT; n++)
- {
- if (n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM)
- {
- if (x-26<=60)
- {
- x = XRES-BARSIZE-26;
- y += 19;
- }
- x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5;
- if (mx>=x+32 && mx<x+58 && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- h = n;
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255);
- }
- }
- }
- }
- else if (i==SC_SPECIAL)
- {
- for (n = 122; n<122+UI_WALLCOUNT; n++)
- {
- if (n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM)
- {
- if (x-26<=60)
- {
- x = XRES-BARSIZE-26;
- y += 19;
- }
- x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5;
- if (mx>=x+32 && mx<x+58 && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- h = n;
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255);
- }
- }
- }
- for (n = 0; n<PT_NUM; n++)
- {
- if (ptypes[n].menusection==i&&ptypes[n].menu==1)
- {
- if (x-26<=60)
- {
- x = XRES-BARSIZE-26;
- y += 19;
- }
- x -= draw_tool_xy(vid_buf, x, y, n, ptypes[n].pcolors)+5;
- if (mx>=x+32 && mx<x+58 && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- h = n;
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255);
- }
- }
- }
- }
- else
- {
- for (n = 0; n<PT_NUM; n++)
- {
- if (ptypes[n].menusection==i&&ptypes[n].menu==1)
- {
- if (x-26<=60)
- {
- x = XRES-BARSIZE-26;
- y += 19;
- }
- x -= draw_tool_xy(vid_buf, x, y, n, ptypes[n].pcolors)+5;
- if (mx>=x+32 && mx<x+58 && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- h = n;
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255);
- }
- }
- }
- }
-
- if (h==-1)
- {
- drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255);
- }
- else if (i==SC_WALL||(i==SC_SPECIAL&&h>=122))
- {
- drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255);
- }
-
-
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
- if (!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my<sy+height+9))
- {
- break;
- }
-
- if (b==1&&h!=-1)
- {
- *sl = h;
- break;
- }
- if (b==4&&h!=-1)
- {
- *sr = h;
- break;
- }
- //if(b==4&&h!=-1) {
- // h = -1;
- // break;
- //}
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- //drawtext(vid_buf, XRES+2, (12*i)+2, msections[i].icon, 255, 255, 255, 255);
-}
-*/
-//current menu function
-void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int *su, int *dae, int b, int bq, int mx, int my)
-{
- int h,x,y,n=0,height,width,sy,rows=0,xoff=0,fwidth;
- SEC = SEC2;
- rows = ceil((float)msections[i].itemcount/16.0f);
- height = (ceil((float)msections[i].itemcount/16.0f)*18);
- width = restrict_flt(msections[i].itemcount*31, 0, 16*31);
- fwidth = msections[i].itemcount*31;
- h = -1;
- x = XRES-BARSIZE-18;
- y = YRES+1;
- sy = y;
- if (i==SC_WALL)//wall menu
- {
- for (n = UI_WALLSTART; n<UI_WALLSTART+UI_WALLCOUNT; n++)
- {
- if (n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM&&n!=SPC_WIND&&n!=SPC_PGRV&&n!=SPC_NGRV&&n!=SPC_PROP)
- {
- /*if (x-18<=2)
- {
- x = XRES-BARSIZE-18;
- y += 19;
- }*/
- x -= draw_tool_xy(vid_buf, x, y, n, wtypes[n-UI_WALLSTART].colour)+5;
- if (!bq && mx>=x+32 && mx<x+58 && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- if (!bq && mx>=x+32 && mx<x+58 && my>=y && my< y+15&&(sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL)))
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 255, 255, 255);
- h = n;
- }
- else if (n==SLALT)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 0, 255, 255, 255);
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 255, 55, 55, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30, y-1, 29, 17, 55, 55, 255, 255);
- }
- }
- }
- }
- else if (i==SC_TOOL)//tools menu
- {
- for (n = UI_WALLSTART; n<UI_WALLSTART+UI_WALLCOUNT; n++)
- {
- if (n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM||n==SPC_WIND||n==SPC_PGRV||n==SPC_NGRV||n==SPC_PROP)
- {
- /*if (x-18<=0)
- {
- x = XRES-BARSIZE-18;
- y += 19;
- }*/
- x -= draw_tool_xy(vid_buf, x-xoff, y, n, wtypes[n-UI_WALLSTART].colour)+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15&&(sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL)))
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- h = n;
- }
- else if (n==SLALT)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 55, 55, 255, 255);
- }
- }
- }
- }
- else if (i==SC_SPECIAL)//special menu
- {
- if (fwidth > XRES-BARSIZE) { //fancy scrolling
- float overflow = fwidth-(XRES-BARSIZE), location = ((float)XRES-BARSIZE)/((float)(mx-(XRES-BARSIZE)));
- xoff = (int)(overflow / location);
- }
- for (n = 0; n<PT_NUM; n++)
- {
- if (ptypes[n].menusection==i&&ptypes[n].menu==1)
- {
- /*if (x-18<=0)
- {
- x = XRES-BARSIZE-18;
- y += 19;
- }*/
- x -= draw_tool_xy(vid_buf, x-xoff, y, n, ptypes[n].pcolors)+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15&&(sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL)))
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- h = n;
- }
- else if (n==SLALT)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 55, 55, 255, 255);
- }
- }
- }
- }
- else if(i==SC_LIFE)
- {
- int n2;
- if (fwidth > XRES-BARSIZE) { //fancy scrolling
- float overflow = fwidth-(XRES-BARSIZE), location = ((float)XRES-BARSIZE)/((float)(mx-(XRES-BARSIZE)));
- xoff = (int)(overflow / location);
- }
- for (n2 = 0; n2<NGOLALT; n2++)
- {
- n = PT_LIFE | (n2<<8);
- x -= draw_tool_xy(vid_buf, x-xoff, y, n, gmenu[n2].colour)+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15&&(sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_SHIFT)))
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- h = n;
- }
- else if (n==SLALT)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 55, 55, 255, 255);
- }
- }
- }
- else //all other menus
- {
- if (fwidth > XRES-BARSIZE) { //fancy scrolling
- float overflow = fwidth-(XRES-BARSIZE), location = ((float)XRES-BARSIZE)/((float)(mx-(XRES-BARSIZE)));
- xoff = (int)(overflow / location);
- }
- for (n = 0; n<PT_NUM; n++)
- {
- if (ptypes[n].menusection==i&&ptypes[n].menu==1)
- {
- x -= draw_tool_xy(vid_buf, x-xoff, y, n, ptypes[n].pcolors)+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15&&(sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL)))
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- h = n;
- }
- else if (n==SLALT)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 0, 255, 255, 255);
- }
- else if (n==*sl)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- }
- else if (n==*sr)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 55, 55, 255, 255);
- }
- }
- }
- }
- if (!bq && mx>=((XRES+BARSIZE)-16) ) //highlight menu section
- if (sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL))
- if (i>=0&&i<SC_TOTAL)
- SEC = i;
-
- if (h==-1)
- {
- drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255);
- }
- else if (i==SC_WALL||i==SC_TOOL)
- {
- drawtext(vid_buf, XRES-textwidth((char *)wtypes[h-UI_WALLSTART].descs)-BARSIZE, sy-10, (char *)wtypes[h-UI_WALLSTART].descs, 255, 255, 255, 255);
- }
- else if (i==SC_LIFE)
- {
- drawtext(vid_buf, XRES-textwidth((char *)gmenu[(h>>8)&0xFF].description)-BARSIZE, sy-10, (char *)gmenu[(h>>8)&0xFF].description, 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255);
- }
- //these are click events, b=1 is left click, b=4 is right
- //h has the value of the element it is over, and -1 if not over an element
- if (b==1&&h==-1)
- {
- if (sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL) && SEC>=0)
- {
- SLALT = -1;
- SEC2 = SEC;
- }
- }
- if (b==1&&h!=-1)
- {
- if (sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL))
- {
- SLALT = h;
- SEC2 = -1;
- }
- else {
- *sl = *su = h;
- *dae = 51;
- }
- }
- if (b==4&&h==-1)
- {
- if (sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL) && SEC>=0)
- {
- SLALT = -1;
- SEC2 = SEC;
- }
- }
- if (b==4&&h!=-1)
- {
- if (sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_CTRL))
- {
- SLALT = h;
- SEC2 = -1;
- }
- else {
- *sr = *su = h;
- *dae = 51;
- }
- }
-}
-int color_menu_ui(pixel *vid_buf, int i, int *cr, int *cg, int *cb, int b, int bq, int mx, int my, int *tool)
-{
- int h,x,y,n=0,height,width,sy,rows=0,xoff=0,fwidth,a,c;
- fwidth = colorsections[i].itemcount*31;
- h = -1;
- x = XRES-BARSIZE-18;
- y = YRES+5;
- sy = y;
- if(i==0) //color menu
- {
- if (fwidth > XRES-BARSIZE) { //fancy scrolling
- float overflow = fwidth-(XRES-BARSIZE), location = ((float)XRES-BARSIZE)/((float)(mx-(XRES-BARSIZE)));
- xoff = (int)(overflow / location);
- }
- for (n = 0; n<7; n++)
- {
- for (a=1; a<15; a++)
- {
- for (c=1; c<27; c++)
- {
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = colorlist[n].colour;
- }
- }
- x -= 26+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- }
- if(h!=-1)
- {
- drawtext(vid_buf, XRES-textwidth((char *)colorlist[h].descs)-BARSIZE, sy+20, (char *)colorlist[h].descs, 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, XRES-textwidth((char *)colorsections[i].name)-BARSIZE, sy+20, (char *)colorsections[i].name, 255, 255, 255, 255);
- }
- //these are click events, b=1 is left click, b=4 is right
- //h has the value of the element it is over, and -1 if not over an element
- if (b==1 && h!=-1)
- {
- *cr = PIXR(colorlist[h].colour);
- *cg = PIXG(colorlist[h].colour);
- *cb = PIXB(colorlist[h].colour);
- return 1;
- }
- }
- if(i==1) //deco tool menu
- {
- if (fwidth > XRES-BARSIZE) { //fancy scrolling
- float overflow = fwidth-(XRES-BARSIZE), location = ((float)XRES-BARSIZE)/((float)(mx-(XRES-BARSIZE)));
- xoff = (int)(overflow / location);
- }
- for (n = 0; n<4; n++)
- {
- for (a=1; a<15; a++)
- {
- for (c=1; c<27; c++)
- {
- if (n == DECO_LIGHTEN)
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = PIXRGB(PIXR(toollist[n].colour)-10*a, PIXG(toollist[n].colour)-10*a, PIXB(toollist[n].colour)-10*a);
- else if (n == DECO_DARKEN)
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = PIXRGB(PIXR(toollist[n].colour)+10*a, PIXG(toollist[n].colour)+10*a, PIXB(toollist[n].colour)+10*a);
- else if (n == DECO_SMUDGE)
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = PIXRGB(PIXR(toollist[n].colour), PIXG(toollist[n].colour)-5*c, PIXB(toollist[n].colour)+5*c);
- else if (n == DECO_DRAW)
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = PIXRGB(*cr,*cg,*cb);
- else
- vid_buf[(XRES+BARSIZE)*(y+a)+((x-xoff)+c)] = toollist[n].colour;
- }
- }
- x -= 26+5;
- if (!bq && mx>=x+32-xoff && mx<x+58-xoff && my>=y && my< y+15)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- h = n;
- }
- else if (n==*tool)
- {
- drawrect(vid_buf, x+30-xoff, y-1, 29, 17, 255, 55, 55, 255);
- }
- }
- if(h!=-1)
- {
- drawtext(vid_buf, XRES-textwidth((char *)toollist[h].descs)-BARSIZE, sy+20, (char *)toollist[h].descs, 255, 255, 255, 255);
- }
- else
- {
- drawtext(vid_buf, XRES-textwidth((char *)colorsections[i].name)-BARSIZE, sy+20, (char *)colorsections[i].name, 255, 255, 255, 255);
- }
- //these are click events, b=1 is left click, b=4 is right
- //h has the value of the element it is over, and -1 if not over an element
- if (b==1 && h!=-1)
- {
- *tool = h;
- return 0;
- }
- }
-
- return 0;
-}
-
-int quickoptions_tooltip_fade = 0;
-char * quickoptions_tooltip;
-int quickoptions_tooltip_y = 0;
-void quickoptions_menu(pixel *vid_buf, int b, int bq, int x, int y)
-{
- int i = 0;
- if(quickoptions_tooltip_fade && quickoptions_tooltip)
- {
- drawtext_outline(vid_buf, (XRES - 5) - textwidth(quickoptions_tooltip), quickoptions_tooltip_y, quickoptions_tooltip, 255, 255, 255, quickoptions_tooltip_fade*20, 0, 0, 0, quickoptions_tooltip_fade*15);
- quickoptions_tooltip_fade--;
- }
- while(quickmenu[i].icon!=NULL)
- {
- if(quickmenu[i].type == QM_TOGGLE)
- {
- drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+1, 14, 14, 255, 255, 255, 255);
- if(*(quickmenu[i].variable))
- {
- fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+1, 14, 14, 255, 255, 255, 255);
- drawtext(vid_buf, (XRES+BARSIZE)-11, (i*16)+5, quickmenu[i].icon, 0, 0, 0, 255);
- }
- else
- {
- fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+1, 14, 14, 0, 0, 0, 255);
- drawtext(vid_buf, (XRES+BARSIZE)-11, (i*16)+5, quickmenu[i].icon, 255, 255, 255, 255);
- }
- if(x >= (XRES+BARSIZE)-16 && x <= (XRES+BARSIZE)-2 && y >= (i*16)+1 && y <= (i*16)+15)
- {
- quickoptions_tooltip_fade+=2;
- quickoptions_tooltip = quickmenu[i].name;
- quickoptions_tooltip_y = (i*16)+5;
- if(b && !bq)
- {
- if (!strcmp(quickmenu[i].name,"Newtonian gravity"))
- {
- if(!ngrav_enable)
- start_grav_async();
- else
- stop_grav_async();
- }
- else
- *(quickmenu[i].variable) = !(*(quickmenu[i].variable));
- }
- }
- }
- i++;
- }
- if(quickoptions_tooltip_fade > 12)
- quickoptions_tooltip_fade = 12;
- if(quickoptions_tooltip_fade < 0)
- quickoptions_tooltip_fade = 0;
-}
-
-int sdl_poll(void)
-{
- SDL_Event event;
- sdl_key=sdl_rkey=sdl_wheel=sdl_ascii=0;
- loop_time = SDL_GetTicks();
- while (SDL_PollEvent(&event))
- {
- switch (event.type)
- {
- case SDL_KEYDOWN:
- sdl_key=event.key.keysym.sym;
- sdl_ascii=event.key.keysym.unicode;
- if (event.key.keysym.sym == SDLK_PLUS)
- {
- sdl_wheel++;
- }
- if (event.key.keysym.sym == SDLK_MINUS)
- {
- sdl_wheel--;
- }
- break;
-
- case SDL_KEYUP:
- sdl_rkey=event.key.keysym.sym;
- break;
- case SDL_MOUSEBUTTONDOWN:
- if (event.button.button == SDL_BUTTON_WHEELUP)
- sdl_wheel++;
- if (event.button.button == SDL_BUTTON_WHEELDOWN)
- sdl_wheel--;
- break;
- case SDL_QUIT:
- return 1;
- case SDL_SYSWMEVENT:
-#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11)
- if (event.syswm.msg->subsystem != SDL_SYSWM_X11)
- break;
- sdl_wminfo.info.x11.lock_func();
- XEvent xe = event.syswm.msg->event.xevent;
- if (xe.type==SelectionClear)
- {
- if (clipboard_text!=NULL) {
- free(clipboard_text);
- clipboard_text = NULL;
- }
- }
- else if (xe.type==SelectionRequest)
- {
- XEvent xr;
- xr.xselection.type = SelectionNotify;
- xr.xselection.requestor = xe.xselectionrequest.requestor;
- xr.xselection.selection = xe.xselectionrequest.selection;
- xr.xselection.target = xe.xselectionrequest.target;
- xr.xselection.property = xe.xselectionrequest.property;
- xr.xselection.time = xe.xselectionrequest.time;
- if (xe.xselectionrequest.target==XA_TARGETS)
- {
- // send list of supported formats
- Atom targets[] = {XA_TARGETS, XA_STRING};
- xr.xselection.property = xe.xselectionrequest.property;
- XChangeProperty(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, xe.xselectionrequest.property, XA_ATOM, 32, PropModeReplace, (unsigned char*)targets, (int)(sizeof(targets)/sizeof(Atom)));
- }
- // TODO: Supporting more targets would be nice
- else if (xe.xselectionrequest.target==XA_STRING && clipboard_text)
- {
- XChangeProperty(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, xe.xselectionrequest.property, xe.xselectionrequest.target, 8, PropModeReplace, clipboard_text, strlen(clipboard_text)+1);
- }
- else
- {
- // refuse clipboard request
- xr.xselection.property = None;
- }
- XSendEvent(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, 0, 0, &xr);
- }
- sdl_wminfo.info.x11.unlock_func();
-#endif
- continue;
- }
- }
- sdl_mod = SDL_GetModState();
- return 0;
-}
-
-void stickmen_keys()
-{
- // 4
- //1 8 2
- if (sdl_key == SDLK_RIGHT)
- {
- player.comm = (int)(player.comm)|0x02; //Go right command
- }
- if (sdl_key == SDLK_LEFT)
- {
- player.comm = (int)(player.comm)|0x01; //Go left command
- }
- if (sdl_key == SDLK_DOWN && ((int)(player.comm)&0x08)!=0x08)
- {
- player.comm = (int)(player.comm)|0x08; //Use element command
- }
- if (sdl_key == SDLK_UP && ((int)(player.comm)&0x04)!=0x04)
- {
- player.comm = (int)(player.comm)|0x04; //Jump command
- }
-
- if (sdl_key == SDLK_d)
- {
- player2.comm = (int)(player2.comm)|0x02; //Go right command
- }
- if (sdl_key == SDLK_a)
- {
- player2.comm = (int)(player2.comm)|0x01; //Go left command
- }
- if (sdl_key == SDLK_s && ((int)(player2.comm)&0x08)!=0x08)
- {
- player2.comm = (int)(player2.comm)|0x08; //Use element command
- }
- if (sdl_key == SDLK_w && ((int)(player2.comm)&0x04)!=0x04)
- {
- player2.comm = (int)(player2.comm)|0x04; //Jump command
- }
-
- if (sdl_rkey == SDLK_RIGHT || sdl_rkey == SDLK_LEFT)
- {
- player.pcomm = player.comm; //Saving last movement
- player.comm = (int)(player.comm)&12; //Stop command
- }
- if (sdl_rkey == SDLK_UP)
- {
- player.comm = (int)(player.comm)&11;
- }
- if (sdl_rkey == SDLK_DOWN)
- {
- player.comm = (int)(player.comm)&7;
- }
-
- if (sdl_rkey == SDLK_d || sdl_rkey == SDLK_a)
- {
- player2.pcomm = player2.comm; //Saving last movement
- player2.comm = (int)(player2.comm)&12; //Stop command
- }
- if (sdl_rkey == SDLK_w)
- {
- player2.comm = (int)(player2.comm)&11;
- }
- if (sdl_rkey == SDLK_s)
- {
- player2.comm = (int)(player2.comm)&7;
- }
-}
-
-void set_cmode(int cm) // sets to given view mode
-{
- int cmode = cm;
- colour_mode = COLOUR_DEFAULT;
-
- free(render_modes);
- render_modes = calloc(2, sizeof(unsigned int));
- render_modes[0] = RENDER_BASC;
- render_modes[1] = 0;
-
- free(display_modes);
- display_modes = calloc(1, sizeof(unsigned int));
- display_modes[0] = 0;
-
- itc = 51;
- if (cmode==CM_VEL)
- {
- free(render_modes);
- render_modes = calloc(3, sizeof(unsigned int));
- render_modes[0] = RENDER_EFFE;
- render_modes[1] = RENDER_BASC;
- render_modes[2] = 0;
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_AIRV;
- display_modes[1] = 0;
- strcpy(itc_msg, "Velocity Display");
- }
- else if (cmode==CM_PRESS)
- {
- free(render_modes);
- render_modes = calloc(3, sizeof(unsigned int));
- render_modes[0] = RENDER_EFFE;
- render_modes[1] = RENDER_BASC;
- render_modes[2] = 0;
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_AIRP;
- display_modes[1] = 0;
- strcpy(itc_msg, "Pressure Display");
- }
- else if (cmode==CM_PERS)
- {
- free(render_modes);
- render_modes = calloc(3, sizeof(unsigned int));
- render_modes[0] = RENDER_EFFE;
- render_modes[1] = RENDER_BASC;
- render_modes[2] = 0;
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_PERS;
- display_modes[1] = 0;
- memset(pers_bg, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
- strcpy(itc_msg, "Persistent Display");
- }
- else if (cmode==CM_FIRE)
- {
- free(render_modes);
- render_modes = calloc(3, sizeof(unsigned int));
- render_modes[0] = RENDER_FIRE;
- render_modes[1] = RENDER_EFFE;
- render_modes[2] = 0;
- memset(fire_r, 0, sizeof(fire_r));
- memset(fire_g, 0, sizeof(fire_g));
- memset(fire_b, 0, sizeof(fire_b));
- strcpy(itc_msg, "Fire Display");
- }
- else if (cmode==CM_BLOB)
- {
- free(render_modes);
- render_modes = calloc(4, sizeof(unsigned int));
- render_modes[0] = RENDER_FIRE;
- render_modes[1] = RENDER_BLOB;
- render_modes[2] = RENDER_EFFE;
- render_modes[3] = 0;
- memset(fire_r, 0, sizeof(fire_r));
- memset(fire_g, 0, sizeof(fire_g));
- memset(fire_b, 0, sizeof(fire_b));
- strcpy(itc_msg, "Blob Display");
- }
- else if (cmode==CM_HEAT)
- {
- colour_mode = COLOUR_HEAT;
- strcpy(itc_msg, "Heat Display");
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_AIRH;
- display_modes[1] = 0;
- }
- else if (cmode==CM_FANCY)
- {
- free(render_modes);
- render_modes = calloc(5, sizeof(unsigned int));
- render_modes[0] = RENDER_FIRE;
- render_modes[1] = RENDER_GLOW;
- render_modes[2] = RENDER_BLUR;
- render_modes[3] = RENDER_EFFE;
- render_modes[4] = 0;
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_WARP;
- display_modes[1] = 0;
- memset(fire_r, 0, sizeof(fire_r));
- memset(fire_g, 0, sizeof(fire_g));
- memset(fire_b, 0, sizeof(fire_b));
- strcpy(itc_msg, "Fancy Display");
- }
- else if (cmode==CM_NOTHING)
- {
- strcpy(itc_msg, "Nothing Display");
- }
- else if (cmode==CM_GRAD)
- {
- colour_mode = COLOUR_GRAD;
- strcpy(itc_msg, "Heat Gradient Display");
- }
- else if (cmode==CM_LIFE)
- {
- colour_mode = COLOUR_LIFE;
- strcpy(itc_msg, "Life Gradient Display");
- }
- else if (cmode==CM_CRACK)
- {
- free(render_modes);
- render_modes = calloc(3, sizeof(unsigned int));
- render_modes[0] = RENDER_EFFE;
- render_modes[1] = RENDER_BASC;
- render_modes[2] = 0;
- free(display_modes);
- display_modes = calloc(2, sizeof(unsigned int));
- display_modes[0] = DISPLAY_AIRC;
- display_modes[1] = 0;
- strcpy(itc_msg, "Alternate Velocity Display");
- }
- else //if no special text given, it will display this.
- {
- strcpy(itc_msg, "Error: Incorrect Display Number");
- }
-
- update_display_modes();// Update render_mode and display_mode from the relevant arrays
- save_presets(0);
-}
-
-char *download_ui(pixel *vid_buf, char *uri, int *len)
-{
- int dstate = 0;
- void *http = http_async_req_start(NULL, uri, NULL, 0, 0);
- int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2;
- int done, total, i, ret, zlen, ulen;
- char str[16], *tmp, *res;
-
- if (svf_login) {
- http_auth_headers(http, svf_user_id, NULL, svf_session_id);
- }
-
- while (!http_async_req_status(http))
- {
- sdl_poll();
-
- http_async_get_length(http, &total, &done);
-
- clearrect(vid_buf, x0-2, y0-2, 244, 64);
- drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, "Please wait", 255, 216, 32, 255);
- drawtext(vid_buf, x0+8, y0+26, "Downloading update...", 255, 255, 255, 255);
-
- if (total)
- {
- i = (236*done)/total;
- fillrect(vid_buf, x0+1, y0+45, i+1, 14, 255, 216, 32, 255);
- i = (100*done)/total;
- sprintf(str, "%d%%", i);
- if (i<50)
- drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 192, 192, 192, 255);
- else
- drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 0, 0, 0, 255);
- }
- else
- drawtext(vid_buf, x0+120-textwidth("Waiting...")/2, y0+48, "Waiting...", 255, 216, 32, 255);
-
- drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- }
-
- tmp = http_async_req_stop(http, &ret, &zlen);
- if (ret!=200)
- {
- error_ui(vid_buf, ret, http_ret_text(ret));
- if (tmp)
- free(tmp);
- return NULL;
- }
- if (!tmp)
- {
- error_ui(vid_buf, 0, "Server did not return data");
- return NULL;
- }
-
- if (zlen<16)
- {
- printf("ZLen is not 16!\n");
- goto corrupt;
- }
- if (tmp[0]!=0x42 || tmp[1]!=0x75 || tmp[2]!=0x54 || tmp[3]!=0x54)
- {
- printf("Tmperr %d, %d, %d, %d\n", tmp[0], tmp[1], tmp[2], tmp[3]);
- goto corrupt;
- }
-
- ulen = (unsigned char)tmp[4];
- ulen |= ((unsigned char)tmp[5])<<8;
- ulen |= ((unsigned char)tmp[6])<<16;
- ulen |= ((unsigned char)tmp[7])<<24;
-
- res = (char *)malloc(ulen);
- if (!res)
- {
- printf("No res!\n");
- goto corrupt;
- }
- dstate = BZ2_bzBuffToBuffDecompress((char *)res, (unsigned *)&ulen, (char *)(tmp+8), zlen-8, 0, 0);
- if (dstate)
- {
- printf("Decompression failure: %d!\n", dstate);
- free(res);
- goto corrupt;
- }
-
- free(tmp);
- if (len)
- *len = ulen;
- return res;
-
-corrupt:
- error_ui(vid_buf, 0, "Downloaded update is corrupted");
- free(tmp);
- return NULL;
-}
-
-int search_ui(pixel *vid_buf)
-{
- int nmp=-1,uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,last_fav=search_fav,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv;
- int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0;
- int thumb_drawn[GRID_X*GRID_Y];
- pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE);
- pixel *bthumb_rsdata = NULL;
- float ry;
- time_t http_last_use=HTTP_TIMEOUT;
- ui_edit ed;
- ui_richtext motd;
-
-
- void *http = NULL;
- int active = 0;
- char *last = NULL;
- int search = 0;
- int lasttime = TIMEOUT;
- char *uri;
- int status;
- char *results;
- char *tmp, ts[64];
-
- void *img_http[IMGCONNS];
- char *img_id[IMGCONNS];
- void *thumb, *data;
- int thlen, dlen;
-
- if (!v_buf)
- return 0;
- memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE);
-
- memset(img_http, 0, sizeof(img_http));
- memset(img_id, 0, sizeof(img_id));
-
- memset(search_ids, 0, sizeof(search_ids));
- memset(search_dates, 0, sizeof(search_dates));
- memset(search_names, 0, sizeof(search_names));
- memset(search_scoreup, 0, sizeof(search_scoreup));
- memset(search_scoredown, 0, sizeof(search_scoredown));
- memset(search_publish, 0, sizeof(search_publish));
- memset(search_owners, 0, sizeof(search_owners));
- memset(search_thumbs, 0, sizeof(search_thumbs));
- memset(search_thsizes, 0, sizeof(search_thsizes));
-
- memset(thumb_drawn, 0, sizeof(thumb_drawn));
-
- do_open = 0;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- ed.x = 65;
- ed.y = 13;
- ed.w = XRES-200;
- ed.nx = 1;
- ed.def = "[search terms]";
- ed.focus = 1;
- ed.hide = 0;
- ed.cursor = strlen(search_expr);
- ed.multiline = 0;
- strcpy(ed.str, search_expr);
-
- motd.x = 20;
- motd.y = 33;
- motd.str[0] = 0;
-
- sdl_wheel = 0;
-
- while (!sdl_poll())
- {
- uih = 0;
- bq = b;
- mxq = mx;
- myq = my;
- b = mouse_get_state(&mx, &my);
-
- if (mx!=mxq || my!=myq || sdl_wheel || b)
- mmt = 0;
- else if (mmt<TIMEOUT)
- mmt++;
-
- clearrect(vid_buf, -1, -1, (XRES+BARSIZE)+1, YRES+MENUSIZE+1);
-
- memcpy(vid_buf, v_buf, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE);
-
- drawtext(vid_buf, 11, 13, "Search:", 192, 192, 192, 255);
- if (!last || (!active && strcmp(last, ed.str)))
- drawtext(vid_buf, 51, 11, "\x8E", 192, 160, 32, 255);
- else
- drawtext(vid_buf, 51, 11, "\x8E", 32, 64, 160, 255);
- drawtext(vid_buf, 51, 11, "\x8F", 255, 255, 255, 255);
- drawrect(vid_buf, 48, 8, XRES-182, 16, 192, 192, 192, 255);
-
- if (!svf_login || search_fav)
- {
- search_own = 0;
- drawrect(vid_buf, XRES-64+16, 8, 56, 16, 96, 96, 96, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x94", 96, 80, 16, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x93", 128, 128, 128, 255);
- drawtext(vid_buf, XRES-46+16, 13, "My Own", 128, 128, 128, 255);
- }
- else if (search_own)
- {
- fillrect(vid_buf, XRES-65+16, 7, 58, 18, 255, 255, 255, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 64, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x93", 32, 32, 32, 255);
- drawtext(vid_buf, XRES-46+16, 13, "My Own", 0, 0, 0, 255);
- }
- else
- {
- drawrect(vid_buf, XRES-64+16, 8, 56, 16, 192, 192, 192, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 32, 255);
- drawtext(vid_buf, XRES-61+16, 11, "\x93", 255, 255, 255, 255);
- drawtext(vid_buf, XRES-46+16, 13, "My Own", 255, 255, 255, 255);
- }
-
- if(!svf_login)
- {
- search_fav = 0;
- drawrect(vid_buf, XRES-134, 8, 16, 16, 192, 192, 192, 255);
- drawtext(vid_buf, XRES-130, 11, "\xCC", 120, 120, 120, 255);
- }
- else if (search_fav)
- {
- fillrect(vid_buf, XRES-134, 7, 18, 18, 255, 255, 255, 255);
- drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 64, 255);
- }
- else
- {
- drawrect(vid_buf, XRES-134, 8, 16, 16, 192, 192, 192, 255);
- drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 32, 255);
- }
-
- if(search_fav)
- {
- search_date = 0;
- drawrect(vid_buf, XRES-129+16, 8, 60, 16, 96, 96, 96, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA9", 44, 48, 32, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA8", 32, 44, 32, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA7", 128, 128, 128, 255);
- drawtext(vid_buf, XRES-111+16, 13, "By votes", 128, 128, 128, 255);
- }
- else if (search_date)
- {
- fillrect(vid_buf, XRES-130+16, 7, 62, 18, 255, 255, 255, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA6", 32, 32, 32, 255);
- drawtext(vid_buf, XRES-111+16, 13, "By date", 0, 0, 0, 255);
- }
- else
- {
- drawrect(vid_buf, XRES-129+16, 8, 60, 16, 192, 192, 192, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA9", 144, 48, 32, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA8", 32, 144, 32, 255);
- drawtext(vid_buf, XRES-126+16, 11, "\xA7", 255, 255, 255, 255);
- drawtext(vid_buf, XRES-111+16, 13, "By votes", 255, 255, 255, 255);
- }
-
- if (search_page)
- {
- drawtext(vid_buf, 4, YRES+MENUSIZE-16, "\x96", 255, 255, 255, 255);
- drawrect(vid_buf, 1, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255);
- }
- if (page_count > 9)
- {
- drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255);
- drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255);
- }
-
- ui_edit_draw(vid_buf, &ed);
-
- if ((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my<YRES+MENUSIZE-4) || sdl_wheel>0)
- {
- if (search_page)
- {
- search_page --;
- lasttime = TIMEOUT;
- }
- sdl_wheel = 0;
- uih = 1;
- }
- if ((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && my<YRES+MENUSIZE-4) || sdl_wheel<0)
- {
- if (page_count>exp_res)
- {
- lasttime = TIMEOUT;
- search_page ++;
- page_count = exp_res;
- }
- sdl_wheel = 0;
- uih = 1;
- }
-
- tp = -1;
- if (is_p1)
- {
- //Message of the day
- ui_richtext_process(mx, my, b, bq, &motd);
- ui_richtext_draw(vid_buf, &motd);
- //Popular tags
- drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 49, "Popular tags:", 255, 192, 64, 255);
- for (gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++)
- for (gi=0; gi<(GRID_X+1); gi++)
- {
- pos = gi+(GRID_X+1)*gj;
- if (pos>TAG_MAX || !tag_names[pos])
- break;
- if (tag_votes[0])
- i = 127+(128*tag_votes[pos])/tag_votes[0];
- else
- i = 192;
- w = textwidth(tag_names[pos]);
- if (w>XRES/(GRID_X+1)-5)
- w = XRES/(GRID_X+1)-5;
- gx = (XRES/(GRID_X+1))*gi;
- gy = gj*13 + 62;
- if (mx>=gx && mx<gx+(XRES/((GRID_X+1)+1)) && my>=gy && my<gy+14)
- {
- j = (i*5)/6;
- tp = pos;
- }
- else
- j = i;
- drawtextmax(vid_buf, gx+(XRES/(GRID_X+1)-w)/2, gy, XRES/(GRID_X+1)-5, tag_names[pos], j, j, i, 255);
- }
- }
-
- mp = dp = -1;
- dap = -1;
- st = 0;
- for (gj=0; gj<GRID_Y; gj++)
- for (gi=0; gi<GRID_X; gi++)
- {
- if (is_p1)
- {
- pos = gi+GRID_X*(gj-GRID_Y+GRID_P);
- if (pos<0)
- break;
- }
- else
- pos = gi+GRID_X*gj;
- if (!search_ids[pos])
- break;
- gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2;
- gy = ((((YRES-(MENUSIZE-20))+15)/GRID_Y)*gj) + ((YRES-(MENUSIZE-20))/GRID_Y-(YRES-(MENUSIZE-20))/GRID_S+10)/2 + 18;
- if (textwidth(search_names[pos]) > XRES/GRID_X-10)
- {
- tmp = malloc(strlen(search_names[pos])+4);
- strcpy(tmp, search_names[pos]);
- j = textwidthx(tmp, XRES/GRID_X-15);
- strcpy(tmp+j, "...");
- drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255);
- free(tmp);
- }
- else
- drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255);
- j = textwidth(search_owners[pos]);
- if (mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 &&
- my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31)
- {
- st = 1;
- drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255);
- }
- else
- drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255);
- if (search_thumbs[pos]&&thumb_drawn[pos]==0)
- {
- //render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S);
- int finh, finw;
- pixel *thumb_rsdata = NULL;
- pixel *thumb_imgdata = ptif_unpack(search_thumbs[pos], search_thsizes[pos], &finw, &finh);
- if(thumb_imgdata!=NULL){
- thumb_rsdata = resample_img_nn(thumb_imgdata, finw, finh, XRES/GRID_S, YRES/GRID_S);
- draw_image(v_buf, thumb_rsdata, gx, gy, XRES/GRID_S, YRES/GRID_S, 255);
- free(thumb_imgdata);
- free(thumb_rsdata);
- }
- thumb_drawn[pos] = 1;
- }
- own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod);
- if (mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30)
- mp = pos;
- if ((own || search_fav) && mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4)
- {
- mp = -1;
- dp = pos;
- }
- if (own && !search_dates[pos] && mx>=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6)
- {
- mp = -1;
- dap = pos;
- }
- drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255);
- fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255);
- fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 6, 1+(YRES/GRID_S+3)/2, 107, 10, 0, 255);
-
- if (mp==pos && !st)
- drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255);
- else
- drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255);
- if (own || search_fav)
- {
- if (dp == pos)
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255);
- else
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255);
- drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255);
- }
- if (!search_publish[pos])
- {
- drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255);
- drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255);
- }
- if (!search_dates[pos] && own)
- {
- fillrect(vid_buf, gx-5, gy+YRES/GRID_S-3, 7, 8, 255, 255, 255, 255);
- if (dap == pos) {
- drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255);
- } else {
- drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255);
- }
- //drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255);
- }
- if (view_own || svf_admin || svf_mod)
- {
- sprintf(ts+1, "%d", search_votes[pos]);
- ts[0] = 0xBB;
- for (j=1; ts[j]; j++)
- ts[j] = 0xBC;
- ts[j-1] = 0xB9;
- ts[j] = 0xBA;
- ts[j+1] = 0;
- w = gx+XRES/GRID_S-2-textwidth(ts);
- h = gy+YRES/GRID_S-11;
- drawtext(vid_buf, w, h, ts, 16, 72, 16, 255);
- for (j=0; ts[j]; j++)
- ts[j] -= 14;
- drawtext(vid_buf, w, h, ts, 192, 192, 192, 255);
- sprintf(ts, "%d", search_votes[pos]);
- for (j=0; ts[j]; j++)
- ts[j] += 127;
- drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255);
- }
- if (search_scoreup[pos]>0||search_scoredown[pos]>0)
- {
- lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]);
-
- if (((YRES/GRID_S+3)/2)>lv)
- {
- ry = ((float)((YRES/GRID_S+3)/2)/(float)lv);
- if (lv<8)
- {
- ry = ry/(8-lv);
- }
- nyu = search_scoreup[pos]*ry;
- nyd = search_scoredown[pos]*ry;
- }
- else
- {
- ry = ((float)lv/(float)((YRES/GRID_S+3)/2));
- nyu = search_scoreup[pos]/ry;
- nyd = search_scoredown[pos]/ry;
- }
-
-
- fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-1+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255);
- fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 4, nyd, 187, 57, 57, 255);
- //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255);
- //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255);
- }
- }
-
- if (mp!=-1 && mmt>=TIMEOUT/5 && !st)
- {
- gi = mp % GRID_X;
- gj = mp / GRID_X;
- if (is_p1)
- gj += GRID_Y-GRID_P;
- gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2;
- gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18;
- i = w = textwidth(search_names[mp]);
- h = YRES/GRID_Z+30;
- if (w<XRES/GRID_Z) w=XRES/GRID_Z;
- gx += XRES/(GRID_S*2)-w/2;
- gy += YRES/(GRID_S*2)-h/2;
- if (gx<2) gx=2;
- if (gx+w>=XRES-2) gx=XRES-3-w;
- if (gy<32) gy=32;
- if (gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h;
- clearrect(vid_buf, gx-2, gy-3, w+4, h);
- drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255);
- if (search_thumbs[mp]){
- if(mp != nmp && bthumb_rsdata){
- free(bthumb_rsdata);
- bthumb_rsdata = NULL;
- }
- if(!bthumb_rsdata){
- int finh, finw;
- pixel *thumb_imgdata = ptif_unpack(search_thumbs[mp], search_thsizes[mp], &finw, &finh);
- if(thumb_imgdata!=NULL){
- bthumb_rsdata = resample_img(thumb_imgdata, finw, finh, XRES/GRID_Z, YRES/GRID_Z);
- free(thumb_imgdata);
- }
- }
- draw_image(vid_buf, bthumb_rsdata, gx+(w-(XRES/GRID_Z))/2, gy, XRES/GRID_Z, YRES/GRID_Z, 255);
- nmp = mp;
- }
- drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255);
- drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255);
- }
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- ui_edit_process(mx, my, b, &ed);
-
- if (sdl_key==SDLK_RETURN)
- {
- if (!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)))
- lasttime = TIMEOUT;
- else if (search_ids[0] && !search_ids[1])
- {
- bq = 0;
- b = 1;
- mp = 0;
- }
- }
- if (sdl_key==SDLK_ESCAPE)
- goto finish;
-
- if (b && !bq && mx>=XRES-64+16 && mx<=XRES-8+16 && my>=8 && my<=24 && svf_login && !search_fav)
- {
- search_own = !search_own;
- lasttime = TIMEOUT;
- }
- if (b && !bq && mx>=XRES-129+16 && mx<=XRES-65+16 && my>=8 && my<=24 && !search_fav)
- {
- search_date = !search_date;
- lasttime = TIMEOUT;
- }
- if (b && !bq && mx>=XRES-134 && mx<=XRES-134+16 && my>=8 && my<=24 && svf_login)
- {
- search_fav = !search_fav;
- search_own = 0;
- search_date = 0;
- lasttime = TIMEOUT;
- }
-
- if (b && !bq && dp!=-1)
- {
- if (search_fav){
- if(confirm_ui(vid_buf, "Remove from favourites?", search_names[dp], "Remove")){
- execute_unfav(vid_buf, search_ids[dp]);
- lasttime = TIMEOUT;
- if (last)
- {
- free(last);
- last = NULL;
- }
- }
- } else {
- if (confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete"))
- {
- execute_delete(vid_buf, search_ids[dp]);
- lasttime = TIMEOUT;
- if (last)
- {
- free(last);
- last = NULL;
- }
- }
- }
- }
- if (b && !bq && dap!=-1)
- {
- sprintf(ed.str, "history:%s", search_ids[dap]);
- lasttime = TIMEOUT;
- }
-
- if (b && !bq && tp!=-1)
- {
- strncpy(ed.str, tag_names[tp], 255);
- lasttime = TIMEOUT;
- }
-
- if (b && !bq && mp!=-1 && st)
- {
- sprintf(ed.str, "user:%s", search_owners[mp]);
- lasttime = TIMEOUT;
- }
-
- if (do_open==1)
- {
- mp = 0;
- }
-
- if ((b && !bq && mp!=-1 && !st && !uih) || do_open==1)
- {
- if (open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1 || do_open==1) {
- goto finish;
- }
- }
-
- if (!last)
- {
- search = 1;
- }
- else if (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page || last_fav!=search_fav))
- {
- search = 1;
- if (strcmp(last, ed.str) || last_own!=search_own || last_fav!=search_fav || last_date!=search_date)
- {
- search_page = 0;
- page_count = 0;
- }
- free(last);
- last = NULL;
- }
- else
- search = 0;
-
- if (search && lasttime>=TIMEOUT)
- {
- lasttime = 0;
- last = mystrdup(ed.str);
- last_own = search_own;
- last_date = search_date;
- last_page = search_page;
- last_fav = search_fav;
- active = 1;
- uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)+20); //Increase "padding" from 80 to 180 to fix the search memory corruption bug
- if (search_own || svf_admin || svf_mod)
- tmp = "&ShowVotes=true";
- else
- tmp = "";
- if (!search_own && !search_date && !search_fav && !*last)
- {
- if (search_page)
- {
- exp_res = GRID_X*GRID_Y;
- sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp);
- }
- else
- {
- exp_res = GRID_X*GRID_P;
- sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp);
- }
- }
- else
- {
- exp_res = GRID_X*GRID_Y;
- sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp);
- }
- strcaturl(uri, last);
- if (search_own)
- {
- strcaturl(uri, " user:");
- strcaturl(uri, svf_user);
- }
- if (search_fav)
- {
- strcaturl(uri, " cat:favs");
- }
- if (search_date)
- strcaturl(uri, " sort:date");
-
- http = http_async_req_start(http, uri, NULL, 0, 1);
- if (svf_login)
- {
- //http_auth_headers(http, svf_user, svf_pass);
- http_auth_headers(http, svf_user_id, NULL, svf_session_id);
- }
- http_last_use = time(NULL);
- free(uri);
- }
-
- if (active && http_async_req_status(http))
- {
- http_last_use = time(NULL);
- results = http_async_req_stop(http, &status, NULL);
- view_own = last_own;
- if (status == 200)
- {
- page_count = search_results(results, last_own||svf_admin||svf_mod);
- memset(thumb_drawn, 0, sizeof(thumb_drawn));
- memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE);
- nmp = -1;
-
- ui_richtext_settext(server_motd, &motd);
- motd.x = (XRES-textwidth(motd.printstr))/2;
- }
- is_p1 = (exp_res < GRID_X*GRID_Y);
- if (results)
- free(results);
- active = 0;
- }
-
- if (http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT))
- {
- http_async_req_close(http);
- http = NULL;
- }
-
- for (i=0; i<IMGCONNS; i++)
- {
- if (img_http[i] && http_async_req_status(img_http[i]))
- {
- thumb = http_async_req_stop(img_http[i], &status, &thlen);
- if (status != 200)
- {
- if (thumb)
- free(thumb);
- thumb = calloc(1,4);
- thlen = 4;
- }
- thumb_cache_add(img_id[i], thumb, thlen);
- for (pos=0; pos<GRID_X*GRID_Y; pos++) {
- if (search_dates[pos]) {
- char *id_d_temp = malloc(strlen(search_ids[pos])+strlen(search_dates[pos])+2);
- if (id_d_temp == 0)
- {
- break;
- }
- strcpy(id_d_temp, search_ids[pos]);
- strappend(id_d_temp, "_");
- strappend(id_d_temp, search_dates[pos]);
- //img_id[i] = mystrdup(id_d_temp);
- if (!strcmp(id_d_temp, img_id[i]) && !search_thumbs[pos]) {
- break;
- }
- free(id_d_temp);
- } else {
- if (search_ids[pos] && !strcmp(search_ids[pos], img_id[i])) {
- break;
- }
- }
- }
- if (pos<GRID_X*GRID_Y)
- {
- search_thumbs[pos] = thumb;
- search_thsizes[pos] = thlen;
- }
- else
- free(thumb);
- free(img_id[i]);
- img_id[i] = NULL;
- }
- if (!img_id[i])
- {
- for (pos=0; pos<GRID_X*GRID_Y; pos++)
- if (search_ids[pos] && !search_thumbs[pos])
- {
- if (search_dates[pos])
- {
- char *id_d_temp = malloc(strlen(search_ids[pos])+strlen(search_dates[pos])+2);
- strcpy(id_d_temp, search_ids[pos]);
- strappend(id_d_temp, "_");
- strappend(id_d_temp, search_dates[pos]);
-
- for (gi=0; gi<IMGCONNS; gi++)
- if (img_id[gi] && !strcmp(id_d_temp, img_id[gi]))
- break;
-
- free(id_d_temp);
- }
- else
- {
- for (gi=0; gi<IMGCONNS; gi++)
- if (img_id[gi] && !strcmp(search_ids[pos], img_id[gi]))
- break;
- }
- if (gi<IMGCONNS)
- continue;
- break;
- }
- if (pos<GRID_X*GRID_Y)
- {
- if (search_dates[pos]) {
- char *id_d_temp = malloc(strlen(search_ids[pos])+strlen(search_dates[pos])+2);
- uri = malloc(strlen(search_ids[pos])*3+strlen(search_dates[pos])*3+strlen(STATICSERVER)+71);
- strcpy(uri, "http://" STATICSERVER "/");
- strcaturl(uri, search_ids[pos]);
- strappend(uri, "_");
- strcaturl(uri, search_dates[pos]);
- strappend(uri, "_small.pti");
-
- strcpy(id_d_temp, search_ids[pos]);
- strappend(id_d_temp, "_");
- strappend(id_d_temp, search_dates[pos]);
- img_id[i] = mystrdup(id_d_temp);
- free(id_d_temp);
- } else {
- uri = malloc(strlen(search_ids[pos])*3+strlen(SERVER)+64);
- strcpy(uri, "http://" STATICSERVER "/");
- strcaturl(uri, search_ids[pos]);
- strappend(uri, "_small.pti");
- img_id[i] = mystrdup(search_ids[pos]);
- }
- img_http[i] = http_async_req_start(img_http[i], uri, NULL, 0, 1);
- free(uri);
- }
- }
- if (!img_id[i] && img_http[i])
- {
- http_async_req_close(img_http[i]);
- img_http[i] = NULL;
- }
- }
-
- if (lasttime<TIMEOUT)
- lasttime++;
- }
-
-finish:
- if (last)
- free(last);
- if (http)
- http_async_req_close(http);
- for (i=0; i<IMGCONNS; i++)
- if (img_http[i])
- http_async_req_close(img_http[i]);
-
- if(bthumb_rsdata){
- free(bthumb_rsdata);
- bthumb_rsdata = NULL;
- }
-
- search_results("", 0);
-
- strcpy(search_expr, ed.str);
-
- free(v_buf);
- return 0;
-}
-
-int report_ui(pixel* vid_buf, char *save_id)
-{
- int b=1,bq,mx,my;
- ui_edit ed;
- ed.x = 209;
- ed.y = 159;
- ed.w = (XRES+BARSIZE-400)-18;
- ed.h = (YRES+MENUSIZE-300)-36;
- ed.nx = 1;
- ed.def = "Report details";
- ed.focus = 0;
- ed.hide = 0;
- ed.multiline = 1;
- ed.cursor = 0;
- strcpy(ed.str, "");
-
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- while (!sdl_poll()) {
- fillrect(vid_buf, 200, 150, (XRES+BARSIZE-400), (YRES+MENUSIZE-300), 0,0,0, 255);
- drawrect(vid_buf, 200, 150, (XRES+BARSIZE-400), (YRES+MENUSIZE-300), 255, 255, 255, 255);
-
- drawrect(vid_buf, 205, 155, (XRES+BARSIZE-400)-10, (YRES+MENUSIZE-300)-28, 255, 255, 255, 170);
-
- bq = b;
- b = mouse_get_state(&mx, &my);
-
-
- drawrect(vid_buf, 200, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 255);
- drawtext(vid_buf, 213, (YRES+MENUSIZE-150)-13, "Cancel", 255, 255, 255, 255);
-
- drawrect(vid_buf, (XRES+BARSIZE-400)+150, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 255);
- drawtext(vid_buf, (XRES+BARSIZE-400)+163, (YRES+MENUSIZE-150)-13, "Report", 255, 255, 255, 255);
- if (mx>(XRES+BARSIZE-400)+150 && my>(YRES+MENUSIZE-150)-18 && mx<(XRES+BARSIZE-400)+200 && my<(YRES+MENUSIZE-150)) {
- fillrect(vid_buf, (XRES+BARSIZE-400)+150, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 40);
- if (b) {
- if (execute_report(vid_buf, save_id, ed.str)) {
- info_ui(vid_buf, "Success", "This save has been reported");
- return 1;
- } else {
- return 0;
- }
- }
- }
- if (mx>200 && my>(YRES+MENUSIZE-150)-18 && mx<250 && my<(YRES+MENUSIZE-150)) {
- fillrect(vid_buf, 200, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 40);
- if (b)
- return 0;
- }
- ui_edit_draw(vid_buf, &ed);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- ui_edit_process(mx, my, b, &ed);
- }
- return 0;
-}
-
-int open_ui(pixel *vid_buf, char *save_id, char *save_date)
-{
- int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,active_3=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawncthumb=0,hasdrawnthumb=0,authoritah=0,myown=0,queue_open=0,data_size=0,full_thumb_data_size=0,retval=0,bc=255,openable=1;
- int nyd,nyu,ry,lv;
- float ryf;
-
- char *uri, *uri_2, *o_uri, *uri_3;
- void *data = NULL, *info_data, *thumb_data_full;
- save_info *info = calloc(sizeof(save_info), 1);
- void *http = NULL, *http_2 = NULL, *http_3 = NULL;
- int lasttime = TIMEOUT, saveTotal, saveDone, infoTotal, infoDone, downloadDone, downloadTotal;
- int status, status_2, info_ready = 0, data_ready = 0, thumb_data_ready = 0;
- time_t http_last_use = HTTP_TIMEOUT, http_last_use_2 = HTTP_TIMEOUT, http_last_use_3 = HTTP_TIMEOUT;
- pixel *save_pic;// = malloc((XRES/2)*(YRES/2));
- pixel *save_pic_thumb = NULL;
- char *thumb_data = NULL;
- char viewcountbuffer[11];
- int thumb_data_size = 0;
- ui_edit ed;
- ui_copytext ctb;
-
- pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- if (!old_vid || !info)
- return 0;
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- viewcountbuffer[0] = 0;
-
- fillrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 0, 0, 0, 255);
- drawrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 255, 255, 255, 255);
- drawrect(vid_buf, 50, 50, (XRES/2)+1, (YRES/2)+1, 255, 255, 255, 155);
- drawrect(vid_buf, 50+(XRES/2)+1, 50, XRES+BARSIZE-100-((XRES/2)+1), YRES+MENUSIZE-100, 155, 155, 155, 255);
- drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128);
-
- ed.x = 57+(XRES/2)+1;
- ed.y = YRES+MENUSIZE-118;
- ed.w = XRES+BARSIZE-114-((XRES/2)+1);
- ed.h = 48;
- ed.nx = 1;
- ed.def = "Add comment";
- ed.focus = 1;
- ed.hide = 0;
- ed.multiline = 1;
- ed.cursor = 0;
- strcpy(ed.str, "");
-
- ctb.x = 100;
- ctb.y = YRES+MENUSIZE-20;
- ctb.width = textwidth(save_id)+12;
- ctb.height = 10+7;
- ctb.hover = 0;
- ctb.state = 0;
- strcpy(ctb.text, save_id);
-
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- //Try to load the thumbnail from the cache
- if(save_date)
- {
- char * id_d_temp = malloc(strlen(save_id)+strlen(save_date)+2);
- strcpy(id_d_temp, save_id);
- strappend(id_d_temp, "_");
- strappend(id_d_temp, save_date);
-
- status = thumb_cache_find(id_d_temp, &thumb_data, &thumb_data_size);
- free(id_d_temp);
- }
- else
- {
- status = thumb_cache_find(save_id, &thumb_data, &thumb_data_size);
- }
- if(!status){
- thumb_data = NULL;
- } else {
- //We found a thumbnail in the cache, we'll draw this one while we wait for the full image to load.
- int finw, finh;
- pixel *thumb_imgdata = ptif_unpack(thumb_data, thumb_data_size, &finw, &finh);
- if(thumb_imgdata!=NULL){
- save_pic_thumb = resample_img(thumb_imgdata, finw, finh, XRES/2, YRES/2);
- //draw_image(vid_buf, save_pic_thumb, 51, 51, XRES/2, YRES/2, 255);
- }
- free(thumb_imgdata);
- //rescale_img(full_save, imgw, imgh, &thumb_w, &thumb_h, 2);
- }
-
- //Begin Async loading of data
- if (save_date) {
- // We're loading an historical save
- uri = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(STATICSERVER)+71);
- strcpy(uri, "http://" STATICSERVER "/");
- strcaturl(uri, save_id);
- strappend(uri, "_");
- strcaturl(uri, save_date);
- strappend(uri, ".cps");
-
- uri_2 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(STATICSERVER)+71);
- strcpy(uri_2, "http://" STATICSERVER "/");
- strcaturl(uri_2, save_id);
- strappend(uri_2, "_");
- strcaturl(uri_2, save_date);
- strappend(uri_2, ".info");
-
- uri_3 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(STATICSERVER)+71);
- strcpy(uri_3, "http://" STATICSERVER "/");
- strcaturl(uri_3, save_id);
- strappend(uri_3, "_");
- strcaturl(uri_3, save_date);
- strappend(uri_3, "_large.pti");
- } else {
- //We're loading a normal save
- uri = malloc(strlen(save_id)*3+strlen(STATICSERVER)+64);
- strcpy(uri, "http://" STATICSERVER "/");
- strcaturl(uri, save_id);
- strappend(uri, ".cps");
-
- uri_2 = malloc(strlen(save_id)*3+strlen(STATICSERVER)+64);
- strcpy(uri_2, "http://" STATICSERVER "/");
- strcaturl(uri_2, save_id);
- strappend(uri_2, ".info");
-
- uri_3 = malloc(strlen(save_id)*3+strlen(STATICSERVER)+64);
- strcpy(uri_3, "http://" STATICSERVER "/");
- strcaturl(uri_3, save_id);
- strappend(uri_3, "_large.pti");
- }
- http = http_async_req_start(http, uri, NULL, 0, 1);
- http_2 = http_async_req_start(http_2, uri_2, NULL, 0, 1);
- http_3 = http_async_req_start(http_3, uri_3, NULL, 0, 1);
- if (svf_login)
- {
- http_auth_headers(http, svf_user_id, NULL, svf_session_id);
- http_auth_headers(http_2, svf_user_id, NULL, svf_session_id);
- }
- http_last_use = time(NULL);
- http_last_use_2 = time(NULL);
- http_last_use_3 = time(NULL);
- free(uri);
- free(uri_2);
- free(uri_3);
- active = 1;
- active_2 = 1;
- active_3 = 1;
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- if (active)
- {
- http_async_get_length(http, &saveTotal, &saveDone);
- }
- if (active && http_async_req_status(http))
- {
- int imgh, imgw, nimgh, nimgw;
- http_last_use = time(NULL);
- data = http_async_req_stop(http, &status, &data_size);
- saveDone = data_size;
- saveTotal = data_size;
- if (status == 200)
- {
- pixel *full_save;
- if (!data||!data_size) {
- error_ui(vid_buf, 0, "Save data is empty (may be corrupt)");
- break;
- }
- full_save = prerender_save(data, data_size, &imgw, &imgh);
- if (full_save!=NULL) {
- //save_pic = rescale_img(full_save, imgw, imgh, &thumb_w, &thumb_h, 2);
- data_ready = 1;
- free(full_save);
- } else {
- error_ui(vid_buf, 0, "Save may be from a newer version");
- break;
- }
- }
- active = 0;
- free(http);
- http = NULL;
- }
- if (active_2)
- {
- http_async_get_length(http_2, &infoTotal, &infoDone);
- }
- if (active_2 && http_async_req_status(http_2))
- {
- http_last_use_2 = time(NULL);
- info_data = http_async_req_stop(http_2, &status_2, &infoTotal);
- infoDone = infoTotal;
- if (status_2 == 200 || !info_data)
- {
- info_ready = info_parse(info_data, info);
- sprintf(viewcountbuffer, "%d", info->downloadcount);
- if (info_ready<=0) {
- error_ui(vid_buf, 0, "Save info not found");
- break;
- }
- }
- if (info_data)
- free(info_data);
- active_2 = 0;
- free(http_2);
- http_2 = NULL;
- }
- if (active_3 && http_async_req_status(http_3))
- {
- int imgh, imgw, nimgh, nimgw;
- http_last_use_3 = time(NULL);
- thumb_data_full = http_async_req_stop(http_3, &status, &full_thumb_data_size);
- if (status == 200)
- {
- pixel *full_thumb;
- if (!thumb_data_full||!full_thumb_data_size) {
- //error_ui(vid_buf, 0, "Save data is empty (may be corrupt)");
- //break;
- } else {
- full_thumb = ptif_unpack(thumb_data_full, full_thumb_data_size, &imgw, &imgh);//prerender_save(data, data_size, &imgw, &imgh);
- if (full_thumb!=NULL) {
- save_pic = resample_img(full_thumb, imgw, imgh, XRES/2, YRES/2);
- thumb_data_ready = 1;
- free(full_thumb);
- }
- }
- }
- if(thumb_data_full)
- free(thumb_data_full);
- active_3 = 0;
- free(http_3);
- http_3 = NULL;
- }
- if (save_pic_thumb!=NULL && !hasdrawncthumb) {
- draw_image(vid_buf, save_pic_thumb, 51, 51, XRES/2, YRES/2, 255);
- free(save_pic_thumb);
- save_pic_thumb = NULL;
- hasdrawncthumb = 1;
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
- }
- if (thumb_data_ready && !hasdrawnthumb) {
- draw_image(vid_buf, save_pic, 51, 51, XRES/2, YRES/2, 255);
- free(save_pic);
- save_pic = NULL;
- hasdrawnthumb = 1;
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
- }
- if (info_ready && !hasdrawninfo) {
- //Render all the save information
- cix = drawtext(vid_buf, 60, (YRES/2)+60, info->name, 255, 255, 255, 255);
- cix = drawtext(vid_buf, 60, (YRES/2)+72, "Author:", 255, 255, 255, 155);
- cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->author, 255, 255, 255, 255);
- cix = drawtext(vid_buf, cix+4, (YRES/2)+72, "Date:", 255, 255, 255, 155);
- cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->date, 255, 255, 255, 255);
- if(info->downloadcount){
- drawtext(vid_buf, 48+(XRES/2)-textwidth(viewcountbuffer)-textwidth("Views:")-4, (YRES/2)+72, "Views:", 255, 255, 255, 155);
- drawtext(vid_buf, 48+(XRES/2)-textwidth(viewcountbuffer), (YRES/2)+72, viewcountbuffer, 255, 255, 255, 255);
- }
- drawtextwrap(vid_buf, 62, (YRES/2)+86, (XRES/2)-24, info->description, 255, 255, 255, 200);
-
- //Draw the score bars
- if (info->voteup>0||info->votedown>0)
- {
- lv = (info->voteup>info->votedown)?info->voteup:info->votedown;
- lv = (lv>10)?lv:10;
-
- if (50>lv)
- {
- ryf = 50.0f/((float)lv);
- //if(lv<8)
- //{
- // ry = ry/(8-lv);
- //}
- nyu = info->voteup*ryf;
- nyd = info->votedown*ryf;
- }
- else
- {
- ryf = ((float)lv)/50.0f;
- nyu = info->voteup/ryf;
- nyd = info->votedown/ryf;
- }
- nyu = nyu>50?50:nyu;
- nyd = nyd>50?50:nyd;
-
- fillrect(vid_buf, 48+(XRES/2)-51, (YRES/2)+53, 52, 6, 0, 107, 10, 255);
- fillrect(vid_buf, 48+(XRES/2)-51, (YRES/2)+59, 52, 6, 107, 10, 0, 255);
- drawrect(vid_buf, 48+(XRES/2)-51, (YRES/2)+53, 52, 6, 128, 128, 128, 255);
- drawrect(vid_buf, 48+(XRES/2)-51, (YRES/2)+59, 52, 6, 128, 128, 128, 255);
-
- fillrect(vid_buf, 48+(XRES/2)-nyu, (YRES/2)+54, nyu, 4, 57, 187, 57, 255);
- fillrect(vid_buf, 48+(XRES/2)-nyd, (YRES/2)+60, nyd, 4, 187, 57, 57, 255);
- }
-
- ccy = 0;
- for (cc=0; cc<info->comment_count; cc++) {
- if ((ccy + 72 + ((textwidth(info->comments[cc])/(XRES+BARSIZE-100-((XRES/2)+1)-20)))*12)<(YRES+MENUSIZE-50)) {
- drawtext(vid_buf, 60+(XRES/2)+1, ccy+60, info->commentauthors[cc], 255, 255, 255, 255);
- ccy += 12;
- ccy += drawtextwrap(vid_buf, 60+(XRES/2)+1, ccy+60, XRES+BARSIZE-100-((XRES/2)+1)-20, info->comments[cc], 255, 255, 255, 185);
- ccy += 10;
- if (ccy+52<YRES+MENUSIZE-50) { //Try not to draw off the screen.
- draw_line(vid_buf, 50+(XRES/2)+2, ccy+52, XRES+BARSIZE-50, ccy+52, 100, 100, 100, XRES+BARSIZE);
- }
- }
- }
- hasdrawninfo = 1;
- myown = svf_login && !strcmp(info->author, svf_user);
- authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod);
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
- }
- if (info_ready && svf_login) {
- //Render the comment box.
- fillrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 0, 0, 0, 255);
- drawrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 200, 200, 200, 255);
-
- drawrect(vid_buf, 54+(XRES/2)+1, YRES+MENUSIZE-121, XRES+BARSIZE-108-((XRES/2)+1), 48, 255, 255, 255, 200);
-
- ui_edit_draw(vid_buf, &ed);
-
- drawrect(vid_buf, XRES+BARSIZE-100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255);
- drawtext(vid_buf, XRES+BARSIZE-90, YRES+MENUSIZE-63, "Submit", 255, 255, 255, 255);
- }
-
- //Download completion
- downloadTotal = saveTotal+infoTotal;
- downloadDone = saveDone+infoDone;
- if(downloadTotal>downloadDone)
- {
- clearrect(vid_buf, 51, (YRES/2)+37, (XRES)/2, 14);
- fillrect(vid_buf, 51, (YRES/2)+38, (((float)XRES-2)/2.0f)*((float)downloadDone/(float)downloadTotal), 12, 255, 200, 0, 255);
- if(((float)downloadDone/(float)downloadTotal)>0.5f)
- drawtext(vid_buf, 51+(((XRES/2)-textwidth("Downloading"))/2), (YRES/2)+40, "Downloading", 0, 0, 0, 255);
- else
- drawtext(vid_buf, 51+(((XRES/2)-textwidth("Downloading"))/2), (YRES/2)+40, "Downloading", 255, 255, 255, 255);
- }
-
- //Save ID text and copybox
- cix = textwidth("Save ID: ");
- cix += ctb.width;
- ctb.x = textwidth("Save ID: ")+(XRES+BARSIZE-cix)/2;
- //ctb.x =
- drawtext(vid_buf, (XRES+BARSIZE-cix)/2, YRES+MENUSIZE-15, "Save ID: ", 255, 255, 255, 255);
- ui_copytext_draw(vid_buf, &ctb);
- ui_copytext_process(mx, my, b, bq, &ctb);
-
- //Open Button
- bc = openable?255:150;
- drawrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc);
- drawtext(vid_buf, 73, YRES+MENUSIZE-63, "Open", 255, 255, 255, bc);
- drawtext(vid_buf, 58, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc);
- //Fav Button
- bc = svf_login?255:150;
- drawrect(vid_buf, 100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc);
- if(info->myfav && svf_login){
- drawtext(vid_buf, 122, YRES+MENUSIZE-63, "Unfav.", 255, 230, 230, bc);
- } else {
- drawtext(vid_buf, 122, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, bc);
- }
- drawtext(vid_buf, 107, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, bc);
- //Report Button
- bc = (svf_login && info_ready)?255:150;
- drawrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc);
- drawtext(vid_buf, 168, YRES+MENUSIZE-63, "Report", 255, 255, 255, bc);
- drawtext(vid_buf, 155, YRES+MENUSIZE-64, "\xE3", 255, 255, 255, bc);
- //Delete Button
- bc = authoritah?255:150;
- drawrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc);
- drawtext(vid_buf, 218, YRES+MENUSIZE-63, "Delete", 255, 255, 255, bc);
- drawtext(vid_buf, 206, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, bc);
- //Open in browser button
- bc = 255;
- drawrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, bc);
- drawtext(vid_buf, 273, YRES+MENUSIZE-63, "Open in Browser", 255, 255, 255, bc);
- drawtext(vid_buf, 258, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc);
-
- //Open Button
- if (sdl_key==SDLK_RETURN && openable) {
- queue_open = 1;
- }
- if (mx > 50 && mx < 50+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && openable && !queue_open) {
- fillrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- queue_open = 1;
- }
- }
- //Fav Button
- if (mx > 100 && mx < 100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && !queue_open) {
- fillrect(vid_buf, 100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- if(info->myfav){
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- info_box(vid_buf, "Removing from favourites...");
- execute_unfav(vid_buf, save_id);
- info->myfav = 0;
- } else {
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- info_box(vid_buf, "Adding to favourites...");
- execute_fav(vid_buf, save_id);
- info->myfav = 1;
- }
- }
- }
- //Report Button
- if (mx > 150 && mx < 150+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready && !queue_open) {
- fillrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- if (report_ui(vid_buf, save_id)) {
- retval = 0;
- break;
- }
- }
- }
- //Delete Button
- if (mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && (authoritah || myown) && !queue_open) {
- fillrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- if (myown || !info->publish) {
- if (confirm_ui(vid_buf, "Are you sure you wish to delete this?", "You will not be able recover it.", "Delete")) {
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- info_box(vid_buf, "Deleting...");
- if (execute_delete(vid_buf, save_id)) {
- retval = 0;
- break;
- }
- }
- } else {
- if (confirm_ui(vid_buf, "Are you sure?", "This save will be removed from the search index.", "Remove")) {
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- info_box(vid_buf, "Removing...");
- if (execute_delete(vid_buf, save_id)) {
- retval = 0;
- break;
- }
- }
- }
- }
- }
- //Open in browser button
- if (mx > 250 && mx < 250+107 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && !queue_open) {
- fillrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- o_uri = malloc(7+strlen(SERVER)+41+strlen(save_id)*3);
- strcpy(o_uri, "http://" SERVER "/Browse/View.html?ID=");
- strcaturl(o_uri, save_id);
- open_link(o_uri);
- free(o_uri);
- }
- }
- //Submit Button
- if (mx > XRES+BARSIZE-100 && mx < XRES+BARSIZE-100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready && !queue_open) {
- fillrect(vid_buf, XRES+BARSIZE-100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40);
- if (b && !bq) {
- //Button Clicked
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- info_box(vid_buf, "Submitting Comment...");
- execute_submit(vid_buf, save_id, ed.str);
- ed.str[0] = 0;
- }
- }
- //If mouse was clicked outsite of the window bounds.
- if (!(mx>50 && my>50 && mx<XRES+BARSIZE-50 && my<YRES+MENUSIZE-50) && b && !queue_open && my<YRES+MENUSIZE-21) {
- retval = 0;
- break;
- }
-
- //User opened the save, wait until we've got all the data first...
- if (queue_open) {
- if (info_ready && data_ready) {
- // Do Open!
- status = parse_save(data, data_size, 1, 0, 0, bmap, vx, vy, pv, fvx, fvy, signs, parts, pmap);
- if (!status) {
- if(svf_last)
- free(svf_last);
- svf_last = data;
- data = NULL; //so we don't free it when returning
- svf_lsize = data_size;
-
- svf_open = 1;
- svf_own = svf_login && !strcmp(info->author, svf_user);
- svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user);
-
- strcpy(svf_id, save_id);
- strcpy(svf_name, info->name);
- strcpy(svf_description, info->description);
- if (info->tags)
- {
- strncpy(svf_tags, info->tags, 255);
- svf_tags[255] = 0;
- } else {
- svf_tags[0] = 0;
- }
- svf_myvote = info->myvote;
- svf_filename[0] = 0;
- svf_fileopen = 0;
- retval = 1;
- break;
- } else {
- queue_open = 0;
-
- svf_open = 0;
- svf_filename[0] = 0;
- svf_fileopen = 0;
- svf_publish = 0;
- svf_own = 0;
- svf_myvote = 0;
- svf_id[0] = 0;
- svf_name[0] = 0;
- svf_description[0] = 0;
- svf_tags[0] = 0;
- if (svf_last)
- free(svf_last);
- svf_last = NULL;
- error_ui(vid_buf, 0, "An Error Occurred");
- }
- } else {
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190);
- drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128);
- }
- }
- if (!info_ready || !data_ready) {
- info_box(vid_buf, "Loading");
- }
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
- if (info_ready && svf_login) {
- ui_edit_process(mx, my, b, &ed);
- }
-
- if (sdl_key==SDLK_ESCAPE) {
- retval = 0;
- break;
- }
-
- if (lasttime<TIMEOUT)
- lasttime++;
- }
- //Prevent those mouse clicks being passed down.
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- //Close open connections
- if (http)
- http_async_req_close(http);
- if (http_2)
- http_async_req_close(http_2);
- if (http_3)
- http_async_req_close(http_3);
- info_parse("", info);
- free(info);
- free(old_vid);
- if (data) free(data);
- return retval;
-}
-
-int info_parse(char *info_data, save_info *info)
-{
- int i,j;
- char *p,*q,*r,*s,*vu,*vd,*pu,*sd;
-
- if (info->title) free(info->title);
- if (info->name) free(info->name);
- if (info->author) free(info->author);
- if (info->date) free(info->date);
- if (info->description) free(info->description);
- if (info->tags) free(info->tags);
- for (i=0;i<6;i++)
- {
- if (info->comments[i]) free(info->comments[i]);
- if (info->commentauthors[i]) free(info->commentauthors[i]);
- }
- memset(info, 0, sizeof(save_info));
-
- if (!info_data || !*info_data)
- return 0;
-
- i = 0;
- j = 0;
- s = NULL;
- do_open = 0;
- while (1)
- {
- if (!*info_data)
- break;
- p = strchr(info_data, '\n');
- if (!p)
- p = info_data + strlen(info_data);
- else
- *(p++) = 0;
-
- if (!strncmp(info_data, "TITLE ", 6))
- {
- info->title = mystrdup(info_data+6);
- j++;
- }
- else if (!strncmp(info_data, "NAME ", 5))
- {
- info->name = mystrdup(info_data+5);
- j++;
- }
- else if (!strncmp(info_data, "AUTHOR ", 7))
- {
- info->author = mystrdup(info_data+7);
- j++;
- }
- else if (!strncmp(info_data, "DATE ", 5))
- {
- info->date = mystrdup(info_data+5);
- j++;
- }
- else if (!strncmp(info_data, "DESCRIPTION ", 12))
- {
- info->description = mystrdup(info_data+12);
- j++;
- }
- else if (!strncmp(info_data, "VOTEUP ", 7))
- {
- info->voteup = atoi(info_data+7);
- j++;
- }
- else if (!strncmp(info_data, "VOTEDOWN ", 9))
- {
- info->votedown = atoi(info_data+9);
- j++;
- }
- else if (!strncmp(info_data, "VOTE ", 5))
- {
- info->vote = atoi(info_data+5);
- j++;
- }
- else if (!strncmp(info_data, "MYVOTE ", 7))
- {
- info->myvote = atoi(info_data+7);
- j++;
- }
- else if (!strncmp(info_data, "DOWNLOADS ", 10))
- {
- info->downloadcount = atoi(info_data+10);
- j++;
- }
- else if (!strncmp(info_data, "MYFAV ", 6))
- {
- info->myfav = atoi(info_data+6);
- j++;
- }
- else if (!strncmp(info_data, "PUBLISH ", 8))
- {
- info->publish = atoi(info_data+8);
- j++;
- }
- else if (!strncmp(info_data, "TAGS ", 5))
- {
- info->tags = mystrdup(info_data+5);
- j++;
- }
- else if (!strncmp(info_data, "COMMENT ", 8))
- {
- if (info->comment_count>=6) {
- info_data = p;
- continue;
- } else {
- q = strchr(info_data+8, ' ');
- *(q++) = 0;
- info->commentauthors[info->comment_count] = mystrdup(info_data+8);
- info->comments[info->comment_count] = mystrdup(q);
- info->comment_count++;
- }
- j++;
- }
- info_data = p;
- }
- if (j>=8) {
- return 1;
- } else {
- return -1;
- }
-}
-
-int search_results(char *str, int votes)
-{
- int i,j;
- char *p,*q,*r,*s,*vu,*vd,*pu,*sd;
-
- for (i=0; i<GRID_X*GRID_Y; i++)
- {
- if (search_ids[i])
- {
- free(search_ids[i]);
- search_ids[i] = NULL;
- }
- if (search_names[i])
- {
- free(search_names[i]);
- search_names[i] = NULL;
- }
- if (search_dates[i])
- {
- free(search_dates[i]);
- search_dates[i] = NULL;
- }
- if (search_owners[i])
- {
- free(search_owners[i]);
- search_owners[i] = NULL;
- }
- if (search_thumbs[i])
- {
- free(search_thumbs[i]);
- search_thumbs[i] = NULL;
- search_thsizes[i] = 0;
- }
- }
- for (j=0; j<TAG_MAX; j++)
- if (tag_names[j])
- {
- free(tag_names[j]);
- tag_names[j] = NULL;
- }
- server_motd[0] = 0;
-
- if (!str || !*str)
- return 0;
-
- i = 0;
- j = 0;
- s = NULL;
- do_open = 0;
- while (1)
- {
- if (!*str)
- break;
- p = strchr(str, '\n');
- if (!p)
- p = str + strlen(str);
- else
- *(p++) = 0;
- if (!strncmp(str, "OPEN ", 5))
- {
- do_open = 1;
- if (i>=GRID_X*GRID_Y)
- break;
- if (votes)
- {
- pu = strchr(str+5, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- s = strchr(pu, ' ');
- if (!s)
- return i;
- *(s++) = 0;
- vu = strchr(s, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- else
- {
- pu = strchr(str+5, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- vu = strchr(pu, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- if (!q)
- return i;
- *(q++) = 0;
- r = strchr(q, ' ');
- if (!r)
- return i;
- *(r++) = 0;
- search_ids[i] = mystrdup(str+5);
-
- search_publish[i] = atoi(pu);
- search_scoreup[i] = atoi(vu);
- search_scoredown[i] = atoi(vd);
-
- search_owners[i] = mystrdup(q);
- search_names[i] = mystrdup(r);
-
- if (s)
- search_votes[i] = atoi(s);
- thumb_cache_find(str+5, search_thumbs+i, search_thsizes+i);
- i++;
- }
- else if (!strncmp(str, "HISTORY ", 8))
- {
- char * id_d_temp = NULL;
- if (i>=GRID_X*GRID_Y)
- break;
- if (votes)
- {
- sd = strchr(str+8, ' ');
- if (!sd)
- return i;
- *(sd++) = 0;
- pu = strchr(sd, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- s = strchr(pu, ' ');
- if (!s)
- return i;
- *(s++) = 0;
- vu = strchr(s, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- else
- {
- sd = strchr(str+8, ' ');
- if (!sd)
- return i;
- *(sd++) = 0;
- pu = strchr(sd, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- vu = strchr(pu, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- if (!q)
- return i;
- *(q++) = 0;
- r = strchr(q, ' ');
- if (!r)
- return i;
- *(r++) = 0;
- search_ids[i] = mystrdup(str+8);
-
- search_dates[i] = mystrdup(sd);
-
- search_publish[i] = atoi(pu);
- search_scoreup[i] = atoi(vu);
- search_scoredown[i] = atoi(vd);
-
- search_owners[i] = mystrdup(q);
- search_names[i] = mystrdup(r);
-
- if (s)
- search_votes[i] = atoi(s);
-
- //Build thumb cache ID and find
- id_d_temp = malloc(strlen(search_ids[i])+strlen(search_dates[i])+2);
- strcpy(id_d_temp, search_ids[i]);
- strappend(id_d_temp, "_");
- strappend(id_d_temp, search_dates[i]);
- thumb_cache_find(id_d_temp, search_thumbs+i, search_thsizes+i);
- free(id_d_temp);
-
- i++;
- }
- else if (!strncmp(str, "MOTD ", 5))
- {
- strncpy(server_motd, str+5, 511);
- }
- else if (!strncmp(str, "TAG ", 4))
- {
- if (j >= TAG_MAX)
- {
- str = p;
- continue;
- }
- q = strchr(str+4, ' ');
- if (!q)
- {
- str = p;
- continue;
- }
- *(q++) = 0;
- tag_names[j] = mystrdup(str+4);
- tag_votes[j] = atoi(q);
- j++;
- }
- else
- {
- if (i>=GRID_X*GRID_Y)
- break;
- if (votes)
- {
- pu = strchr(str, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- s = strchr(pu, ' ');
- if (!s)
- return i;
- *(s++) = 0;
- vu = strchr(s, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- else
- {
- pu = strchr(str, ' ');
- if (!pu)
- return i;
- *(pu++) = 0;
- vu = strchr(pu, ' ');
- if (!vu)
- return i;
- *(vu++) = 0;
- vd = strchr(vu, ' ');
- if (!vd)
- return i;
- *(vd++) = 0;
- q = strchr(vd, ' ');
- }
- if (!q)
- return i;
- *(q++) = 0;
- r = strchr(q, ' ');
- if (!r)
- return i;
- *(r++) = 0;
- search_ids[i] = mystrdup(str);
-
- search_publish[i] = atoi(pu);
- search_scoreup[i] = atoi(vu);
- search_scoredown[i] = atoi(vd);
-
- search_owners[i] = mystrdup(q);
- search_names[i] = mystrdup(r);
-
- if (s)
- search_votes[i] = atoi(s);
- thumb_cache_find(str, search_thumbs+i, search_thsizes+i);
- i++;
- }
- str = p;
- }
- if (*str)
- i++;
- return i;
-}
-
-int execute_tagop(pixel *vid_buf, char *op, char *tag)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", "Tag", NULL};
- char *parts[2];
-
- char *uri = malloc(strlen(SERVER)+strlen(op)+36);
- sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op);
-
- parts[0] = svf_id;
- parts[1] = tag;
-
- result = http_multipart_post(
- uri,
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- free(uri);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return 1;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return 1;
- }
-
- if (result && result[2])
- {
- strncpy(svf_tags, result+3, 255);
- svf_id[15] = 0;
- }
-
- if (result)
- free(result);
-
- return 0;
-}
-
-void execute_save(pixel *vid_buf)
-{
- int status;
- char *result;
-
- char *names[] = {"Name","Description", "Data:save.bin", "Thumb:thumb.bin", "Publish", "ID", NULL};
- char *uploadparts[6];
- int plens[6];
-
- uploadparts[0] = svf_name;
- plens[0] = strlen(svf_name);
- uploadparts[1] = svf_description;
- plens[1] = strlen(svf_description);
- uploadparts[2] = build_save(plens+2, 0, 0, XRES, YRES, bmap, vx, vy, pv, fvx, fvy, signs, parts);
- if (!uploadparts[2])
- {
- error_ui(vid_buf, 0, "Error creating save");
- return;
- }
- uploadparts[3] = build_thumb(plens+3, 1);
- uploadparts[4] = (svf_publish==1)?"Public":"Private";
- plens[4] = strlen((svf_publish==1)?"Public":"Private");
-
- if (svf_id[0])
- {
- uploadparts[5] = svf_id;
- plens[5] = strlen(svf_id);
- }
- else
- names[5] = NULL;
-
- result = http_multipart_post(
- "http://" SERVER "/Save.api",
- names, uploadparts, plens,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (svf_last)
- free(svf_last);
- svf_last = uploadparts[2];
- svf_lsize = plens[2];
-
- free(uploadparts[3]);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return;
- }
- if (!result || strncmp(result, "OK", 2))
- {
- if (!result)
- result = mystrdup("Could not save - no reply from server");
- error_ui(vid_buf, 0, result);
- free(result);
- return;
- }
-
- if (result && result[2])
- {
- strncpy(svf_id, result+3, 15);
- svf_id[15] = 0;
- }
-
- if (!svf_id[0])
- {
- error_ui(vid_buf, 0, "No ID supplied by server");
- free(result);
- return;
- }
-
- thumb_cache_inval(svf_id);
-
- svf_own = 1;
- if (result)
- free(result);
-}
-
-int execute_delete(pixel *vid_buf, char *id)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", NULL};
- char *parts[1];
-
- parts[0] = id;
-
- result = http_multipart_post(
- "http://" SERVER "/Delete.api",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return 0;
- }
- if (result && strncmp(result, "INFO: ", 6)==0)
- {
- info_ui(vid_buf, "Info", result+6);
- free(result);
- return 0;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return 0;
- }
-
- if (result)
- free(result);
- return 1;
-}
-
-void execute_submit(pixel *vid_buf, char *id, char *message)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", "Message", NULL};
- char *parts[2];
-
- parts[0] = id;
- parts[1] = message;
-
- result = http_multipart_post(
- "http://" SERVER "/Comment.api",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return;
- }
-
- if (result)
- free(result);
-}
-
-int execute_report(pixel *vid_buf, char *id, char *reason)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", "Reason", NULL};
- char *parts[2];
-
- parts[0] = id;
- parts[1] = reason;
-
- result = http_multipart_post(
- "http://" SERVER "/Report.api",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return 0;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return 0;
- }
-
- if (result)
- free(result);
- return 1;
-}
-
-void execute_fav(pixel *vid_buf, char *id)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", NULL};
- char *parts[1];
-
- parts[0] = id;
-
- result = http_multipart_post(
- "http://" SERVER "/Favourite.api",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return;
- }
-
- if (result)
- free(result);
-}
-
-void execute_unfav(pixel *vid_buf, char *id)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", NULL};
- char *parts[1];
-
- parts[0] = id;
-
- result = http_multipart_post(
- "http://" SERVER "/Favourite.api?Action=Remove",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return;
- }
-
- if (result)
- free(result);
-}
-
-int execute_vote(pixel *vid_buf, char *id, char *action)
-{
- int status;
- char *result;
-
- char *names[] = {"ID", "Action", NULL};
- char *parts[2];
-
- parts[0] = id;
- parts[1] = action;
-
- result = http_multipart_post(
- "http://" SERVER "/Vote.api",
- names, parts, NULL,
- svf_user_id, /*svf_pass*/NULL, svf_session_id,
- &status, NULL);
-
- if (status!=200)
- {
- error_ui(vid_buf, status, http_ret_text(status));
- if (result)
- free(result);
- return 0;
- }
- if (result && strncmp(result, "OK", 2))
- {
- error_ui(vid_buf, 0, result);
- free(result);
- return 0;
- }
-
- if (result)
- free(result);
- return 1;
-}
-void open_link(char *uri) {
-#ifdef WIN32
- ShellExecute(0, "OPEN", uri, NULL, NULL, 0);
-#elif MACOSX
- char *cmd = malloc(7+strlen(uri));
- strcpy(cmd, "open ");
- strappend(cmd, uri);
- system(cmd);
-#elif LIN32
- char *cmd = malloc(11+strlen(uri));
- strcpy(cmd, "xdg-open ");
- strappend(cmd, uri);
- system(cmd);
-#elif LIN64
- char *cmd = malloc(11+strlen(uri));
- strcpy(cmd, "xdg-open ");
- strappend(cmd, uri);
- system(cmd);
-#else
- printf("Cannot open browser\n");
-#endif
-}
-struct command_history {
- void *prev_command;
- char *command;
-};
-typedef struct command_history command_history;
-command_history *last_command = NULL;
-command_history *last_command2 = NULL;
-char *console_ui(pixel *vid_buf,char error[255],char console_more) {
- int mx,my,b,cc,ci = -1,i;
- pixel *old_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- command_history *currentcommand;
- command_history *currentcommand2;
- ui_edit ed;
- ed.x = 15;
- ed.y = 207;
- ed.w = XRES;
- ed.nx = 1;
- ed.def = "";
- strcpy(ed.str, "");
- ed.focus = 1;
- ed.hide = 0;
- ed.multiline = 0;
- ed.cursor = 0;
- //fillrect(vid_buf, -1, -1, XRES, 220, 0, 0, 0, 190);
- if (!old_buf)
- return NULL;
- memcpy(old_buf,vid_buf,(XRES+BARSIZE)*YRES*PIXELSIZE);
-
- fillrect(old_buf, -1, -1, XRES+BARSIZE, 220, 0, 0, 0, 190);
-
- currentcommand2 = malloc(sizeof(command_history));
- memset(currentcommand2, 0, sizeof(command_history));
- currentcommand2->prev_command = last_command2;
- currentcommand2->command = mystrdup(error);
- last_command2 = currentcommand2;
-
- SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);//enable keyrepeat for console (is disabled on console close later)
- cc = 0;
- while (cc < 80) {
- fillrect(old_buf, -1, -1+cc, XRES+BARSIZE, 2, 0, 0, 0, 160-(cc*2));
- cc++;
- }
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- ed.focus = 1;
-
- memcpy(vid_buf,old_buf,(XRES+BARSIZE)*YRES*PIXELSIZE);
- draw_line(vid_buf, 0, 219, XRES+BARSIZE-1, 219, 228, 228, 228, XRES+BARSIZE);
-#ifdef PYCONSOLE
- if (pygood)
- i=255;
- else
- i=0;
- if (pyready)
- drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64, Python enabled)", 255, i, i, 255);
- else
- drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64, Python disabled)", 255, i, i, 255);
-#elif defined(LUACONSOLE)
- drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.4 (by cracker64, Lua enabled)", 255, 255, 255, 255);
-#else
- drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64)", 255, 255, 255, 255);
-#endif
-
- cc = 0;
- currentcommand = last_command;
- while (cc < 10)
- {
- if (currentcommand==NULL)
- break;
- drawtext(vid_buf, 15, 175-(cc*12), currentcommand->command, 255, 255, 255, 255);
- if (currentcommand->prev_command!=NULL)
- {
- if (cc<9) {
- currentcommand = currentcommand->prev_command;
- } else if (currentcommand->prev_command!=NULL) {
- free(currentcommand->prev_command);
- currentcommand->prev_command = NULL;
- }
- cc++;
- }
- else
- {
- break;
- }
- }
- cc = 0;
- currentcommand2 = last_command2;
- while (cc < 10)
- {
- if (currentcommand2==NULL)
- break;
- drawtext(vid_buf, 215, 175-(cc*12), currentcommand2->command, 255, 225, 225, 255);
- if (currentcommand2->prev_command!=NULL)
- {
- if (cc<9) {
- currentcommand2 = currentcommand2->prev_command;
- } else if (currentcommand2->prev_command!=NULL) {
- free(currentcommand2->prev_command);
- currentcommand2->prev_command = NULL;
- }
- cc++;
- }
- else
- {
- break;
- }
- }
-
- //if(error && ed.str[0]=='\0')
- //drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200);
- if (console_more==0)
- drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240);
- else
- drawtext(vid_buf, 5, 207, "...", 255, 255, 255, 240);
-
- ui_edit_draw(vid_buf, &ed);
- ui_edit_process(mx, my, b, &ed);
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-#ifdef OGLR
- clearScreenNP(1.0f);
- draw_parts_fbo();
-#endif
- if (sdl_key==SDLK_RETURN)
- {
- currentcommand = malloc(sizeof(command_history));
- memset(currentcommand, 0, sizeof(command_history));
- currentcommand->prev_command = last_command;
- currentcommand->command = mystrdup(ed.str);
- last_command = currentcommand;
- free(old_buf);
- SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
- return currentcommand->command;
- }
- if (sdl_key==SDLK_ESCAPE || sdl_key==SDLK_BACKQUOTE)
- {
- console_mode = 0;
- free(old_buf);
- SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
- return NULL;
- }
- if (sdl_key==SDLK_UP || sdl_key==SDLK_DOWN)
- {
- ci += sdl_key==SDLK_UP?1:-1;
- if (ci<-1)
- ci = -1;
- if (ci==-1)
- {
- strcpy(ed.str, "");
- ed.cursor = strlen(ed.str);
- }
- else
- {
- if (last_command!=NULL) {
- currentcommand = last_command;
- for (cc = 0; cc<ci; cc++) {
- if (currentcommand->prev_command==NULL)
- ci = cc;
- else
- currentcommand = currentcommand->prev_command;
- }
- strcpy(ed.str, currentcommand->command);
- ed.cursor = strlen(ed.str);
- }
- else
- {
- ci = -1;
- strcpy(ed.str, "");
- ed.cursor = strlen(ed.str);
- }
- }
- }
- }
- console_mode = 0;
- free(old_buf);
- SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
- return NULL;
-}
-
-unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int savedColor)
-{//TODO: have the text boxes be editable and update the color.
- int i,ss,hh,vv,cr=127,cg=0,cb=0,b = 0,mx,my,bq = 0,j, lb=0,lx=0,ly=0,lm=0,hidden=0;
- int line_x=0, line_y=0;
- int window_offset_x_left = 2;
- int window_offset_x_right = XRES - 279;
- int window_offset_y = 2;
- int grid_offset_x_left = 5;
- int grid_offset_x_right = XRES - 274;
- int grid_offset_y = 5;
- int onleft_button_offset_x_left = 259;
- int onleft_button_offset_x_right = 4;
- int on_left = 1;
- int grid_offset_x;
- int window_offset_x;
- int onleft_button_offset_x;
- int currH = 0, currS = 255, currV = 127;
- int currR = PIXR(savedColor), currG = PIXG(savedColor), currB = PIXB(savedColor);
- int th = currH, ts = currS, tv = currV;
- int tool = DECO_DRAW;
- int active_color_menu= 0;
- pixel *old_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- ui_edit box_R;
- ui_edit box_G;
- ui_edit box_B;
-
- zoom_en = 0;
-
- box_R.x = 5;
- box_R.y = 5+255+4;
- box_R.w = 30;
- box_R.nx = 1;
- box_R.def = "";
- strcpy(box_R.str, "127");
- box_R.focus = 0;
- box_R.hide = 0;
- box_R.multiline = 0;
- box_R.cursor = 0;
-
- box_G.x = 40;
- box_G.y = 5+255+4;
- box_G.w = 30;
- box_G.nx = 1;
- box_G.def = "";
- strcpy(box_G.str, "");
- box_G.focus = 0;
- box_G.hide = 0;
- box_G.multiline = 0;
- box_G.cursor = 0;
-
- box_B.x = 75;
- box_B.y = 5+255+4;
- box_B.w = 30;
- box_B.nx = 1;
- box_B.def = "";
- strcpy(box_B.str, "");
- box_B.focus = 0;
- box_B.hide = 0;
- box_B.multiline = 0;
- box_B.cursor = 0;
-
-
- if (!old_buf)
- return PIXRGB(currR,currG,currB);
- memcpy(old_buf,vid_buf,(XRES+BARSIZE)*YRES*PIXELSIZE);
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- memcpy(vid_buf,old_buf,(XRES+BARSIZE)*(YRES+MENUSIZE)*PIXELSIZE);
- render_before(vid_buf);
- render_after(vid_buf, NULL);
- ui_edit_process(mx, my, b, &box_R);
- ui_edit_process(mx, my, b, &box_G);
- ui_edit_process(mx, my, b, &box_B);
-
- if(on_left==1)
- {
- grid_offset_x = grid_offset_x_left;
- window_offset_x = window_offset_x_left;
- onleft_button_offset_x = onleft_button_offset_x_left;
- box_R.x = 5;
- box_G.x = 40;
- box_B.x = 75;
- }
- else
- {
- grid_offset_x = grid_offset_x_right;
- window_offset_x = window_offset_x_right;
- onleft_button_offset_x = onleft_button_offset_x_right;
- box_R.x = XRES - 254 + 5;
- box_G.x = XRES - 254 + 40;
- box_B.x = XRES - 254 + 75;
- }
- mouse_coords_window_to_sim(&mx, &my, mx, my);//change mouse position while it is in a zoom window
-
- drawrect(vid_buf, -1, -1, XRES+1, YRES+1, 220, 220, 220, 255);
- drawrect(vid_buf, -1, -1, XRES+2, YRES+2, 70, 70, 70, 255);
- drawtext(vid_buf, 2, 388, "Welcome to the decoration editor v.3 (by cracker64) \n\nClicking the current color on the window will move it to the other side. Right click is eraser. ", 255, 255, 255, 255);
-
- if(!hidden)
- {
- clearrect(vid_buf, window_offset_x, window_offset_y, 2+255+4+10+5, 2+255+20);
- drawrect(vid_buf, window_offset_x, window_offset_y, 2+255+4+10+5, 2+255+20, 255, 255, 255, 255);//window around whole thing
-
- drawrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6, 12, 12, 255, 255, 255, 255);
- drawrect(vid_buf, window_offset_x + 230, window_offset_y +255+6, 26, 12, 255, 255, 255, 255);
- drawtext(vid_buf, window_offset_x + 232, window_offset_y +255+9, "Clear", 255, 255, 255, 255);
- ui_edit_draw(vid_buf, &box_R);
- ui_edit_draw(vid_buf, &box_G);
- ui_edit_draw(vid_buf, &box_B);
-
- //draw color square
- for(ss=0; ss<=255; ss++)
- for(hh=0;hh<=359;hh++)
- {
- cr = 0;
- cg = 0;
- cb = 0;
- HSV_to_RGB(hh,255-ss,255-ss,&cr,&cg,&cb);
- vid_buf[(ss+grid_offset_y)*(XRES+BARSIZE)+(clamp_flt(hh, 0, 359)+grid_offset_x)] = PIXRGB(cr, cg, cb);
- }
- //draw brightness bar
- for(vv=0; vv<=255; vv++)
- for( i=0; i<10; i++)
- {
- cr = 0;
- cg = 0;
- cb = 0;
- HSV_to_RGB(currH,currS,vv,&cr,&cg,&cb);
- vid_buf[(vv+grid_offset_y)*(XRES+BARSIZE)+(i+grid_offset_x+255+4)] = PIXRGB(cr, cg, cb);
- }
- addpixel(vid_buf,grid_offset_x + clamp_flt(currH, 0, 359),grid_offset_y-1,255,255,255,255);
- addpixel(vid_buf,grid_offset_x -1,grid_offset_y+(255-currS),255,255,255,255);
-
- addpixel(vid_buf,grid_offset_x + clamp_flt(th, 0, 359),grid_offset_y-1,100,100,100,255);
- addpixel(vid_buf,grid_offset_x -1,grid_offset_y+(255-ts),100,100,100,255);
-
- addpixel(vid_buf,grid_offset_x + 255 +3,grid_offset_y+tv,100,100,100,255);
- addpixel(vid_buf,grid_offset_x + 255 +3,grid_offset_y +currV,255,255,255,255);
-
- fillrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6, 12, 12, currR, currG, currB, 255);
- }
- for (i=0; i<2; i++)//draw all the menu sections
- {
- draw_color_menu(vid_buf, i, active_color_menu);
- }
-
- for (i=0; i<2; i++)//check mouse position to see if it is on a menu section
- {
- if (!b&&mx>=XRES-2 && mx<XRES+BARSIZE-1 &&my>= (i*16)+YRES+MENUSIZE-16-(DECO_SECTIONS*16) && my<(i*16)+YRES+MENUSIZE-16-(DECO_SECTIONS*16)+15)
- {
- active_color_menu = i;
- }
- }
- if( color_menu_ui(vid_buf, active_color_menu, &currR, &currG, &currB, b, bq, mx, my, &tool) )
- RGB_to_HSV(currR,currG,currB,&currH,&currS,&currV);
-
- if(!box_R.focus)//prevent text update if it is being edited
- sprintf(box_R.str,"%d",currR);
- else
- {
- if(sdl_key == SDLK_RETURN)
- {
- cr = atoi(box_R.str);
- if (cr > 255) cr = 255;
- if (cr < 0) cr = 0;
- currR = cr;
- RGB_to_HSV(currR,currG,currB,&currH,&currS,&currV);
- box_R.focus = 0;
- }
- }
- if(!box_G.focus)
- sprintf(box_G.str,"%d",currG);
- else
- {
- if(sdl_key == SDLK_RETURN)
- {
- cg = atoi(box_G.str);
- if (cg > 255) cg = 255;
- if (cg < 0) cg = 0;
- currG = cg;
- RGB_to_HSV(currR,currG,currB,&currH,&currS,&currV);
- box_G.focus = 0;
- }
- }
- if(!box_B.focus)
- sprintf(box_B.str,"%d",currB);
- else
- {
- if(sdl_key == SDLK_RETURN)
- {
- cb = atoi(box_B.str);
- if (cb > 255) cb = 255;
- if (cb < 0) cb = 0;
- currB = cb;
- RGB_to_HSV(currR,currG,currB,&currH,&currS,&currV);
- box_B.focus = 0;
- }
- }
-
- fillrect(vid_buf, 250, YRES+4, 40, 15, currR, currG, currB, 255);
-
- drawrect(vid_buf, 295, YRES+5, 25, 12, 255, 255, 255, 255);
- if(hidden)
- drawtext(vid_buf, 297, YRES+5 +3, "Show", 255, 255, 255, 255);
- else
- drawtext(vid_buf, 297, YRES+5 +3, "Hide", 255, 255, 255, 255);
-
- if(!lb && !hidden && mx >= window_offset_x && my >= window_offset_y && mx <= window_offset_x+255+4+10+5 && my <= window_offset_y+255+20)//in the main window
- {
- //inside brightness bar
- if(mx >= grid_offset_x +255+4 && my >= grid_offset_y && mx <= grid_offset_x+255+4+10 && my <= grid_offset_y+255)
- {
- tv = my - grid_offset_y;
- if(b)
- {
- currV =my - grid_offset_y;
- HSV_to_RGB(currH,currS,tv,&currR,&currG,&currB);
- }
- HSV_to_RGB(currH,currS,tv,&cr,&cg,&cb);
- //clearrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6,12,12);
- fillrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6, 12, 12, cr, cg, cb, 255);
- if(!box_R.focus)
- sprintf(box_R.str,"%d",cr);
- if(!box_G.focus)
- sprintf(box_G.str,"%d",cg);
- if(!box_B.focus)
- sprintf(box_B.str,"%d",cb);
- }
- //inside color grid
- if(mx >= grid_offset_x && my >= grid_offset_y && mx <= grid_offset_x+255 && my <= grid_offset_y+255)
- {
- th = mx - grid_offset_x;
- th = (int)( th*359/255 );
- ts = 255 - (my - grid_offset_y);
- if(b)
- {
- currH = th;
- currS = ts;
- HSV_to_RGB(th,ts,currV,&currR,&currG,&currB);
- }
- HSV_to_RGB(th,ts,currV,&cr,&cg,&cb);
- //clearrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6,12,12);
- fillrect(vid_buf, window_offset_x + onleft_button_offset_x +1, window_offset_y +255+6, 12, 12, cr, cg, cb, 255);
- //sprintf(box_R.def,"%d",cr);
- if(!box_R.focus)
- sprintf(box_R.str,"%d",cr);
- if(!box_G.focus)
- sprintf(box_G.str,"%d",cg);
- if(!box_B.focus)
- sprintf(box_B.str,"%d",cb);
- }
- //switch side button
- if(b && !bq && mx >= window_offset_x + onleft_button_offset_x +1 && my >= window_offset_y +255+6 && mx <= window_offset_x + onleft_button_offset_x +13 && my <= window_offset_y +255+5 +13)
- {
- on_left = !on_left;
- lb = 3;//prevent immediate drawing after clicking
- }
- //clear button
- if(b && !bq && mx >= window_offset_x + 230 && my >= window_offset_y +255+6 && mx <= window_offset_x + 230 +26 && my <= window_offset_y +255+5 +13)
- if (confirm_ui(vid_buf, "Reset Decoration Layer", "Do you really want to erase everything?", "Erase") )
- {
- int i;
- for (i=0;i<NPART;i++)
- parts[i].dcolour = 0;
- }
- }
- else if (mx > XRES || my > YRES)//mouse outside normal drawing area
- {
- //hide/show button
- if (!zoom_en && b && !bq && mx >= 295 && mx <= 295+25 && my >= YRES+5 && my<= YRES+5+12)
- hidden = !hidden;
- }
- else if (sdl_zoom_trig && zoom_en<2)
- {
- mx -= ZSIZE/2;
- my -= ZSIZE/2;
- if (mx<0) mx=0;
- if (my<0) my=0;
- if (mx>XRES-ZSIZE) mx=XRES-ZSIZE;
- if (my>YRES-ZSIZE) my=YRES-ZSIZE;
- zoom_x = mx;
- zoom_y = my;
- zoom_wx = (mx<XRES/2) ? XRES-ZSIZE*ZFACTOR : 0;
- zoom_wy = 0;
- zoom_en = 1;
- hidden = 1;
- if (!b && bq)
- zoom_en = 2;
- }
- else if (b)//there is a click, outside color window
- {
- if (lb)//mouse is held down
- {
- if (lm == 1)//line tool preview
- {
- if (sdl_mod & KMOD_ALT)
- {
- float snap_angle = floor(atan2(my-ly, mx-lx)/(M_PI*0.25)+0.5)*M_PI*0.25;
- float line_mag = sqrtf(pow(mx-lx,2)+pow(my-ly,2));
- line_x = (int)(line_mag*cos(snap_angle)+lx+0.5f);
- line_y = (int)(line_mag*sin(snap_angle)+ly+0.5f);
- }
- else
- {
- line_x = mx;
- line_y = my;
- }
- xor_line(lx, ly, line_x, line_y, vid_buf);
- }
- else if (lm == 2)//box tool preview
- {
- xor_line(lx, ly, lx, my, vid_buf);
- xor_line(lx, my, mx, my, vid_buf);
- xor_line(mx, my, mx, ly, vid_buf);
- xor_line(mx, ly, lx, ly, vid_buf);
- }
- else if(lb!=3)//while mouse is held down, it draws lines between previous and current positions
- {
- line_decorations(lx, ly, mx, my, *bsx, *bsy, currR, currG, currB, b, tool);
- lx = mx;
- ly = my;
- }
- }
- else //first click
- {
- if ((sdl_mod & (KMOD_SHIFT)) && !(sdl_mod & (KMOD_CTRL)))
- {
- lx = mx;
- ly = my;
- lb = b;
- lm = 1;//line
- }
- //start box tool
- else if ((sdl_mod & (KMOD_CTRL)) && !(sdl_mod & (KMOD_SHIFT|KMOD_ALT)))
- {
- lx = mx;
- ly = my;
- lb = b;
- lm = 2;//box
- }
- //sample tool
- else if (((sdl_mod & (KMOD_ALT)) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL))) || b==SDL_BUTTON_MIDDLE)
- {
- if (my>=0 && my<YRES && mx>=0 && mx<XRES)
- {
- unsigned int tempcolor = vid_buf[(my)*(XRES+BARSIZE)+(mx)];
- cr = PIXR(tempcolor);
- cg = PIXG(tempcolor);
- cb = PIXB(tempcolor);
- if (cr || cg || cb)
- {
- if (cr && cr<255) cr++;
- if (cg && cg<255) cg++;
- if (cb && cb<255) cb++;
- currR = cr;
- currG = cg;
- currB = cb;
- }
- }
- lx = mx;
- ly = my;
- lb = 0;
- lm = 0;
- }
- else //normal click, draw deco
- {
- create_decorations(mx,my,*bsx,*bsy,currR,currG,currB,b, tool);
- lx = mx;
- ly = my;
- lb = b;
- lm = 0;
- }
- }
- }
- else
- {
- if (lb && lm) //lm is box/line tool
- {
- if (lm == 1)//line
- line_decorations(lx, ly, line_x, line_y, *bsx, *bsy, currR, currG, currB, lb, tool);
- else//box
- box_decorations(lx, ly, mx, my, currR, currG, currB, lb, tool);
- lm = 0;
- }
- lb = 0;
-
- }
- if (zoom_en!=1)
- render_cursor(vid_buf, mx, my, PT_DUST, *bsx, *bsy);
-
- if (zoom_en)
- render_zoom(vid_buf);
-
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (sdl_wheel)
- {
- if (sdl_zoom_trig)//zoom window change
- {
- ZSIZE += sdl_wheel;
- if (ZSIZE>60)
- ZSIZE = 60;
- if (ZSIZE<2)
- ZSIZE = 2;
- ZFACTOR = 256/ZSIZE;
- sdl_wheel = 0;
- }
- else //change brush size
- {
- if (!(sdl_mod & (KMOD_SHIFT|KMOD_CTRL)))
- {
- *bsx += sdl_wheel;
- *bsy += sdl_wheel;
- }
- else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL)))
- {
- *bsx += sdl_wheel;
- }
- else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT)))
- {
- *bsy += sdl_wheel;
- }
- if (*bsx>1180)
- *bsx = 1180;
- if (*bsx<0)
- *bsx = 0;
- if (*bsy>1180)
- *bsy = 1180;
- if (*bsy<0)
- *bsy = 0;
- sdl_wheel = 0;
- /*if(su >= PT_NUM) {
- if(sl < PT_NUM)
- su = sl;
- if(sr < PT_NUM)
- su = sr;
- }*/
- }
- }
- if (sdl_key==SDLK_LEFTBRACKET) {
- if (sdl_zoom_trig)
- {
- ZSIZE -= 1;
- if (ZSIZE>60)
- ZSIZE = 60;
- if (ZSIZE<2)
- ZSIZE = 2;
- ZFACTOR = 256/ZSIZE;
- }
- else
- {
- if (sdl_mod & (KMOD_LALT|KMOD_RALT) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL)))
- {
- *bsx -= 1;
- *bsy -= 1;
- }
- else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL)))
- {
- *bsx -= 1;
- }
- else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT)))
- {
- *bsy -= 1;
- }
- else
- {
- *bsx -= ceil((*bsx/5)+0.5f);
- *bsy -= ceil((*bsy/5)+0.5f);
- }
- if (*bsx>1180)
- *bsx = 1180;
- if (*bsy>1180)
- *bsy = 1180;
- if (*bsx<0)
- *bsx = 0;
- if (*bsy<0)
- *bsy = 0;
- }
- }
- if (sdl_key==SDLK_RIGHTBRACKET) {
- if (sdl_zoom_trig)
- {
- ZSIZE += 1;
- if (ZSIZE>60)
- ZSIZE = 60;
- if (ZSIZE<2)
- ZSIZE = 2;
- ZFACTOR = 256/ZSIZE;
- }
- else
- {
- if (sdl_mod & (KMOD_LALT|KMOD_RALT) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL)))
- {
- *bsx += 1;
- *bsy += 1;
- }
- else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL)))
- {
- *bsx += 1;
- }
- else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT)))
- {
- *bsy += 1;
- }
- else
- {
- *bsx += ceil((*bsx/5)+0.5f);
- *bsy += ceil((*bsy/5)+0.5f);
- }
- if (*bsx>1180)
- *bsx = 1180;
- if (*bsy>1180)
- *bsy = 1180;
- if (*bsx<0)
- *bsx = 0;
- if (*bsy<0)
- *bsy = 0;
- }
- }
- if (sdl_key==SDLK_TAB)
- {
- CURRENT_BRUSH =(CURRENT_BRUSH + 1)%BRUSH_NUM ;
- }
-
- if (!sdl_zoom_trig && zoom_en==1)
- {
- zoom_en = 0;
- }
- if (sdl_key=='z')
- {
- if (sdl_mod & KMOD_ALT)//toggle
- sdl_zoom_trig = (!sdl_zoom_trig)*2;
- else
- sdl_zoom_trig = 1;
- }
- if (sdl_rkey == 'z' && sdl_zoom_trig==1)//if ==2 then it was toggled with alt+z, don't turn off on keyup
- sdl_zoom_trig = 0;
-
- if (!sdl_zoom_trig && zoom_en==1)
- zoom_en = 0;
-
- if (sdl_key=='z' && zoom_en==2)
- zoom_en = 1;
-
- if(sdl_key=='b' || sdl_key==SDLK_ESCAPE)
- {
- free(old_buf);
- return PIXRGB(currR,currG,currB);
- }
- }
- free(old_buf);
- return PIXRGB(currR,currG,currB);
-}
-struct savelist_e {
- char *filename;
- char *name;
- pixel *image;
- void *next;
- void *prev;
-};
-typedef struct savelist_e savelist_e;
-savelist_e *get_local_saves(char *folder, char *search, int *results_ret)
-{
- int index = 0, results = 0;
- savelist_e *new_savelist = NULL;
- savelist_e *current_item = NULL, *new_item = NULL;
- char *fname;
-#if defined(WIN32) && !defined(__GNUC__)
- struct _finddata_t current_file;
- intptr_t findfile_handle;
- char *filematch = malloc(strlen(folder)+4);
- sprintf(filematch, "%s%s", folder, "*.*");
- findfile_handle = _findfirst(filematch, &current_file);
- free(filematch);
- if (findfile_handle == -1L)
- {
- *results_ret = 0;
- return NULL;
- }
- do
- {
- fname = current_file.name;
-#else
- struct dirent *derp;
- DIR *directory = opendir(folder);
- if(!directory)
- {
- printf("Unable to open directory\n");
- *results_ret = 0;
- return NULL;
- }
- while(derp = readdir(directory))
- {
- fname = derp->d_name;
-#endif
- if(strlen(fname)>4)
- {
- char *ext = fname+(strlen(fname)-4);
- if((!strncmp(ext, ".cps", 4) || !strncmp(ext, ".stm", 4)) && (search==NULL || strstr(fname, search)))
- {
- new_item = malloc(sizeof(savelist_e));
- new_item->filename = malloc(strlen(folder)+strlen(fname)+1);
- sprintf(new_item->filename, "%s%s", folder, fname);
- new_item->name = mystrdup(fname);
- new_item->image = NULL;
- new_item->next = NULL;
- if(new_savelist==NULL){
- new_savelist = new_item;
- new_item->prev = NULL;
- } else {
- current_item->next = new_item;
- new_item->prev = current_item;
- }
- current_item = new_item;
- results++;
- }
- }
- }
-#if defined(WIN32) && !defined(__GNUC__)
- while (_findnext(findfile_handle, &current_file) == 0);
- _findclose(findfile_handle);
-#else
- closedir(directory);
-#endif
- *results_ret = results;
- return new_savelist;
-}
-
-void free_saveslist(savelist_e *saves)
-{
- if(!saves)
- return;
- if(saves->next!=NULL)
- free_saveslist(saves->next);
- if(saves->filename!=NULL)
- free(saves->filename);
- if(saves->name!=NULL)
- free(saves->name);
- if(saves->image!=NULL)
- free(saves->image);
-}
-
-int save_filename_ui(pixel *vid_buf)
-{
- int xsize = 16+(XRES/3);
- int ysize = 64+(YRES/3);
- float ca = 0;
- int x0=(XRES+BARSIZE-xsize)/2,y0=(YRES+MENUSIZE-ysize)/2,b=1,bq,mx,my;
- int idtxtwidth, nd=0, imgw, imgh, save_size;
- void *save_data;
- char *savefname = NULL;
- char *filename = NULL;
- pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- pixel *save_tmp;
- pixel *save_data_image;
- pixel *save = NULL;//calloc((XRES/3)*(YRES/3), PIXELSIZE);
- ui_edit ed;
-
- save_data = build_save(&save_size, 0, 0, XRES, YRES, bmap, vx, vy, pv, fvx, fvy, signs, parts);
- save_data_image = prerender_save(save_data, save_size, &imgw, &imgh);
- if(save_data_image!=NULL)
- {
- save = resample_img(save_data_image, imgw, imgh, XRES/3, YRES/3);
- }
-
- ed.x = x0+11;
- ed.y = y0+25;
- ed.w = xsize-4-16;
- ed.nx = 1;
- ed.def = "[filename]";
- ed.focus = 1;
- ed.hide = 0;
- ed.cursor = 0;
- ed.multiline = 0;
- ed.str[0] = 0;
-
- if(svf_fileopen){
- char * dotloc = NULL;
- strncpy(ed.str, svf_filename, 255);
- if(dotloc = strstr(ed.str, "."))
- {
- dotloc[0] = 0;
- }
- ed.cursor = strlen(ed.str);
- }
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- draw_rgba_image(vid_buf, save_to_disk_image, 0, 0, 0.7);
-
- memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, "Filename:", 255, 255, 255, 255);
- drawrect(vid_buf, x0+8, y0+20, xsize-16, 16, 255, 255, 255, 180);
- if(save!=NULL)
- {
- draw_image(vid_buf, save, x0+8, y0+40, XRES/3, YRES/3, 255);
- }
- drawrect(vid_buf, x0+8, y0+40, XRES/3, YRES/3, 192, 192, 192, 255);
-
- drawrect(vid_buf, x0, y0+ysize-16, xsize, 16, 192, 192, 192, 255);
- fillrect(vid_buf, x0, y0+ysize-16, xsize, 16, 170, 170, 192, (int)ca);
- drawtext(vid_buf, x0+8, y0+ysize-12, "Save", 255, 255, 255, 255);
-
- ui_edit_draw(vid_buf, &ed);
- if (strlen(ed.str) || ed.focus)
- drawtext(vid_buf, x0+12+textwidth(ed.str), y0+25, ".cps", 240, 240, 255, 180);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE);
-
- ui_edit_process(mx, my, b, &ed);
-
- if(mx > x0 && mx < x0+xsize && my > y0+ysize-16 && my < y0+ysize)
- {
- if(b && !bq)
- {
- FILE *f = NULL;
- savefname = malloc(strlen(ed.str)+5);
- filename = malloc(strlen(LOCAL_SAVE_DIR)+strlen(PATH_SEP)+strlen(ed.str)+5);
- sprintf(filename, "%s%s%s.cps", LOCAL_SAVE_DIR, PATH_SEP, ed.str);
- sprintf(savefname, "%s.cps", ed.str);
-
-#ifdef WIN32
- _mkdir(LOCAL_SAVE_DIR);
-#else
- mkdir(LOCAL_SAVE_DIR, 0755);
-#endif
- f = fopen(filename, "r");
- if(!f || confirm_ui(vid_buf, "A save with the name already exists.", filename, "Overwrite"))
- {
- if(f)
- {
- fclose(f);
- f = NULL;
- }
- f = fopen(filename, "wb");
- if (f)
- {
- fwrite(save_data, save_size, 1, f);
- fclose(f);
- if(svf_fileopen)
- {
- strncpy(svf_filename, savefname, 255);
- svf_fileopen = 1;
-
- //Allow reloading
- if(svf_last)
- free(svf_last);
- svf_last = malloc(save_size);
- memcpy(svf_last, save_data, save_size);
- svf_lsize = save_size;
- }
- break;
- } else {
- error_ui(vid_buf, 0, "Unable to write to save file.");
- }
- }
- fclose(f);
- }
- }
-
- if (sdl_key==SDLK_ESCAPE)
- {
- if (!ed.focus)
- break;
- ed.focus = 0;
- }
- }
-
-savefin:
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
- free(save_data_image);
- free(save_data);
- free(old_vid);
- free(save);
- if(filename) free(filename);
- if(savefname) free(savefname);
- return 0;
-}
-
-void catalogue_ui(pixel * vid_buf)
-{
- int xsize = 8+(XRES/CATALOGUE_S+8)*CATALOGUE_X;
- int ysize = 48+(YRES/CATALOGUE_S+20)*CATALOGUE_Y;
- int x0=(XRES+BARSIZE-xsize)/2,y0=(YRES+MENUSIZE-ysize)/2,b=1,bq,mx,my;
- int rescount, imageoncycle = 0, currentstart = 0, currentoffset = 0, thidden = 0, cactive = 0;
- int listy = 0, listxc;
- int listx = 0, listyc;
- pixel * vid_buf2;
- float scrollvel, offsetf = 0.0f;
- char savetext[128] = "";
- char * last = mystrdup("");
- savelist_e *saves, *cssave, *csave;
- ui_edit ed;
-
- vid_buf2 = calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
- if (!vid_buf2)
- return;
-
- ed.w = xsize-16-4;
- ed.x = x0+11;
- ed.y = y0+29;
- ed.multiline = 0;
- ed.def = "[search]";
- ed.focus = 0;
- ed.hide = 0;
- ed.cursor = 0;
- ed.nx = 0;
- strcpy(ed.str, "");
-
- saves = get_local_saves(LOCAL_SAVE_DIR PATH_SEP, NULL, &rescount);
- cssave = csave = saves;
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
- sprintf(savetext, "Found %d save%s", rescount, rescount==1?"":"s");
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- clearrect(vid_buf2, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, "Saves", 255, 216, 32, 255);
- drawtext(vid_buf, x0+xsize-8-textwidth(savetext), y0+8, savetext, 255, 216, 32, 255);
- drawrect(vid_buf, x0+8, y0+24, xsize-16, 16, 255, 255, 255, 180);
- if(strcmp(ed.str, last)){
- free(last);
- last = mystrdup(ed.str);
- currentstart = 0;
- if(saves!=NULL) free_saveslist(saves);
- saves = get_local_saves(LOCAL_SAVE_DIR PATH_SEP, last, &rescount);
- cssave = saves;
- scrollvel = 0.0f;
- offsetf = 0.0f;
- thidden = 0;
- }
- //Scrolling
- if (sdl_wheel!=0)
- {
- scrollvel -= (float)sdl_wheel;
- if(scrollvel > 5.0f) scrollvel = 5.0f;
- if(scrollvel < -5.0f) scrollvel = -5.0f;
- sdl_wheel = 0;
- }
- offsetf += scrollvel;
- scrollvel*=0.99f;
- if(offsetf >= (YRES/CATALOGUE_S+20) && rescount)
- {
- if(rescount - thidden > CATALOGUE_X*(CATALOGUE_Y+1))
- {
- int i = 0;
- for(i = 0; i < CATALOGUE_X; i++){
- if(cssave->next==NULL)
- break;
- cssave = cssave->next;
- }
- offsetf -= (YRES/CATALOGUE_S+20);
- thidden += CATALOGUE_X;
- } else {
- offsetf = (YRES/CATALOGUE_S+20);
- }
- }
- if(offsetf > 0.0f && rescount <= CATALOGUE_X*CATALOGUE_Y && rescount)
- {
- offsetf = 0.0f;
- }
- if(offsetf < 0.0f && rescount)
- {
- if(thidden >= CATALOGUE_X)
- {
- int i = 0;
- for(i = 0; i < CATALOGUE_X; i++){
- if(cssave->prev==NULL)
- break;
- cssave = cssave->prev;
- }
- offsetf += (YRES/CATALOGUE_S+20);
- thidden -= CATALOGUE_X;
- } else {
- offsetf = 0.0f;
- }
- }
- currentoffset = (int)offsetf;
- csave = cssave;
- //Diplay
- if(csave!=NULL && rescount)
- {
- listx = 0;
- listy = 0;
- while(csave!=NULL)
- {
- listxc = x0+8+listx*(XRES/CATALOGUE_S+8);
- listyc = y0+48-currentoffset+listy*(YRES/CATALOGUE_S+20);
- if(listyc > y0+ysize) //Stop when we get to the bottom of the viewable
- break;
- cactive = 0;
- if(my > listyc && my < listyc+YRES/CATALOGUE_S+2 && mx > listxc && mx < listxc+XRES/CATALOGUE_S && my > y0+48 && my < y0+ysize)
- {
- if(b)
- {
- int status, size;
- void *data;
- data = file_load(csave->filename, &size);
- if(data){
- status = parse_save(data, size, 1, 0, 0, bmap, vx, vy, pv, fvx, fvy, signs, parts, pmap);
- if(!status)
- {
- //svf_filename[0] = 0;
- strncpy(svf_filename, csave->name, 255);
- svf_fileopen = 1;
- svf_open = 0;
- svf_publish = 0;
- svf_own = 0;
- svf_myvote = 0;
- svf_id[0] = 0;
- svf_name[0] = 0;
- svf_description[0] = 0;
- svf_tags[0] = 0;
- svf_last = data;
- data = NULL;
- svf_lsize = size;
- goto openfin;
- } else {
- error_ui(vid_buf, 0, "Save data corrupt");
- free(data);
- }
- } else {
- error_ui(vid_buf, 0, "Unable to read save file");
- }
- }
- cactive = 1;
- }
- //Generate an image
- if(csave->image==NULL && !imageoncycle){ //imageoncycle: Don't read/parse more than one image per cycle, makes it more resposive for slower computers
- int imgwidth, imgheight, size;
- pixel *tmpimage = NULL;
- void *data = NULL;
- data = file_load(csave->filename, &size);
- if(data!=NULL){
- tmpimage = prerender_save(data, size, &imgwidth, &imgheight);
- if(tmpimage!=NULL)
- {
- csave->image = resample_img(tmpimage, imgwidth, imgheight, XRES/CATALOGUE_S, YRES/CATALOGUE_S);
- free(tmpimage);
- } else {
- //Blank image, TODO: this should default to something else
- csave->image = calloc((XRES/CATALOGUE_S)*(YRES/CATALOGUE_S), PIXELSIZE);
- }
- free(data);
- } else {
- //Blank image, TODO: this should default to something else
- csave->image = calloc((XRES/CATALOGUE_S)*(YRES/CATALOGUE_S), PIXELSIZE);
- }
- imageoncycle = 1;
- }
- if(csave->image!=NULL)
- draw_image(vid_buf2, csave->image, listxc, listyc, XRES/CATALOGUE_S, YRES/CATALOGUE_S, 255);
- drawrect(vid_buf2, listxc, listyc, XRES/CATALOGUE_S, YRES/CATALOGUE_S, 255, 255, 255, 190);
- if(cactive)
- drawtext(vid_buf2, listxc+((XRES/CATALOGUE_S)/2-textwidth(csave->name)/2), listyc+YRES/CATALOGUE_S+3, csave->name, 255, 255, 255, 255);
- else
- drawtext(vid_buf2, listxc+((XRES/CATALOGUE_S)/2-textwidth(csave->name)/2), listyc+YRES/CATALOGUE_S+3, csave->name, 240, 240, 255, 180);
- if (mx>=listxc+XRES/GRID_S-4 && mx<=listxc+XRES/GRID_S+6 && my>=listyc-6 && my<=listyc+4)
- {
- if (b && !bq && confirm_ui(vid_buf, "Do you want to delete?", csave->name, "Delete"))
- {
- remove(csave->filename);
- currentstart = 0;
- if(saves!=NULL) free_saveslist(saves);
- saves = get_local_saves(LOCAL_SAVE_DIR PATH_SEP, last, &rescount);
- cssave = saves;
- scrollvel = 0.0f;
- offsetf = 0.0f;
- thidden = 0;
- if (rescount == 0)
- rmdir(LOCAL_SAVE_DIR PATH_SEP);
- break;
- }
- drawtext(vid_buf2, listxc+XRES/GRID_S-4, listyc-6, "\x86", 255, 48, 32, 255);
- }
- else
- drawtext(vid_buf2, listxc+XRES/GRID_S-4, listyc-6, "\x86", 160, 48, 32, 255);
- drawtext(vid_buf2, listxc+XRES/GRID_S-4, listyc-6, "\x85", 255, 255, 255, 255);
- csave = csave->next;
- if(++listx==CATALOGUE_X){
- listx = 0;
- listy++;
- }
- }
- imageoncycle = 0;
- } else {
- drawtext(vid_buf2, x0+(xsize/2)-(textwidth("No saves found")/2), y0+(ysize/2)+20, "No saves found", 255, 255, 255, 180);
- }
- ui_edit_draw(vid_buf, &ed);
- ui_edit_process(mx, my, b, &ed);
- //Draw the scrollable area onto the main buffer
- {
- pixel *srctemp = vid_buf2, *desttemp = vid_buf;
- int j = 0;
- for (j = y0+42; j < y0+ysize; j++)
- {
- memcpy(desttemp+j*(XRES+BARSIZE)+x0+1, srctemp+j*(XRES+BARSIZE)+x0+1, (xsize-1)*PIXELSIZE);
- //desttemp+=(XRES+BARSIZE);//*PIXELSIZE;
- //srctemp+=(XRES+BARSIZE);//*PIXELSIZE;
- }
- }
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-openfin:
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- if(saves)
- free_saveslist(saves);
- return;
-}
-
-void drawIcon(pixel * vid_buf, int x, int y, int cmode)
-{
- switch (cmode)
- {
- case 0x98:
- drawtext(vid_buf, x, y, "\x98", 128, 160, 255, 255);
- break;
- case 0x99:
- drawtext(vid_buf, x, y, "\x99", 255, 212, 32, 255);
- break;
- case 0x9A:
- drawtext(vid_buf, x, y, "\x9A", 212, 212, 212, 255);
- break;
- case 0x9B:
- drawtext(vid_buf, x+1, y, "\x9B", 255, 0, 0, 255);
- drawtext(vid_buf, x+1, y, "\x9C", 255, 255, 64, 255);
- break;
- case 0xBF:
- drawtext(vid_buf, x, y, "\xBF", 55, 255, 55, 255);
- break;
- case 0xBE:
- drawtext(vid_buf, x+2, y, "\xBE", 255, 0, 0, 255);
- drawtext(vid_buf, x+2, y, "\xBD", 255, 255, 255, 255);
- break;
- case 0xC4:
- drawtext(vid_buf, x, y, "\xC4", 100, 150, 255, 255);
- break;
- case 0xD3:
- drawtext(vid_buf, x, y, "\xD3", 255, 50, 255, 255);
- break;
- case 0xE0:
- drawtext(vid_buf, x, y, "\xE0", 255, 255, 255, 255);
- break;
- case 0xE1:
- drawtext(vid_buf, x, y, "\xE1", 255, 255, 160, 255);
- break;
- case 0xDF:
- drawtext(vid_buf, x, y, "\xDF", 200, 255, 255, 255);
- break;
- case 0xDE:
- drawtext(vid_buf, x, y, "\xDE", 255, 255, 255, 255);
- break;
- case 0xDB:
- drawtext(vid_buf, x, y, "\xDB", 255, 255, 200, 255);
- break;
- case 0xD4:
- drawtext(vid_buf, x, y, "\xD4", 255, 55, 55, 255);
- drawtext(vid_buf, x, y, "\xD5", 55, 255, 55, 255);
- break;
- }
-}
-
-void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
-{
- pixel * o_vid_buf;
- pixel *part_vbuf; //Extra video buffer
- pixel *part_vbuf_store;
- int i, j, count, changed, temp;
- int xsize;
- int ysize;
- int yoffset;
- int xoffset;
- int xcoffset;
- int b, bq, mx, my;
- ui_checkbox *render_cb;
- ui_checkbox *display_cb;
- ui_checkbox *colour_cb;
-
- int render_optioncount = 6;
- int render_options[] = {RENDER_EFFE, RENDER_GLOW, RENDER_FIRE, RENDER_BLUR, RENDER_BLOB, RENDER_BASC};
- int render_optionicons[] = {0xE1, 0xDF, 0x9B, 0xC4, 0xBF, 0xDB};
- char * render_desc[] = {"Effects", "Glow", "Fire", "Blur", "Blob", "Basic"};
-
- int display_optioncount = 7;
- int display_options[] = {DISPLAY_AIRC, DISPLAY_AIRP, DISPLAY_AIRV, DISPLAY_AIRH, DISPLAY_WARP, DISPLAY_PERS, DISPLAY_EFFE};
- int display_optionicons[] = {0xD4, 0x99, 0x98, 0xBE, 0xDE, 0x9A, 0xE1};
- char * display_desc[] = {"Air: Cracker", "Air: Pressure", "Air: Velocity", "Air: Heat", "Warp effect", "Persistent", "Effects"};
-
- int colour_optioncount = 4;
- int colour_options[] = {COLOUR_BASC, COLOUR_LIFE, COLOUR_HEAT, COLOUR_GRAD};
- int colour_optionicons[] = {0xDB, 0xE0, 0xBE, 0xD3};
- char * colour_desc[] = {"Basic", "Life", "Heat", "Heat Gradient"};
-
- yoffset = 16;
- xoffset = 0;
-
- xcoffset = 35;
-
- xsize = xcoffset*3;
- ysize = display_optioncount * yoffset + 6;
-
- ycoord -= ysize;
- xcoord -= xsize;
-
- colour_cb = calloc(colour_optioncount, sizeof(ui_checkbox));
- for(i = 0; i < colour_optioncount; i++)
- {
- colour_cb[i].x = (xcoffset * 0) + xcoord + (i * xoffset) + 5;
- colour_cb[i].y = ycoord + (i * yoffset) + 5;
- colour_cb[i].focus = 0;
- colour_cb[i].checked = 0;
- j = 0;
- if(colour_mode == colour_options[i])
- {
- colour_cb[i].checked = 1;
- }
- }
-
- render_cb = calloc(render_optioncount, sizeof(ui_checkbox));
- for(i = 0; i < render_optioncount; i++)
- {
- render_cb[i].x = (xcoffset * 1) + xcoord + (i * xoffset) + 5;
- render_cb[i].y = ycoord + (i * yoffset) + 5;
- render_cb[i].focus = 0;
- render_cb[i].checked = 0;
- j = 0;
- while(render_modes[j])
- {
- if(render_modes[j] == render_options[i])
- {
- render_cb[i].checked = 1;
- break;
- }
- j++;
- }
- }
-
- display_cb = calloc(display_optioncount, sizeof(ui_checkbox));
- for(i = 0; i < display_optioncount; i++)
- {
- display_cb[i].x = (xcoffset * 2) + xcoord + (i * xoffset) + 5;
- display_cb[i].y = ycoord + (i * yoffset) + 5;
- display_cb[i].focus = 0;
- display_cb[i].checked = 0;
- j = 0;
- while(display_modes[j])
- {
- if(display_modes[j] == display_options[i])
- {
- display_cb[i].checked = 1;
- break;
- }
- j++;
- }
- }
-
- o_vid_buf = calloc((YRES+MENUSIZE) * (XRES+BARSIZE), PIXELSIZE);
- //memcpy(o_vid_buf, vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
-
- part_vbuf = calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); //Extra video buffer
- part_vbuf_store = part_vbuf;
-
- if (!o_vid_buf || !part_vbuf || !part_vbuf_store)
- return;
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- memcpy(vid_buf, o_vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
-#ifdef OGLR
- part_vbuf = vid_buf;
-#else
- if(ngrav_enable && (display_mode & DISPLAY_WARP))
- {
- part_vbuf = part_vbuf_store;
- memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
- } else {
- part_vbuf = vid_buf;
- }
-#endif
- render_before(part_vbuf);
- render_after(part_vbuf, vid_buf);
- quickoptions_menu(vid_buf, b, bq, mx, my);
- for (i=0; i<SC_TOTAL; i++)//draw all the menu sections
- {
- draw_menu(vid_buf, i, active_menu);
- }
- draw_svf_ui(vid_buf, sdl_mod & (KMOD_LCTRL|KMOD_RCTRL));
-
- clearrect(vid_buf, xcoord-2, ycoord-2, xsize+4, ysize+4);
- drawrect(vid_buf, xcoord, ycoord, xsize, ysize, 192, 192, 192, 255);
-
- changed = 0;
- for(i = 0; i < render_optioncount; i++)
- {
- temp = render_cb[i].checked;
- drawIcon(vid_buf, render_cb[i].x + 16, render_cb[i].y+2, render_optionicons[i]);
- ui_checkbox_draw(vid_buf, &(render_cb[i]));
- ui_checkbox_process(mx, my, b, bq, &(render_cb[i]));
- if(render_cb[i].focus)
- drawtext(vid_buf, xcoord - textwidth(render_desc[i]) - 10, render_cb[i].y+2, render_desc[i], 255, 255, 255, 255);
- if(temp != render_cb[i].checked)
- changed = 1;
- }
- if(changed)
- {
- //Compile render options
- count = 1;
- for(i = 0; i < render_optioncount; i++)
- {
- if(render_cb[i].checked)
- count++;
- }
- free(render_modes);
- render_mode = 0;
- render_modes = calloc(count, sizeof(unsigned int));
- count = 0;
- for(i = 0; i < render_optioncount; i++)
- {
- if(render_cb[i].checked)
- {
- render_modes[count] = render_options[i];
- render_mode |= render_options[i];
- count++;
- }
- }
- }
-
- changed = 0;
- for(i = 0; i < display_optioncount; i++)
- {
- temp = display_cb[i].checked;
- drawIcon(vid_buf, display_cb[i].x + 16, display_cb[i].y+2, display_optionicons[i]);
-
- if(display_options[i] & DISPLAY_AIR)
- {
- ui_radio_draw(vid_buf, &(display_cb[i]));
- ui_radio_process(mx, my, b, bq, &(display_cb[i]));
- }
- else
- {
- ui_checkbox_draw(vid_buf, &(display_cb[i]));
- ui_checkbox_process(mx, my, b, bq, &(display_cb[i]));
- }
- if(display_cb[i].checked && (display_options[i] & DISPLAY_AIR)) //One air type only
- {
- for(j = 0; j < display_optioncount; j++)
- {
- if((display_options[j] & DISPLAY_AIR) && j!=i)
- {
- display_cb[j].checked = 0;
- }
- }
- }
- if(display_cb[i].focus)
- drawtext(vid_buf, xcoord - textwidth(display_desc[i]) - 10, display_cb[i].y+2, display_desc[i], 255, 255, 255, 255);
- if(temp != display_cb[i].checked)
- changed = 1;
- }
- if(changed)
- {
- //Compile display options
- count = 1;
- for(i = 0; i < display_optioncount; i++)
- {
- if(display_cb[i].checked)
- count++;
- }
- free(display_modes);
- display_mode = 0;
- display_modes = calloc(count, sizeof(unsigned int));
- count = 0;
- for(i = 0; i < display_optioncount; i++)
- {
- if(display_cb[i].checked)
- {
- display_modes[count] = display_options[i];
- display_mode |= display_options[i];
- count++;
- }
- }
- }
-
- changed = 0;
- for(i = 0; i < colour_optioncount; i++)
- {
- temp = colour_cb[i].checked;
- drawIcon(vid_buf, colour_cb[i].x + 16, colour_cb[i].y+2, colour_optionicons[i]);
- ui_radio_draw(vid_buf, &(colour_cb[i]));
- ui_radio_process(mx, my, b, bq, &(colour_cb[i]));
- if(colour_cb[i].checked) //One colour only
- {
- for(j = 0; j < colour_optioncount; j++)
- {
- if(j!=i)
- {
- colour_cb[j].checked = 0;
- }
- }
- }
- if(colour_cb[i].focus)
- drawtext(vid_buf, xcoord - textwidth(colour_desc[i]) - 10, colour_cb[i].y+2, colour_desc[i], 255, 255, 255, 255);
- if(temp != colour_cb[i].checked)
- changed = 1;
- }
- if(changed)
- {
- //Compile colour options
- colour_mode = 0;
- for(i = 0; i < colour_optioncount; i++)
- {
- if(colour_cb[i].checked)
- {
- colour_mode |= colour_options[i];
- }
- }
- }
-
-#ifdef OGLR
- clearScreenNP(1.0f);
- draw_parts_fbo();
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- if (b && !bq && (mx < xcoord || mx > xcoord+xsize || my < ycoord || my > ycoord+ysize))
- break;
- }
-
- free(colour_cb);
-
- free(render_cb);
-
- free(display_cb);
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- free(part_vbuf_store);
-
- free(o_vid_buf);
-}
-
-void simulation_ui(pixel * vid_buf)
-{
- int xsize = 300;
- int ysize = 260;
- int x0=(XRES-xsize)/2,y0=(YRES-MENUSIZE-ysize)/2,b=1,bq,mx,my;
- int new_scale, new_kiosk;
- ui_checkbox cb;
- ui_checkbox cb2;
- ui_checkbox cb3;
- ui_checkbox cb4;
- ui_checkbox cb5;
- ui_checkbox cb6;
- ui_checkbox cb7;
- char * airModeList[] = {"On", "Pressure Off", "Velocity Off", "Off", "No Update"};
- int airModeListCount = 5;
- char * gravityModeList[] = {"Vertical", "Off", "Radial"};
- int gravityModeListCount = 3;
- ui_list list;
- ui_list list2;
-
- cb.x = x0+xsize-16; //Heat simulation
- cb.y = y0+23;
- cb.focus = 0;
- cb.checked = !legacy_enable;
-
- cb2.x = x0+xsize-16; //Newt. Gravity
- cb2.y = y0+79;
- cb2.focus = 0;
- cb2.checked = ngrav_enable;
-
- cb3.x = x0+xsize-16; //Large window
- cb3.y = y0+199;
- cb3.focus = 0;
- cb3.checked = (sdl_scale==2)?1:0;
-
- cb4.x = x0+xsize-16; //Fullscreen
- cb4.y = y0+213;
- cb4.focus = 0;
- cb4.checked = (kiosk_enable==1)?1:0;
-
- cb5.x = x0+xsize-16; //Ambient heat
- cb5.y = y0+51;
- cb5.focus = 0;
- cb5.checked = aheat_enable;
-
- cb6.x = x0+xsize-16; //Water equalisation
- cb6.y = y0+107;
- cb6.focus = 0;
- cb6.checked = water_equal_test;
-
- cb7.x = x0+xsize-16; //Block frame
- cb7.y = y0+227;
- cb7.focus = 0;
- cb7.checked = bframe;
-
- list.x = x0+xsize-76; //Air Mode
- list.y = y0+135;
- list.w = 72;
- list.h = 16;
- list.def = "[air mode]";
- list.selected = airMode;
- list.items = airModeList;
- list.count = airModeListCount;
-
- list2.x = x0+xsize-76; //Gravity Mode
- list2.y = y0+163;
- list2.w = 72;
- list2.h = 16;
- list2.def = "[gravity mode]";
- list2.selected = gravityMode;
- list2.items = gravityModeList;
- list2.count = gravityModeListCount;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-
- while (!sdl_poll())
- {
- bq = b;
- b = mouse_get_state(&mx, &my);
-
- clearrect(vid_buf, x0-2, y0-2, xsize+4, ysize+4);
- drawrect(vid_buf, x0, y0, xsize, ysize, 192, 192, 192, 255);
- drawtext(vid_buf, x0+8, y0+8, "Simulation options", 255, 216, 32, 255);
-
- drawtext(vid_buf, x0+8, y0+26, "Heat simulation", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Heat simulation"), y0+26, "Introduced in version 34.", 255, 255, 255, 180);
- drawtext(vid_buf, x0+12, y0+40, "Older saves may behave oddly with this enabled.", 255, 255, 255, 120);
-
- drawtext(vid_buf, x0+8, y0+54, "Ambient heat simulation", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Ambient heat simulation"), y0+54, "Introduced in version 50.", 255, 255, 255, 180);
- drawtext(vid_buf, x0+12, y0+68, "Older saves may behave oddly with this enabled.", 255, 255, 255, 120);
-
- drawtext(vid_buf, x0+8, y0+82, "Newtonian gravity", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Newtonian gravity"), y0+82, "Introduced in version 48.", 255, 255, 255, 180);
- drawtext(vid_buf, x0+12, y0+96, "May also cause slow performance on older computers", 255, 255, 255, 120);
-
- drawtext(vid_buf, x0+8, y0+110, "Water Equalization Test", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Water Equalization Test"), y0+110, "Introduced in version 61.", 255, 255, 255, 180);
- drawtext(vid_buf, x0+12, y0+124, "May lag with lots of water.", 255, 255, 255, 120);
-
- drawtext(vid_buf, x0+8, y0+138, "Air Simulation Mode", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12, y0+152, "airMode", 255, 255, 255, 120);
-
- drawtext(vid_buf, x0+8, y0+166, "Gravity Simulation Mode", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12, y0+180, "gravityMode", 255, 255, 255, 120);
-
- draw_line(vid_buf, x0, y0+194, x0+xsize, y0+194, 150, 150, 150, XRES+BARSIZE);
-
- drawtext(vid_buf, x0+8, y0+200, "Large window", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Large window"), y0+200, "Double window size for small screens", 255, 255, 255, 180);
-
- drawtext(vid_buf, x0+8, y0+214, "Fullscreen", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Fullscreen"), y0+214, "Fill the entire screen", 255, 255, 255, 180);
-
- drawtext(vid_buf, x0+8, y0+228, "Block frame", 255, 255, 255, 255);
- drawtext(vid_buf, x0+12+textwidth("Block frame"), y0+228, "Draws a wall frame around screen", 255, 255, 255, 180);
-
- //TODO: Options for Air and Normal gravity
- //Maybe save/load defaults too.
-
- drawtext(vid_buf, x0+5, y0+ysize-11, "OK", 255, 255, 255, 255);
- drawrect(vid_buf, x0, y0+ysize-16, xsize, 16, 192, 192, 192, 255);
-
- ui_checkbox_draw(vid_buf, &cb);
- ui_checkbox_draw(vid_buf, &cb2);
- ui_checkbox_draw(vid_buf, &cb3);
- ui_checkbox_draw(vid_buf, &cb4);
- ui_checkbox_draw(vid_buf, &cb5);
- ui_checkbox_draw(vid_buf, &cb6);
- ui_checkbox_draw(vid_buf, &cb7);
- ui_list_draw(vid_buf, &list);
- ui_list_draw(vid_buf, &list2);
-#ifdef OGLR
- clearScreen(1.0f);
-#endif
- sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
- ui_checkbox_process(mx, my, b, bq, &cb);
- ui_checkbox_process(mx, my, b, bq, &cb2);
- ui_checkbox_process(mx, my, b, bq, &cb3);
- ui_checkbox_process(mx, my, b, bq, &cb4);
- ui_checkbox_process(mx, my, b, bq, &cb5);
- ui_checkbox_process(mx, my, b, bq, &cb6);
- ui_checkbox_process(mx, my, b, bq, &cb7);
- ui_list_process(vid_buf, mx, my, b, &list);
- ui_list_process(vid_buf, mx, my, b, &list2);
-
- if (b && !bq && mx>=x0 && mx<x0+xsize && my>=y0+ysize-16 && my<=y0+ysize)
- break;
-
- if (sdl_key==SDLK_RETURN)
- break;
- if (sdl_key==SDLK_ESCAPE)
- break;
- }
-
- water_equal_test = cb6.checked;
- legacy_enable = !cb.checked;
- aheat_enable = cb5.checked;
- new_scale = (cb3.checked)?2:1;
- new_kiosk = (cb4.checked)?1:0;
- if(list.selected>=0 && list.selected<=4)
- airMode = list.selected;
- if(list2.selected>=0 && list2.selected<=2)
- gravityMode = list2.selected;
- if(new_scale!=sdl_scale || new_kiosk!=kiosk_enable)
- {
- if (!set_scale(new_scale, new_kiosk))
- error_ui(vid_buf, 0, "Could not change display options");
- }
- if(ngrav_enable != cb2.checked)
- {
- if(cb2.checked)
- start_grav_async();
- else
- stop_grav_async();
- }
- if(cb7.checked && !bframe)
- draw_bframe();
- if(!cb7.checked && bframe)
- erase_bframe();
- bframe = cb7.checked;
-
- while (!sdl_poll())
- {
- b = mouse_get_state(&mx, &my);
- if (!b)
- break;
- }
-}
-
-Uint8 mouse_get_state(int *x, int *y)
-{
- //Wrapper around SDL_GetMouseState to divide by sdl_scale
- Uint8 sdl_b;
- int sdl_x, sdl_y;
- sdl_b = SDL_GetMouseState(&sdl_x, &sdl_y);
- *x = sdl_x/sdl_scale;
- *y = sdl_y/sdl_scale;
- return sdl_b;
-}
-
-void mouse_coords_window_to_sim(int *sim_x, int *sim_y, int window_x, int window_y)
-{
- //Change mouse coords to take zoom window into account
- if (zoom_en && window_x>=zoom_wx && window_y>=zoom_wy
- && window_x<(zoom_wx+ZFACTOR*ZSIZE)
- && window_y<(zoom_wy+ZFACTOR*ZSIZE))
- {
- *sim_x = (((window_x-zoom_wx)/ZFACTOR)+zoom_x);
- *sim_y = (((window_y-zoom_wy)/ZFACTOR)+zoom_y);
- }
- else
- {
- *sim_x = window_x;
- *sim_y = window_y;
- }
-}