Even more work, something broke though

This commit is contained in:
Simon 2010-08-28 11:40:49 +01:00
parent 07ade7ed72
commit a23f377731
8 changed files with 1284 additions and 1246 deletions

View File

@ -1,6 +1,12 @@
#ifndef DEFINE_H #ifndef DEFINE_H
#define DEFINE_H #define DEFINE_H
#ifdef WIN32
#define PATH_SEP "\\"
#else
#define PATH_SEP "/"
#endif
#define SERVER "powdertoy.co.uk" #define SERVER "powdertoy.co.uk"
#undef PLOSS #undef PLOSS
@ -28,6 +34,22 @@ static unsigned char ZSIZE = ZSIZE_D;
#define VLOSS 0.999f #define VLOSS 0.999f
#define PLOSS 0.9999f #define PLOSS 0.9999f
#define GRID_X 5
#define GRID_Y 4
#define GRID_P 3
#define GRID_S 6
#define GRID_Z 3
#define STAMP_X 4
#define STAMP_Y 4
#define STAMP_MAX 120
#ifdef PIX16
typedef unsigned short pixel;
#else
typedef unsigned int pixel;
#endif
typedef unsigned char uint8; typedef unsigned char uint8;
extern int legacy_enable; extern int legacy_enable;
@ -45,6 +67,18 @@ struct sign
}; };
typedef struct sign sign; typedef struct sign sign;
struct stamp
{
char name[11];
pixel *thumb;
int thumb_w, thumb_h, dodelete;
};
typedef struct stamp stamp;
extern sign signs[MAXSIGNS]; extern sign signs[MAXSIGNS];
extern stamp stamps[STAMP_MAX];
extern int stamp_count;
extern int itc;
extern char itc_msg[64];
#endif #endif

View File

