Merge branch 'master' of github.com:FacialTurd/The-Powder-Toy

This commit is contained in:
Simon Robertshaw 2012-04-30 21:49:40 +01:00
commit 211770e818
12 changed files with 360 additions and 232 deletions

View File

@ -8,9 +8,9 @@
#endif
//VersionInfoStart
#define SAVE_VERSION 76
#define SAVE_VERSION 77
#define MINOR_VERSION 0
#define BUILD_NUM 157
#define BUILD_NUM 159
//VersionInfoEnd
#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter

View File

@ -340,5 +340,10 @@ void render_ui(pixel *vid_buf, int xcoord, int ycoord, int orientation);
void simulation_ui(pixel *vid_buf);
unsigned int decorations_ui(pixel *vid_buf, int *bsx, int *bsy, unsigned int savedColor);
Uint8 mouse_get_state(int *x, int *y);
void mouse_coords_window_to_sim(int *sim_x, int *sim_y, int window_x, int window_y);
#endif

View File

@ -330,6 +330,8 @@ int graphics_DCEL(GRAPHICS_FUNC_ARGS);
int graphics_GEL(GRAPHICS_FUNC_ARGS);
int graphics_TRON(GRAPHICS_FUNC_ARGS);
void TRON_init_graphics();
#define UPDATE_FUNC_ARGS int i, int x, int y, int surround_space, int nt
// to call another update function with same arguments:
#define UPDATE_FUNC_SUBCALL_ARGS i, x, y, surround_space, nt

View File

@ -340,7 +340,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "type")==0)
else if (strcmp(console3, "type")==0)
{
if (strcmp(console4, "all")==0)
{
@ -369,7 +369,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "temp")==0)
else if (strcmp(console3, "temp")==0)
{
if (strcmp(console4, "all")==0)
{
@ -398,7 +398,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "tmp")==0)
else if (strcmp(console3, "tmp")==0)
{
if (strcmp(console4, "all")==0)
{
@ -427,7 +427,36 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "x")==0)
else if (strcmp(console3, "tmp2")==0)
{
if (strcmp(console4, "all")==0)
{
j = atoi(console5);
for (i=0; i<NPART; i++)
{
if (parts[i].type)
parts[i].tmp2 = j;
}
}
else if (console_parse_type(console4, &j, console_error))
{
k = atoi(console5);
for (i=0; i<NPART; i++)
{
if (parts[i].type == j)
parts[i].tmp2 = k;
}
}
else
{
if (console_parse_partref(console4, &i, console_error))
{
j = atoi(console5);
parts[i].tmp2 = j;
}
}
}
else if (strcmp(console3, "x")==0)
{
if (strcmp(console4, "all")==0)
{
@ -456,7 +485,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "y")==0)
else if (strcmp(console3, "y")==0)
{
if (strcmp(console4, "all")==0)
{
@ -485,7 +514,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "ctype")==0)
else if (strcmp(console3, "ctype")==0)
{
if (strcmp(console4, "all")==0)
{
@ -514,7 +543,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "vx")==0)
else if (strcmp(console3, "vx")==0)
{
if (strcmp(console4, "all")==0)
{
@ -543,7 +572,7 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
if (strcmp(console3, "vy")==0)
else if (strcmp(console3, "vy")==0)
{
if (strcmp(console4, "all")==0)
{
@ -572,6 +601,8 @@ int process_command_old(pixel *vid_buf, char *console, char *console_error)
}
}
}
else
strcpy(console_error, "Invalid property");
}
else
strcpy(console_error, "Invalid Command");

View File