@ -1,5 +1,6 @@
#include <math.h> #include <math.h>
#include <SDL/SDL.h> #include <SDL/SDL.h>
#include <bzlib.h>
#include "defines.h" #include "defines.h"
#include "air.h" #include "air.h"
#include "powder.h" #include "powder.h"
@ -16,6 +17,9 @@ unsigned char fire_r[YRES/CELL][XRES/CELL];
unsigned char fire_g[YRES/CELL][XRES/CELL]; unsigned char fire_g[YRES/CELL][XRES/CELL];
unsigned char fire_b[YRES/CELL][XRES/CELL]; unsigned char fire_b[YRES/CELL][XRES/CELL];
unsigned int fire_alpha[CELL*3][CELL*3];
pixel *fire_bg;
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f)
{ {
int i,j,x,y,w,h,r,g,b,c; int i,j,x,y,w,h,r,g,b,c;
@ -1769,4 +1773,124 @@ void draw_parts(pixel *vid)
blendpixel(vid, nx-1, ny+1, R, G, B, 112); blendpixel(vid, nx-1, ny+1, R, G, B, 112);
} }
} }
} }
void render_signs(pixel *vid_buf)
{
int i, j, x, y, w, h, dx, dy;
char buff[30]; //Buffer
for(i=0; i<MAXSIGNS; i++)
if(signs[i].text[0])
{
get_sign_pos(i, &x, &y, &w, &h);
clearrect(vid_buf, x, y, w, h);
drawrect(vid_buf, x, y, w, h, 192, 192, 192, 255);
//Displaying special information
if(strcmp(signs[i].text, "{p}")==0)
{
sprintf(buff, "Pressure: %3.2f", pv[signs[i].y/CELL][signs[i].x/CELL]); //...pressure
drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255);
}
if(strcmp(signs[i].text, "{t}")==0)
{
if((pmap[signs[i].y][signs[i].x]>>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)<NPART)
sprintf(buff, "Temp: %4.2f", parts[pmap[signs[i].y][signs[i].x]>>8].temp); //...tempirature
else
sprintf(buff, "Temp: 0.00"); //...tempirature
drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255);
}
//Usual text
if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}"))
drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255);
x = signs[i].x;
y = signs[i].y;
dx = 1 - signs[i].ju;
dy = (signs[i].y > 18) ? -1 : 1;
for(j=0; j<4; j++)
{
drawpixel(vid_buf, x, y, 192, 192, 192, 255);
x+=dx;
y+=dy;
}
}
}
void render_fire(pixel *dst)
{
int i,j,x,y,r,g,b;
for(j=0; j<YRES/CELL; j++)
for(i=0; i<XRES/CELL; i++)
{
r = fire_r[j][i];
g = fire_g[j][i];
b = fire_b[j][i];
if(r || g || b)
for(y=-CELL+1; y<2*CELL; y++)
for(x=-CELL+1; x<2*CELL; x++)
addpixel(dst, i*CELL+x, j*CELL+y, r, g, b, fire_alpha[y+CELL][x+CELL]);
for(y=-1; y<2; y++)
for(x=-1; x<2; x++)
if(i+x>=0 && j+y>=0 && i+x<XRES/CELL && j+y<YRES/CELL && (x || y))
{
r += fire_r[j+y][i+x] / 8;
g += fire_g[j+y][i+x] / 8;
b += fire_b[j+y][i+x] / 8;
}
r /= 2;
g /= 2;
b /= 2;
fire_r[j][i] = r>4 ? r-4 : 0;
fire_g[j][i] = g>4 ? g-4 : 0;
fire_b[j][i] = b>4 ? b-4 : 0;
}
}
void prepare_alpha(void)
{
int x,y,i,j;
float temp[CELL*3][CELL*3];
memset(temp, 0, sizeof(temp));
for(x=0; x<CELL; x++)
for(y=0; y<CELL; y++)
for(i=-CELL; i<CELL; i++)
for(j=-CELL; j<CELL; j++)
temp[y+CELL+j][x+CELL+i] += expf(-0.1f*(i*i+j*j));
for(x=0; x<CELL*3; x++)
for(y=0; y<CELL*3; y++)
fire_alpha[y][x] = (int)(255.0f*temp[y][x]/(CELL*CELL));
}
pixel *render_packed_rgb(void *image, int width, int height, int cmp_size)
{
unsigned char *tmp;
pixel *res;
int i;
tmp = malloc(width*height*3);
if(!tmp)
return NULL;
res = malloc(width*height*PIXELSIZE);
if(!res)
{
free(tmp);
return NULL;
}
i = width*height*3;
if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0))
{
free(res);
free(tmp);
return NULL;
}
for(i=0; i<width*height; i++)
res[i] = PIXRGB(tmp[3*i], tmp[3*i+1], tmp[3*i+2]);
free(tmp);
return res;
}

View File

@ -6,7 +6,6 @@
#ifdef PIX16 #ifdef PIX16
#define PIXELSIZE 2 #define PIXELSIZE 2
typedef unsigned short pixel;
#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) #define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F))
#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) #define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F))
#define PIXR(x) (((x)>>8)&0xF8) #define PIXR(x) (((x)>>8)&0xF8)
@ -14,7 +13,6 @@ typedef unsigned short pixel;
#define PIXB(x) (((x)<<3)&0xF8) #define PIXB(x) (((x)<<3)&0xF8)
#else #else
#define PIXELSIZE 4 #define PIXELSIZE 4
typedef unsigned int pixel;
#ifdef PIX32BGR #ifdef PIX32BGR
#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) #define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000))
#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) #define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r))
@ -46,6 +44,9 @@ extern unsigned char fire_r[YRES/CELL][XRES/CELL];
extern unsigned char fire_g[YRES/CELL][XRES/CELL]; extern unsigned char fire_g[YRES/CELL][XRES/CELL];
extern unsigned char fire_b[YRES/CELL][XRES/CELL]; extern unsigned char fire_b[YRES/CELL][XRES/CELL];
extern unsigned int fire_alpha[CELL*3][CELL*3];
extern pixel *fire_bg;
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f);
void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch);
@ -114,4 +115,10 @@ void xor_rect(pixel *vid, int x, int y, int w, int h);
void draw_parts(pixel *vid); void draw_parts(pixel *vid);
void render_signs(pixel *vid_buf);
void render_fire(pixel *dst);
void prepare_alpha(void);
#endif #endif

View File