@ -14,7 +14,7 @@ int update_GEL(UPDATE_FUNC_ARGS) {
if (((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || (r&0xFF)==PT_CBNW)
&& parts[i].tmp<100)
{
parts[i].tmp = (100+parts[i].tmp)/2;
parts[i].tmp++;
kill_part(r>>8);
}

View File

@ -15,21 +15,21 @@ int update_SING(UPDATE_FUNC_ARGS) {
if (y+CELL<YRES)
pv[y/CELL+1][x/CELL+1] += 0.1f*(singularity-pv[y/CELL+1][x/CELL+1]);
}
if (y+CELL>0 && pv[y/CELL-1][x/CELL]<singularity)
if (y-CELL>=0 && pv[y/CELL-1][x/CELL]<singularity)
pv[y/CELL-1][x/CELL] += 0.1f*(singularity-pv[y/CELL-1][x/CELL]);
if (x+CELL>0)
if (x-CELL>=0)
{
pv[y/CELL][x/CELL-1] += 0.1f*(singularity-pv[y/CELL][x/CELL-1]);
if (y+CELL>0)
if (y-CELL>=0)
pv[y/CELL-1][x/CELL-1] += 0.1f*(singularity-pv[y/CELL-1][x/CELL-1]);
}
if (parts[i].life<1) {
//Pop!
for (rx=-2; rx<3; rx++) {
for (rx=-1; rx<2; rx++) {
crx = (x/CELL)+rx;
for (ry=-2; ry<3; ry++) {
for (ry=-1; ry<2; ry++) {
cry = (y/CELL)+ry;
if (cry > 0 && crx > 0 && crx < (XRES/CELL) && cry < (YRES/CELL)) {
if (cry >= 0 && crx >= 0 && crx < (XRES/CELL) && cry < (YRES/CELL)) {
pv[cry][crx] += (float)parts[i].tmp;
}
}

View File

@ -24,6 +24,7 @@
#define TRON_DEATH 16 //Crashed, now dying
int tron_rx[4] = {-1, 0, 1, 0};
int tron_ry[4] = { 0,-1, 0, 1};
unsigned int tron_colours[32];
int new_tronhead(int x, int y, int i, int direction)
{
int np = create_part(-1, x , y ,PT_TRON);
@ -90,14 +91,6 @@ int trymovetron(int x, int y, int dir, int i, int len)
}
int update_TRON(UPDATE_FUNC_ARGS) {
int r, rx, ry, np;
if(!parts[i].ctype)
{
int r, g, b;
int hue = (parts[i].tmp&0xF800)>>7;
HSV_to_RGB(hue,255,255,&r,&g,&b);
parts[i].ctype = r<<16 | g<<8 | b;
//Use photon-like wavelength?
}
if (parts[i].tmp&TRON_WAIT)
{
parts[i].tmp &= ~TRON_WAIT;
@ -162,20 +155,12 @@ int update_TRON(UPDATE_FUNC_ARGS) {
}
int graphics_TRON(GRAPHICS_FUNC_ARGS) {
unsigned int col = tron_colours[(cpart->tmp&0xF800)>>11];
if(cpart->tmp & TRON_HEAD)
*pixel_mode |= PMODE_GLOW;
if(cpart->ctype)
{
*colr = (cpart->ctype & 0xFF0000)>>16;
*colg = (cpart->ctype & 0x00FF00)>>8;
*colb = (cpart->ctype & 0x0000FF);
}
else
{
*colr = 255;
*colg = 255;
*colb = 255;
}
*colr = (col & 0xFF0000)>>16;
*colg = (col & 0x00FF00)>>8;
*colb = (col & 0x0000FF);
if(cpart->tmp & TRON_DEATH)
{
*pixel_mode |= FIRE_ADD | PMODE_FLARE;
@ -192,3 +177,14 @@ int graphics_TRON(GRAPHICS_FUNC_ARGS) {
}
return 0;
}
void TRON_init_graphics()
{
int i;
int r, g, b;
for (i=0; i<32; i++)
{
HSV_to_RGB(i<<4,255,255,&r,&g,&b);
tron_colours[i] = r<<16 | g<<8 | b;
}
}

View File

@ -3181,9 +3181,8 @@ void render_signs(pixel *vid_buf)
if (MSIGN==i)
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
mouse_get_state(&mx, &my);
mouse_coords_window_to_sim(&mx, &my, mx, my);
signs[i].x = mx;
signs[i].y = my;
}

View File

@ -150,15 +150,17 @@ void add_sign_ui(pixel *vid_buf, int mx, int my)
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])
{
if (i == MSIGN)
{
MSIGN = -1;
return;
}
get_sign_pos(i, &x, &y, &w, &h);
if (mx>=x && mx<=x+w && my>=y && my<=y+h)
break;
@ -182,7 +184,7 @@ void add_sign_ui(pixel *vid_buf, int mx, int my)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -203,9 +205,7 @@ void add_sign_ui(pixel *vid_buf, int mx, int my)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255);
clearrect(vid_buf, x0, y0, 192, 80);
@ -488,16 +488,14 @@ void ui_list_process(pixel * vid_buf, int mx, int my, int mb, ui_list *ed)
ystart = 5;
while (!sdl_poll())
{
mb = SDL_GetMouseState(&mx, &my);
mb = mouse_get_state(&mx, &my);
if (!mb)
break;
}
while (!sdl_poll() && !selected)
{
mb = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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)
@ -523,7 +521,7 @@ void ui_list_process(pixel * vid_buf, int mx, int my, int mb, ui_list *ed)
}
while (!sdl_poll())
{
mb = SDL_GetMouseState(&mx, &my);
mb = mouse_get_state(&mx, &my);
if (!mb)
break;
}
@ -921,7 +919,7 @@ void error_ui(pixel *vid_buf, int err, char *txt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -929,9 +927,7 @@ void error_ui(pixel *vid_buf, int err, char *txt)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -957,7 +953,7 @@ void error_ui(pixel *vid_buf, int err, char *txt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -988,7 +984,7 @@ char *input_ui(pixel *vid_buf, char *title, char *prompt, char *text, char *shad
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -996,9 +992,7 @@ char *input_ui(pixel *vid_buf, char *title, char *prompt, char *text, char *shad
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -1026,7 +1020,7 @@ char *input_ui(pixel *vid_buf, char *title, char *prompt, char *text, char *shad
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1079,7 +1073,7 @@ void prop_edit_ui(pixel *vid_buf, int x, int y)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1087,9 +1081,7 @@ void prop_edit_ui(pixel *vid_buf, int x, int y)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -1221,7 +1213,7 @@ void prop_edit_ui(pixel *vid_buf, int x, int y)
exit:
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1233,7 +1225,7 @@ void info_ui(pixel *vid_buf, char *top, char *txt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1241,9 +1233,7 @@ void info_ui(pixel *vid_buf, char *top, char *txt)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -1264,7 +1254,7 @@ void info_ui(pixel *vid_buf, char *top, char *txt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1312,7 +1302,7 @@ void copytext_ui(pixel *vid_buf, char *top, char *txt, char *copytxt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1320,9 +1310,7 @@ void copytext_ui(pixel *vid_buf, char *top, char *txt, char *copytxt)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -1348,7 +1336,7 @@ void copytext_ui(pixel *vid_buf, char *top, char *txt, char *copytxt)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1367,7 +1355,7 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1375,9 +1363,7 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -1410,7 +1396,7 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1426,7 +1412,7 @@ void login_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1456,9 +1442,7 @@ void login_ui(pixel *vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255);
clearrect(vid_buf, x0, y0, 192, 80);
@ -1596,7 +1580,7 @@ int stamp_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1604,9 +1588,7 @@ int stamp_ui(pixel *vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
clearrect(vid_buf, -1, -1, XRES+BARSIZE+1, YRES+MENUSIZE+1);
k = stamp_page*per_page;//0;
@ -1721,7 +1703,7 @@ int stamp_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1752,9 +1734,7 @@ void tag_list_ui(pixel *vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
op = tag = NULL;
@ -1866,7 +1846,7 @@ void tag_list_ui(pixel *vid_buf)
}
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1890,7 +1870,7 @@ int save_name_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -1940,9 +1920,7 @@ int save_name_ui(pixel *vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -2033,16 +2011,14 @@ void menu_ui(pixel *vid_buf, int i, int *sl, int *sr)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -2211,7 +2187,7 @@ void menu_ui(pixel *vid_buf, int i, int *sl, int *sr)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -2223,8 +2199,6 @@ void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int *su, int *dae, int
{
int h,x,y,n=0,height,width,sy,rows=0,xoff=0,fwidth;
SEC = SEC2;
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -2592,8 +2566,6 @@ int quickoptions_tooltip_y = 0;
void quickoptions_menu(pixel *vid_buf, int b, int bq, int x, int y)
{
int i = 0;
x /= sdl_scale;
y /= sdl_scale;
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);
@ -3086,7 +3058,7 @@ int search_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -3114,9 +3086,7 @@ int search_ui(pixel *vid_buf)
bq = b;
mxq = mx;
myq = my;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
if (mx!=mxq || my!=myq || sdl_wheel || b)
mmt = 0;
@ -3798,7 +3768,7 @@ int report_ui(pixel* vid_buf, char *save_id)
fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -3809,9 +3779,7 @@ int report_ui(pixel* vid_buf, char *save_id)
drawrect(vid_buf, 205, 155, (XRES+BARSIZE-400)-10, (YRES+MENUSIZE-300)-28, 255, 255, 255, 170);
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
drawrect(vid_buf, 200, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 255);
@ -3897,7 +3865,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -3991,9 +3959,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
if (active && http_async_req_status(http))
{
@ -4365,7 +4331,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date)
//Prevent those mouse clicks being passed down.
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -5198,9 +5164,7 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) {
}
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
ed.focus = 1;
memcpy(vid_buf,old_buf,(XRES+BARSIZE)*YRES*PIXELSIZE);
@ -5338,6 +5302,7 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) {
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;
@ -5400,9 +5365,7 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
memcpy(vid_buf,old_buf,(XRES+BARSIZE)*(YRES+MENUSIZE)*PIXELSIZE);
render_parts(vid_buf);
@ -5428,13 +5391,7 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
box_G.x = XRES - 254 + 40;
box_B.x = XRES - 254 + 75;
}
if (zoom_en && mx>=zoom_wx && my>=zoom_wy //change mouse position while it is in a zoom window
&& mx<(zoom_wx+ZFACTOR*ZSIZE)
&& my<(zoom_wy+ZFACTOR*ZSIZE))
{
mx = (((mx-zoom_wx)/ZFACTOR)+zoom_x);
my = (((my-zoom_wy)/ZFACTOR)+zoom_y);
}
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);
@ -5637,7 +5594,19 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
{
if (lm == 1)//line tool preview
{
xor_line(lx, ly, mx, my, vid_buf);
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
{
@ -5706,7 +5675,7 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
if (lb && lm) //lm is box/line tool
{
if (lm == 1)//line
line_decorations(lx, ly, mx, my, *bsx, *bsy, currR, currG, currB, lb, tool);
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;
@ -6005,7 +5974,7 @@ int save_filename_ui(pixel *vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6018,9 +5987,7 @@ int save_filename_ui(pixel *vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -6105,7 +6072,7 @@ int save_filename_ui(pixel *vid_buf)
savefin:
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6150,7 +6117,7 @@ void catalogue_ui(pixel * vid_buf)
cssave = csave = saves;
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6158,9 +6125,7 @@ void catalogue_ui(pixel * vid_buf)
fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192);
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -6337,7 +6302,7 @@ void catalogue_ui(pixel * vid_buf)
openfin:
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6496,7 +6461,7 @@ void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6504,9 +6469,7 @@ void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
b = mouse_get_state(&mx, &my);
memcpy(vid_buf, o_vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
render_parts(vid_buf);
@ -6661,7 +6624,7 @@ void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6738,7 +6701,7 @@ void simulation_ui(pixel * vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
b = mouse_get_state(&mx, &my);
if (!b)
break;
}
@ -6746,9 +6709,7 @@ void simulation_ui(pixel * vid_buf)
while (!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
@ -6841,8 +6802,36 @@ void simulation_ui(pixel * vid_buf)
while (!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
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;
}
}

View File

@ -657,6 +657,7 @@ int main(int argc, char *argv[])
colour_mode = COLOUR_DEFAULT;
init_display_modes();
TRON_init_graphics();
sys_pause = 1;
parts = calloc(sizeof(particle), NPART);
@ -806,6 +807,7 @@ int main(int argc, char *argv[])
colour_mode = COLOUR_DEFAULT;
init_display_modes();
TRON_init_graphics();
//fbi_img = render_packed_rgb(fbi, FBI_W, FBI_H, FBI_CMP);
@ -1761,25 +1763,25 @@ int main(int argc, char *argv[])
}
bq = bc; // bq is previous mouse state
bc = b = SDL_GetMouseState(&x, &y); // b is current mouse state
bc = b = mouse_get_state(&x, &y); // b is current mouse state
#ifdef LUACONSOLE
if(bc && bq){
if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bc, LUACON_MPRESS)){
if(!luacon_mouseevent(x, y, bc, LUACON_MPRESS)){
b = 0;
}
}
else if(bc && !bq){
if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bc, LUACON_MDOWN)){
if(!luacon_mouseevent(x, y, bc, LUACON_MDOWN)){
b = 0;
}
}
else if(!bc && bq){
if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bq, LUACON_MUP)){
if(!luacon_mouseevent(x, y, bq, LUACON_MUP)){
b = 0;
}
}
luacon_step(x/sdl_scale, y/sdl_scale,sl,sr);
luacon_step(x, y,sl,sr);
#endif
quickoptions_menu(vid_buf, b, bq, x, y);
@ -1791,27 +1793,21 @@ int main(int argc, char *argv[])
for (i=0; i<SC_TOTAL; i++)//check mouse position to see if it is on a menu section
{
if (!b&&x>=sdl_scale*(XRES-2) && x<sdl_scale*(XRES+BARSIZE-1) &&y>= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y<sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)+15))
if (!b&&x>=(XRES-2) && x<(XRES+BARSIZE-1) &&y>= ((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y<((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)+15))
{
active_menu = i;
}
}
menu_ui_v3(vid_buf, active_menu, &sl, &sr, &su, &dae, b, bq, x, y); //draw the elements in the current menu
if (zoom_en && x>=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy //change mouse position while it is in a zoom window
&& x<sdl_scale*(zoom_wx+ZFACTOR*ZSIZE)
&& y<sdl_scale*(zoom_wy+ZFACTOR*ZSIZE))
{
x = (((x/sdl_scale-zoom_wx)/ZFACTOR)+zoom_x)*sdl_scale;
y = (((y/sdl_scale-zoom_wy)/ZFACTOR)+zoom_y)*sdl_scale;
}
if (y>0 && y<sdl_scale*YRES && x>0 && x<sdl_scale*XRES)
mouse_coords_window_to_sim(&x, &y, x, y);//change mouse position while it is in a zoom window
if (y>=0 && y<YRES && x>=0 && x<XRES)
{
int cr; //cr is particle under mouse, for drawing HUD information
char nametext[50];
if (photons[y/sdl_scale][x/sdl_scale]) {
cr = photons[y/sdl_scale][x/sdl_scale];
if (photons[y][x]) {
cr = photons[y][x];
} else {
cr = pmap[y/sdl_scale][x/sdl_scale];
cr = pmap[y][x];
}
if (cr)
{
@ -1856,28 +1852,28 @@ int main(int argc, char *argv[])
}
if (DEBUG_MODE)
{
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d, Tmp:%d", nametext, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life, parts[cr>>8].tmp);
sprintf(coordtext, "#%d, X:%d Y:%d", cr>>8, x/sdl_scale, y/sdl_scale);
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d, Tmp:%d", nametext, pv[y/CELL][x/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life, parts[cr>>8].tmp);
sprintf(coordtext, "#%d, X:%d Y:%d", cr>>8, x, y);
}
else
{
#ifdef BETA
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d, Tmp:%d", nametext, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life, parts[cr>>8].tmp);
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d, Tmp:%d", nametext, pv[y/CELL][x/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life, parts[cr>>8].tmp);
#else
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", nametext, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f);
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", nametext, pv[y/CELL][x/CELL], parts[cr>>8].temp-273.15f);
#endif
}
if ((cr&0xFF)==PT_PHOT) wavelength_gfx = parts[cr>>8].ctype;
}
else
{
sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]);
sprintf(heattext, "Empty, Pressure: %3.2f", pv[y/CELL][x/CELL]);
if (DEBUG_MODE)
{
if (ngrav_enable)
sprintf(coordtext, "X:%d Y:%d. GX: %.2f GY: %.2f", x/sdl_scale, y/sdl_scale, gravx[(((y/sdl_scale)/CELL)*(XRES/CELL))+((x/sdl_scale)/CELL)], gravy[(((y/sdl_scale)/CELL)*(XRES/CELL))+((x/sdl_scale)/CELL)]);
sprintf(coordtext, "X:%d Y:%d. GX: %.2f GY: %.2f", x, y, gravx[((y/CELL)*(XRES/CELL))+(x/CELL)], gravy[((y/CELL)*(XRES/CELL))+(x/CELL)]);
else
sprintf(coordtext, "X:%d Y:%d", x/sdl_scale, y/sdl_scale);
sprintf(coordtext, "X:%d Y:%d", x, y);
}
}
}
@ -1885,8 +1881,8 @@ int main(int argc, char *argv[])
mx = x;
my = y;
if (b && !bq && x>=(XRES-19-new_message_len)*sdl_scale &&
x<=(XRES-14)*sdl_scale && y>=(YRES-37)*sdl_scale && y<=(YRES-24)*sdl_scale && svf_messages)
if (b && !bq && x>=(XRES-19-new_message_len) &&
x<=(XRES-14) && y>=(YRES-37) && y<=(YRES-24) && svf_messages)
{
open_link("http://" SERVER "/Conversations.html");
}
@ -1908,8 +1904,8 @@ int main(int argc, char *argv[])
update_flag = 0;
}
if (b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale &&
x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version)
if (b && !bq && x>=(XRES-19-old_ver_len) &&
x<=(XRES-14) && y>=(YRES-22) && y<=(YRES-9) && old_version)
{
tmp = malloc(128);
#ifdef BETA
@ -1954,9 +1950,9 @@ int main(int argc, char *argv[])
old_version = 0;
}
}
if (y>=sdl_scale*(YRES+(MENUSIZE-20))) //mouse checks for buttons at the bottom, to draw mouseover texts
if (y>=(YRES+(MENUSIZE-20))) //mouse checks for buttons at the bottom, to draw mouseover texts
{
if (x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0)
if (x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0)
{
db = svf_own ? 275 : 272;
if (da < 51)
@ -1974,25 +1970,25 @@ int main(int argc, char *argv[])
if (da < 51)
da ++;
}
else if (x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open)
else if (x>=219 && x<=((XRES+BARSIZE-(510-349))) && svf_login && svf_open)
{
db = svf_own ? 257 : 256;
if (da < 51)
da ++;
}
else if (x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale))
else if (x>=((XRES+BARSIZE-(510-351))) && x<((XRES+BARSIZE-(510-366))))
{
db = 270;
if (da < 51)
da ++;
}
else if (x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale))
else if (x>=((XRES+BARSIZE-(510-367))) && x<((XRES+BARSIZE-(510-383))))
{
db = 266;
if (da < 51)
da ++;
}
else if (x>=37*sdl_scale && x<=187*sdl_scale)
else if (x>=37 && x<=187)
{
if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))
{
@ -2003,13 +1999,13 @@ int main(int argc, char *argv[])
else if(svf_login)
{
db = 259;
if (svf_open && svf_own && x<=55*sdl_scale)
if (svf_open && svf_own && x<=55)
db = 258;
if (da < 51)
da ++;
}
}
else if (x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale))
else if (x>=((XRES+BARSIZE-(510-385))) && x<=((XRES+BARSIZE-(510-476))))
{
db = svf_login ? 261 : 260;
if (svf_admin)
@ -2023,7 +2019,7 @@ int main(int argc, char *argv[])
if (da < 51)
da ++;
}
else if (x>=sdl_scale && x<=17*sdl_scale)
else if (x>=1 && x<=17)
{
if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))
db = 276;
@ -2032,19 +2028,19 @@ int main(int argc, char *argv[])
if (da < 51)
da ++;
}
else if (x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale))
else if (x>=((XRES+BARSIZE-(510-494))) && x<=((XRES+BARSIZE-(510-509))))
{
db = sys_pause ? 264 : 263;
if (da < 51)
da ++;
}
else if (x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale))
else if (x>=((XRES+BARSIZE-(510-476))) && x<=((XRES+BARSIZE-(510-491))))
{
db = 267;
if (da < 51)
da ++;
}
else if (x>=19*sdl_scale && x<=35*sdl_scale && svf_open)
else if (x>=19 && x<=35 && svf_open)
{
db = 265;
if (da < 51)
@ -2067,8 +2063,8 @@ int main(int argc, char *argv[])
if (load_mode)
{
load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL);
load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL);
load_x = CELL*((mx-load_w/2+CELL/2)/CELL);
load_y = CELL*((my-load_h/2+CELL/2)/CELL);
if (load_x+load_w>XRES) load_x=XRES-load_w;
if (load_y+load_h>YRES) load_y=YRES-load_h;
if (load_x<0) load_x=0;
@ -2089,8 +2085,8 @@ int main(int argc, char *argv[])
}
else if (save_mode==1)//getting the area you are selecting
{
save_x = mx/sdl_scale;
save_y = my/sdl_scale;
save_x = mx;
save_y = my;
if (save_x >= XRES) save_x = XRES-1;
if (save_y >= YRES) save_y = YRES-1;
save_w = 1;
@ -2107,8 +2103,8 @@ int main(int argc, char *argv[])
}
else if (save_mode==2)
{
save_w = mx/sdl_scale + 1 - save_x;
save_h = my/sdl_scale + 1 - save_y;
save_w = mx + 1 - save_x;
save_h = my + 1 - save_y;
if (save_w+save_x>XRES) save_w = XRES-save_x;
if (save_h+save_y>YRES) save_h = YRES-save_y;
if (save_w<1) save_w = 1;
@ -2139,8 +2135,6 @@ int main(int argc, char *argv[])
}
else if (sdl_zoom_trig && zoom_en<2)
{
x /= sdl_scale;
y /= sdl_scale;
x -= ZSIZE/2;
y -= ZSIZE/2;
if (x<0) x=0;
@ -2162,8 +2156,6 @@ int main(int argc, char *argv[])
{
if (it > 50)
it = 50;
x /= sdl_scale;
y /= sdl_scale;
if (y>=YRES+(MENUSIZE-20))//check if mouse is on menu buttons
{
if (!lb)//mouse is NOT held down, so it is a first click
@ -2245,7 +2237,7 @@ int main(int argc, char *argv[])
else
execute_save(vid_buf);
while (!sdl_poll())
if (!SDL_GetMouseState(&x, &y))
if (!mouse_get_state(&x, &y))
break;
b = bq = 0;
}
@ -2303,7 +2295,7 @@ int main(int argc, char *argv[])
}
}
if (c==WL_SIGN+100)
if (c==WL_SIGN+100 || MSIGN!=-1) // if sign tool is selected or a sign is being moved
{
if (!bq)
add_sign_ui(vid_buf, x, y);
@ -2475,8 +2467,6 @@ int main(int argc, char *argv[])
{
if (lb && lm) //lm is box/line tool
{
x /= sdl_scale;
y /= sdl_scale;
c = (lb&1) ? sl : sr;
su = c;
if (lm == 1)//line
@ -2506,9 +2496,9 @@ int main(int argc, char *argv[])
if (zoom_en!=1 && !load_mode && !save_mode)//draw normal cursor
{
render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bsx, bsy);
mousex = mx/sdl_scale;
mousey = my/sdl_scale;
render_cursor(vid_buf, mx, my, su, bsx, bsy);
mousex = mx;
mousey = my;
}
#ifdef OGLR
draw_parts_fbo();

View File

@ -2794,6 +2794,7 @@ void clear_area(int area_x, int area_y, int area_w, int area_h)
{
int cx = 0;
int cy = 0;
int i;
for (cy=0; cy<area_h; cy++)
{
for (cx=0; cx<area_w; cx++)
@ -2802,6 +2803,13 @@ void clear_area(int area_x, int area_y, int area_w, int area_h)
delete_part(cx+area_x, cy+area_y, 0);
}
}
for (i=0; i<MAXSIGNS; i++)
{
if (signs[i].x>=area_x && signs[i].x<area_x+area_w && signs[i].y>=area_y && signs[i].y<area_y+area_h)
{
signs[i].text[0] = 0;
}
}
}
void create_box(int x1, int y1, int x2, int y2, int c, int flags)

View File

@ -440,9 +440,11 @@ fin:
void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h, unsigned char bmap[YRES/CELL][XRES/CELL], float vx[YRES/CELL][XRES/CELL], float vy[YRES/CELL][XRES/CELL], float pv[YRES/CELL][XRES/CELL], float fvx[YRES/CELL][XRES/CELL], float fvy[YRES/CELL][XRES/CELL], sign signs[MAXSIGNS], void* o_partsptr)
{
particle *partsptr = o_partsptr;
unsigned char *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL, *finalData = NULL, *outputData = NULL;
unsigned char *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL, *finalData = NULL, *outputData = NULL, *soapLinkData = NULL;
unsigned *partsPosLink = NULL, *partsPosFirstMap = NULL, *partsPosCount = NULL, *partsPosLastMap = NULL;
int partsDataLen, partsPosDataLen, fanDataLen, wallDataLen, finalDataLen, outputDataLen;
unsigned partsCount = 0, *partsSaveIndex = NULL;
unsigned *elementCount = calloc(PT_NUM, sizeof(unsigned));
int partsDataLen, partsPosDataLen, fanDataLen, wallDataLen, finalDataLen, outputDataLen, soapLinkDataLen;
int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
int x, y, i, wallDataFound = 0;
int posCount, signsCount;
@ -557,6 +559,8 @@ void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
*/
partsData = malloc(NPART * (sizeof(particle)+1));
partsDataLen = 0;
partsSaveIndex = calloc(NPART, sizeof(unsigned));
partsCount = 0;
for (y=0;y<fullH;y++)
{
for (x=0;x<fullW;x++)
@ -573,8 +577,12 @@ void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
//Turn pmap entry into a partsptr index
i = i>>8;
//Store saved particle index+1 for this partsptr index (0 means not saved)
partsSaveIndex[i] = (partsCount++) + 1;
//Type (required)
partsData[partsDataLen++] = partsptr[i].type;
elementCount[partsptr[i].type]++;
//Location of the field descriptor
fieldDescLoc = partsDataLen++;
@ -679,6 +687,47 @@ void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
}
}
}
soapLinkData = malloc(3*elementCount[PT_SOAP]);
soapLinkDataLen = 0;
//Iterate through particles in the same order that they were saved
for (y=0;y<fullH;y++)
{
for (x=0;x<fullW;x++)
{
//Find the first particle in this position
i = partsPosFirstMap[y*fullW + x];
//Loop while there is a pmap entry
while (i)
{
//Turn pmap entry into a partsptr index
i = i>>8;
if (partsptr[i].type==PT_SOAP)
{
//Only save forward link for each particle, back links can be deduced from other forward links
//linkedIndex is index within saved particles + 1, 0 means not saved or no link
unsigned linkedIndex = 0;
if ((partsptr[i].ctype&2) && partsptr[i].tmp>=0 && partsptr[i].tmp<NPART)
{
linkedIndex = partsSaveIndex[partsptr[i].tmp];
}
soapLinkData[soapLinkDataLen++] = (linkedIndex&0xFF0000)>>16;
soapLinkData[soapLinkDataLen++] = (linkedIndex&0x00FF00)>>8;
soapLinkData[soapLinkDataLen++] = (linkedIndex&0x0000FF);
}
//Get the pmap entry for the next particle in the same position
i = partsPosLink[i];
}
}
}
if(!soapLinkDataLen)
{
free(soapLinkData);
soapLinkData = NULL;
}
if(!partsDataLen)
{
free(partsData);
@ -704,10 +753,12 @@ void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
bson_append_binary(&b, "wallMap", BSON_BIN_USER, wallData, wallDataLen);
if(fanData)
bson_append_binary(&b, "fanMap", BSON_BIN_USER, fanData, fanDataLen);
if(soapLinkData)
bson_append_binary(&b, "soapLinks", BSON_BIN_USER, soapLinkData, soapLinkDataLen);
signsCount = 0;
for(i = 0; i < MAXSIGNS; i++)
{
if(signs[i].text[0] && signs[i].x>=fullX && signs[i].x<=fullX+fullW && signs[i].y>=fullY && signs[i].y<=fullY+fullH)
if(signs[i].text[0] && signs[i].x>=orig_x0 && signs[i].x<=orig_x0+orig_w && signs[i].y>=orig_y0 && signs[i].y<=orig_y0+orig_h)
{
signsCount++;
}
@ -717,7 +768,7 @@ void *build_save_OPS(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
bson_append_start_array(&b, "signs");
for(i = 0; i < MAXSIGNS; i++)
{
if(signs[i].text[0] && signs[i].x>=fullX && signs[i].x<=fullX+fullW && signs[i].y>=fullY && signs[i].y<=fullY+fullH)
if(signs[i].text[0] && signs[i].x>=orig_x0 && signs[i].x<=orig_x0+orig_w && signs[i].y>=orig_y0 && signs[i].y<=orig_y0+orig_h)
{
bson_append_start_object(&b, "sign");
bson_append_string(&b, "text", signs[i].text);
@ -770,6 +821,12 @@ fin:
free(wallData);
if(fanData)
free(fanData);
if (elementCount)
free(elementCount);
if (partsSaveIndex)
free(partsSaveIndex);
if (soapLinkData)
free(soapLinkData);
return outputData;
}
@ -777,8 +834,9 @@ fin:
int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned char bmap[YRES/CELL][XRES/CELL], float vx[YRES/CELL][XRES/CELL], float vy[YRES/CELL][XRES/CELL], float pv[YRES/CELL][XRES/CELL], float fvx[YRES/CELL][XRES/CELL], float fvy[YRES/CELL][XRES/CELL], sign signs[MAXSIGNS], void* o_partsptr, unsigned pmap[YRES][XRES])
{
particle *partsptr = o_partsptr;
unsigned char * inputData = save, *bsonData = NULL, *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL;
int inputDataLen = size, bsonDataLen = 0, partsDataLen, partsPosDataLen, fanDataLen, wallDataLen;
unsigned char * inputData = save, *bsonData = NULL, *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL, *soapLinkData = NULL;
int inputDataLen = size, bsonDataLen = 0, partsDataLen, partsPosDataLen, fanDataLen, wallDataLen, soapLinkDataLen;
unsigned partsCount = 0, *partsSimIndex = NULL;
int i, freeIndicesCount, x, y, returnCode = 0, j;
int *freeIndices = NULL;
int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
@ -874,7 +932,7 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
{
if(strcmp(bson_iterator_key(&signiter), "text")==0 && bson_iterator_type(&signiter)==BSON_STRING)
{
strcpy(signs[i].text, bson_iterator_string(&signiter));
strncpy(signs[i].text, bson_iterator_string(&signiter), 255);
clean_text(signs[i].text, 158-14);
}
else if(strcmp(bson_iterator_key(&signiter), "justification")==0 && bson_iterator_type(&signiter)==BSON_INT)
@ -951,6 +1009,17 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
fprintf(stderr, "Invalid datatype of fan data: %d[%d] %d[%d] %d[%d]\n", bson_iterator_type(&iter), bson_iterator_type(&iter)==BSON_BINDATA, (unsigned char)bson_iterator_bin_type(&iter), ((unsigned char)bson_iterator_bin_type(&iter))==BSON_BIN_USER, bson_iterator_bin_len(&iter), bson_iterator_bin_len(&iter)>0);
}
}
else if(strcmp(bson_iterator_key(&iter), "soapLinks")==0)
{
if(bson_iterator_type(&iter)==BSON_BINDATA && ((unsigned char)bson_iterator_bin_type(&iter))==BSON_BIN_USER && (soapLinkDataLen = bson_iterator_bin_len(&iter)) > 0)
{
soapLinkData = bson_iterator_bin_data(&iter);
}
else
{
fprintf(stderr, "Invalid datatype of soap data: %d[%d] %d[%d] %d[%d]\n", bson_iterator_type(&iter), bson_iterator_type(&iter)==BSON_BINDATA, (unsigned char)bson_iterator_bin_type(&iter), ((unsigned char)bson_iterator_bin_type(&iter))==BSON_BIN_USER, bson_iterator_bin_len(&iter), bson_iterator_bin_len(&iter)>0);
}
}
else if(strcmp(bson_iterator_key(&iter), "legacyEnable")==0 && replace)
{
if(bson_iterator_type(&iter)==BSON_BOOL)
@ -1102,6 +1171,8 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
parts_lastActiveIndex = NPART-1;
freeIndicesCount = 0;
freeIndices = calloc(sizeof(int), NPART);
partsSimIndex = calloc(NPART, sizeof(unsigned));
partsCount = 0;
for (i = 0; i<NPART; i++)
{
//Ensure ALL parts (even photons) are in the pmap so we can overwrite, keep a track of indices we can use
@ -1141,7 +1212,7 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
}
if(partsData[i] >= PT_NUM)
partsData[i] = PT_DMND; //Replace all invalid elements with diamond
if(pmap[y][x])
if(pmap[y][x] && posCount==0) // Check posCount to make sure an existing particle is not replaced twice if two particles are saved in that position
{
//Replace existing particle or allocated block
newIndex = pmap[y][x]>>8;
@ -1159,6 +1230,9 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
if(newIndex < 0 || newIndex >= NPART)
goto fail;
//Store partsptr index+1 for this saved particle index (0 means not loaded)
partsSimIndex[partsCount++] = newIndex+1;
//Clear the particle, ready for our new properties
memset(&(partsptr[newIndex]), 0, sizeof(particle));
@ -1284,11 +1358,43 @@ int parse_save_OPS(void *save, int size, int replace, int x0, int y0, unsigned c
STKM_init_legs(&(fighters[fcount]), newIndex);
}
}
else if (partsptr[newIndex].type == PT_SOAP)
{
//Clear soap links, links will be added back in if soapLinkData is present
partsptr[newIndex].ctype &= ~6;
}
if (!ptypes[partsptr[newIndex].type].enabled)
partsptr[newIndex].type = PT_NONE;
}
}
}
if (soapLinkData)
{
int soapLinkDataPos = 0;
for (i=0; i<partsCount; i++)
{
if (partsSimIndex[i] && partsptr[partsSimIndex[i]-1].type == PT_SOAP)
{
// Get the index of the particle forward linked from this one, if present in the save data
int linkedIndex = 0;
if (soapLinkDataPos+3 > soapLinkDataLen) break;
linkedIndex |= soapLinkData[soapLinkDataPos++]<<16;
linkedIndex |= soapLinkData[soapLinkDataPos++]<<8;
linkedIndex |= soapLinkData[soapLinkDataPos++];
// All indexes in soapLinkData and partsSimIndex have 1 added to them (0 means not saved/loaded)
if (!linkedIndex || linkedIndex-1>=partsCount || !partsSimIndex[linkedIndex-1])
continue;
linkedIndex = partsSimIndex[linkedIndex-1]-1;
newIndex = partsSimIndex[i]-1;
//Attach the two particles
partsptr[newIndex].ctype |= 2;
partsptr[newIndex].tmp = linkedIndex;
partsptr[linkedIndex].ctype |= 4;
partsptr[linkedIndex].tmp2 = newIndex;
}
}
}
}
goto fin;
fail:
@ -1298,6 +1404,8 @@ fin:
bson_destroy(&b);
if(freeIndices)
free(freeIndices);
if(partsSimIndex)
free(partsSimIndex);
return returnCode;
}
@ -1580,7 +1688,7 @@ void *build_save_PSv(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
for (j=0; j<w*h; j++)
{
i = m[j];
if (i && (parts[i-1].type==PT_PBCN)) {
if (i && (parts[i-1].type==PT_PBCN || parts[i-1].type==PT_TRON)) {
//Save tmp2
d[p++] = parts[i-1].tmp2;
}
@ -1638,14 +1746,14 @@ void *build_save_PSv(int *size, int orig_x0, int orig_y0, int orig_w, int orig_h
j = 0;
for (i=0; i<MAXSIGNS; i++)
if (signs[i].text[0] &&
signs[i].x>=x0 && signs[i].x<x0+w &&
signs[i].y>=y0 && signs[i].y<y0+h)
signs[i].x>=orig_x0 && signs[i].x<orig_x0+orig_w &&
signs[i].y>=orig_y0 && signs[i].y<orig_y0+orig_h)
j++;
d[p++] = j;
for (i=0; i<MAXSIGNS; i++)
if (signs[i].text[0] &&
signs[i].x>=x0 && signs[i].x<x0+w &&
signs[i].y>=y0 && signs[i].y<y0+h)
signs[i].x>=orig_x0 && signs[i].x<orig_x0+orig_w &&
signs[i].y>=orig_y0 && signs[i].y<orig_y0+orig_h)
{
d[p++] = (signs[i].x-x0);
d[p++] = (signs[i].x-x0)>>8;
@ -1963,7 +2071,7 @@ int parse_save_PSv(void *save, int size, int replace, int x0, int y0, unsigned c
{
i = m[j];
ty = d[pty+j];
if (i && ty==PT_PBCN)
if (i && (ty==PT_PBCN || (ty==PT_TRON && ver>=77)))
{
if (p >= size)
goto corrupt;