@ -1,6 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "font.h"
#include "defines.h" #include "defines.h"
#include "powder.h" #include "powder.h"
#include "interface.h" #include "interface.h"
@ -41,6 +42,24 @@ void menu_count(void)
} }
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");
//Ususal width
if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}"))
*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) void add_sign_ui(pixel *vid_buf, int mx, int my)
{ {
int i, w, h, x, y, nm=0, ju; int i, w, h, x, y, nm=0, ju;
@ -767,6 +786,735 @@ fail:
svf_mod = 0; svf_mod = 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=STAMP_X*STAMP_Y,page_count;
char page_info[64];
page_count = ceil((float)stamp_count/(float)per_page);
while(!sdl_poll())
{
b = SDL_GetMouseState(&mx, &my);
if(!b)
break;
}
while(!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
clearrect(vid_buf, -1, -1, XRES+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] && stamps[k].thumb)
{
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;
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);
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))
{
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);
}
}
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 = SDL_GetMouseState(&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;
strcpy(ed.str, "");
fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192);
while(!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
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);
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 = SDL_GetMouseState(&mx, &my);
if(!b)
break;
}
sdl_key = 0;
finish:
strlist_free(&vote);
}
int save_name_ui(pixel *vid_buf)
{
int x0=(XRES-192)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,nd=0;
void *th;
ui_edit ed;
ui_checkbox cb;
th = build_thumb(&ths, 0);
while(!sdl_poll())
{
b = SDL_GetMouseState(&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);
strcpy(ed.str, svf_name);
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);
while(!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
mx /= sdl_scale;
my /= sdl_scale;
drawrect(vid_buf, x0, y0, 192, 90+YRES/4, 192, 192, 192, 255);
clearrect(vid_buf, x0, y0, 192, 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);
ui_edit_draw(vid_buf, &ed);
drawrect(vid_buf, x0+(192-XRES/4)/2-2, y0+42, XRES/4+3, YRES/4+3, 128, 128, 128, 255);
render_thumb(th, ths, 0, vid_buf, x0+(192-XRES/4)/2, y0+44, 4);
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);
sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
ui_edit_process(mx, my, b, &ed);
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)))
{
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;
if(nd)
{
strcpy(svf_id, "");
strcpy(svf_tags, "");
}
svf_open = 1;
svf_own = 1;
svf_publish = cb.checked;
return nd+1;
}
if(sdl_key==SDLK_RETURN)
{
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;
if(nd)
{
strcpy(svf_id, "");
strcpy(svf_tags, "");
}
svf_open = 1;
svf_own = 1;
svf_publish = cb.checked;
return nd+1;
}
if(sdl_key==SDLK_ESCAPE)
{
if(!ed.focus)
break;
ed.focus = 0;
}
}
free(th);
return 0;
}
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);
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 = SDL_GetMouseState(&mx, &my);
if(!b)
break;
}
while(!sdl_poll())
{
bq = b;
b = SDL_GetMouseState(&mx, &my);
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);
//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 = SDL_GetMouseState(&mx, &my);
if(!b)
break;
}
//drawtext(vid_buf, XRES+2, (12*i)+2, msections[i].icon, 255, 255, 255, 255);
}
void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my)
{
int h,x,y,n=0,height,width,sy,rows=0;
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);
h = -1;
x = XRES-BARSIZE-26;
y = YRES+1;
sy = y;
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<=20)
{
x = XRES-BARSIZE-26;
y += 19;
}
x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].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, 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<=20)
{
x = XRES-BARSIZE-26;
y += 19;
}
x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].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, 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<=20)
{
x = XRES-BARSIZE-26;
y += 19;
}
x -= draw_tool_xy(vid_buf, x, y, n, ptypes[n].pcolors)+5;
if(!bq && 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<=20)
{
x = XRES-BARSIZE-26;
y += 19;
}
x -= draw_tool_xy(vid_buf, x, y, n, ptypes[n].pcolors)+5;
if(!bq && 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-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-10, (char *)mwalls[h-122].descs, 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);
}
if(b==1&&h!=-1)
{
*sl = h;
}
if(b==4&&h!=-1)
{
*sr = h;
}
}
int sdl_poll(void) int sdl_poll(void)
{ {
SDL_Event event; SDL_Event event;
@ -844,4 +1592,44 @@ int sdl_poll(void)
} }
sdl_mod = SDL_GetModState(); sdl_mod = SDL_GetModState();
return 0; return 0;
}
void set_cmode(int cm)
{
cmode = cm;
itc = 51;
if(cmode==4)
{
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==5)
{
strcpy(itc_msg, "Heat Display");
}
else if(cmode==6)
{
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==3)
{
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==2)
{
memset(fire_bg, 0, XRES*YRES*PIXELSIZE);
strcpy(itc_msg, "Persistent Display");
}
else if(cmode==1)
strcpy(itc_msg, "Pressure Display");
else
strcpy(itc_msg, "Velocity Display");
} }

View File

@ -102,6 +102,8 @@ extern int Z_keysym;
void menu_count(void); void menu_count(void);
void get_sign_pos(int i, int *x0, int *y0, int *w, int *h);
void add_sign_ui(pixel *vid_buf, int mx, int my); void add_sign_ui(pixel *vid_buf, int mx, int my);
void ui_edit_draw(pixel *vid_buf, ui_edit *ed); void ui_edit_draw(pixel *vid_buf, ui_edit *ed);
@ -124,5 +126,17 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn);
void login_ui(pixel *vid_buf); void login_ui(pixel *vid_buf);
int stamp_ui(pixel *vid_buf);
void tag_list_ui(pixel *vid_buf);
int save_name_ui(pixel *vid_buf);
void menu_ui(pixel *vid_buf, int i, int *sl, int *sr);
void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my);
int sdl_poll(void); int sdl_poll(void);
void set_cmode(int cm);
#endif #endif

1250
main.c

File diff suppressed because it is too large Load Diff

297
powder.c
View File

@ -2544,4 +2544,301 @@ void update_particles(pixel *vid)
drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128);
} }
}
void clear_area(int area_x, int area_y, int area_w, int area_h)
{
int cx = 0;
int cy = 0;
for(cy=0; cy<area_h; cy++)
{
for(cx=0; cx<area_w; cx++)
{
bmap[(cy+area_y)/CELL][(cx+area_x)/CELL] = 0;
delete_part(cx+area_x, cy+area_y);
}
}
}
void create_box(int x1, int y1, int x2, int y2, int c)
{
int i, j;
if(x1>x2)
{
i = x2;
x2 = x1;
x1 = i;
}
if(y1>y2)
{
j = y2;
y2 = y1;
y1 = j;
}
for(j=y1; j<=y2; j++)
for(i=x1; i<=x2; i++)
create_parts(i, j, 1, c);
}
int flood_parts(int x, int y, int c, int cm, int bm)
{
int x1, x2, dy = (c<PT_NUM)?1:CELL;
int co = c;
if(c>=122&&c<=122+UI_WALLCOUNT)
{
c = c-100;
}
if(cm==-1)
{
if(c==0)
{
cm = pmap[y][x]&0xFF;
if(!cm)
return 0;
}
else
cm = 0;
}
if(bm==-1)
{
if(c==30)
{
bm = bmap[y/CELL][x/CELL];
if(!bm)
return 0;
if(bm==1)
cm = 0xFF;
}
else
bm = 0;
}
if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm)
return 1;
// go left as far as possible
x1 = x2 = x;
while(x1>=CELL)
{
if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm)
break;
x1--;
}
while(x2<XRES-CELL)
{
if((pmap[y][x2+1]&0xFF)!=cm || bmap[y/CELL][(x2+1)/CELL]!=bm)
break;
x2++;
}
// fill span
for(x=x1; x<=x2; x++)
if(!create_parts(x, y, 0, co))
return 0;
// fill children
if(y>=CELL+dy)
for(x=x1; x<=x2; x++)
if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm)
if(!flood_parts(x, y-dy, co, cm, bm))
return 0;
if(y<YRES-CELL-dy)
for(x=x1; x<=x2; x++)
if((pmap[y+dy][x]&0xFF)==cm && bmap[(y+dy)/CELL][x/CELL]==bm)
if(!flood_parts(x, y+dy, co, cm, bm))
return 0;
return 1;
}
int create_parts(int x, int y, int r, int c)
{
int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n;
if(c == 125)
{
i = x / CELL;
j = y / CELL;
for(v=-1; v<2; v++)
for(u=-1; u<2; u++)
if(i+u>=0 && i+u<XRES/CELL &&
j+v>=0 && j+v<YRES/CELL &&
bmap[j+v][i+u] == 5)
return 1;
bmap[j][i] = 5;
return 1;
}
//LOLOLOLOLLOLOLOLO
if(c == 127)
{
b = 4;
dw = 1;
}
if(c == 122)
{
b = 8;
dw = 1;
}
if(c == 123)
{
b = 7;
dw = 1;
}
if(c == 124)
{
b = 6;
dw = 1;
}
if(c == 128)
{
b = 3;
dw = 1;
}
if(c == 129)
{
b = 2;
dw = 1;
}
if(c == 130)
{
b = 0;
dw = 1;
}
if(c == 131)
{
b = 1;
dw = 1;
}
if(c == 132)
{
b = 9;
dw = 1;
}
if(c == 133)
{
b = 10;
dw = 1;
}
if(c == 134)
{
b = 11;
dw = 1;
}
if(c == 135)
{
b = 12;
dw = 1;
}
if(c == 140)
{
b = 13;
dw = 1;
}
if(c == 255)
{
b = 255;
dw = 1;
}
if(dw==1)
{
r = r/CELL;
x = x/CELL;
y = y/CELL;
x -= r/2;
y -= r/2;
for (ox=x; ox<=x+r; ox++)
{
for (oy=y; oy<=y+r; oy++)
{
if(ox>=0&&ox<XRES/CELL&&oy>=0&&oy<YRES/CELL)
{
i = ox;
j = oy;
if(b==4)
{
fvx[j][i] = 0.0f;
fvy[j][i] = 0.0f;
}
bmap[j][i] = b;
}
}
}
return 1;
}
if(c == SPC_AIR || c == SPC_HEAT || c == SPC_COOL || c == SPC_VACUUM)
{
for(j=-r; j<=r; j++)
for(i=-r; i<=r; i++)
if(i*i+j*j<=r*r)
create_part(-1, x+i, y+j, c);
return 1;
}
if(c == 0)
{
for(j=-r; j<=r; j++)
for(i=-r; i<=r; i++)
if(i*i+j*j<=r*r)
delete_part(x+i, y+j);
return 1;
}
for(j=-r; j<=r; j++)
for(i=-r; i<=r; i++)
if(i*i+j*j<=r*r)
if(create_part(-1, x+i, y+j, c)==-1)
f = 1;
return !f;
}
void create_line(int x1, int y1, int x2, int y2, int r, int c)
{
int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
float e, de;
if(cp)
{
y = x1;
x1 = y1;
y1 = y;
y = x2;
x2 = y2;
y2 = y;
}
if(x1 > x2)
{
y = x1;
x1 = x2;
x2 = y;
y = y1;
y1 = y2;
y2 = y;
}
dx = x2 - x1;
dy = abs(y2 - y1);
e = 0.0f;
if(dx)
de = dy/(float)dx;
else
de = 0.0f;
y = y1;
sy = (y1<y2) ? 1 : -1;
for(x=x1; x<=x2; x++)
{
if(cp)
create_parts(y, x, r, c);
else
create_parts(x, y, r, c);
e += de;
if(e >= 0.5f)
{
y += sy;
if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r)
{
if(cp)
create_parts(y, x, r, c);
else
create_parts(x, y, r, c);
}
e -= 1.0f;
}
}
} }

View File

@ -456,4 +456,14 @@ void update_particles_i(pixel *vid, int start, int inc);
void update_particles(pixel *vid); void update_particles(pixel *vid);
void clear_area(int area_x, int area_y, int area_w, int area_h);
void create_box(int x1, int y1, int x2, int y2, int c);
int flood_parts(int x, int y, int c, int cm, int bm);
int create_parts(int x, int y, int r, int c);
void create_line(int x1, int y1, int x2, int y2, int r, int c);
#endif #endif