Merge branch 'dev' of git://github.com/jacksonmj/The-Powder-Toy

This commit is contained in:
Simon 2011-02-09 15:56:30 +00:00
commit 3de4d163a5
9 changed files with 290 additions and 243 deletions

View File

@ -99,7 +99,7 @@ int GRAV_G2;
int GRAV_B2; int GRAV_B2;
extern int legacy_enable; extern int legacy_enable;
extern int sound_enable;
extern int kiosk_enable; extern int kiosk_enable;
extern int sys_pause; extern int sys_pause;

View File

@ -767,10 +767,11 @@ static int lolzrule[9][9] =
{0,1,0,0,0,0,0,1,0}, {0,1,0,0,0,0,0,1,0},
{0,1,0,0,0,0,0,1,0}, {0,1,0,0,0,0,0,1,0},
}; };
int portal[(int)(MAX_TEMP-73.15f)/100+2][8][80]; #define CHANNELS ((int)(MAX_TEMP-73.15f)/100+2)
float portaltemp[(int)(MAX_TEMP-73.15f)/100+2][8][80]; int portal[CHANNELS][8][80];
int portalctype[(int)(MAX_TEMP-73.15f)/100+2][8][80]; float portaltemp[CHANNELS][8][80];
int wireless[(int)(MAX_TEMP-73.15f)/100+2][2]; int portalctype[CHANNELS][8][80];
int wireless[CHANNELS][2];
extern int isplayer; extern int isplayer;
extern float player[27]; extern float player[27];

View File

@ -4,6 +4,8 @@ int update_PRTI(UPDATE_FUNC_ARGS) {
int r, nnx, rx, ry; int r, nnx, rx, ry;
int count =0; int count =0;
parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1);
if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1;
else if (parts[i].tmp<0) parts[i].tmp = 0;
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))

View File

@ -4,6 +4,8 @@ int update_PRTO(UPDATE_FUNC_ARGS) {
int r, nnx, rx, ry, np; int r, nnx, rx, ry, np;
int count = 0; int count = 0;
parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1);
if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1;
else if (parts[i].tmp<0) parts[i].tmp = 0;
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))

View File

@ -3,6 +3,8 @@
int update_WIFI(UPDATE_FUNC_ARGS) { int update_WIFI(UPDATE_FUNC_ARGS) {
int r, rx, ry; int r, rx, ry;
parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1);
if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1;
else if (parts[i].tmp<0) parts[i].tmp = 0;
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))

View File

@ -855,7 +855,20 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
int rh = 12; int rh = 12;
int rw = 0; int rw = 0;
int cw = x; int cw = x;
for (; *s; s++) int wordlen;
int charspace;
while (*s)
{
wordlen = strcspn(s," .,!?\n");
charspace = textwidthx(s, w-(x-cw));
if (charspace<wordlen && wordlen && w-(x-cw)<w/3)
{
x = sx;
rw = 0;
y+=FONT_H+2;
rh+=FONT_H+2;
}
for (; *s && --wordlen>=-1; s++)
{ {
if (*s == '\n') if (*s == '\n')
{ {
@ -891,7 +904,9 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
} }
else else
{ {
if (x-cw>=w) {
if (x-cw>=w)
{
x = sx; x = sx;
rw = 0; rw = 0;
y+=FONT_H+2; y+=FONT_H+2;
@ -900,6 +915,7 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
} }
} }
}
#endif #endif
return rh; return rh;
} }
@ -1009,19 +1025,30 @@ void textnpos(char *s, int n, int w, int *cx, int *cy)
{ {
int x = 0; int x = 0;
int y = 0; int y = 0;
//TODO: Implement Textnheight for wrapped text int wordlen, charspace;
for (; *s; s++) while (*s&&n)
{
wordlen = strcspn(s," .,!?\n");
charspace = textwidthx(s, w-x);
if (charspace<wordlen && wordlen && w-x<w/3)
{
x = 0;
y += FONT_H+2;
}
for (; *s && --wordlen>=-1; s++)
{ {
if (!n) { if (!n) {
break; break;
} }
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
if (x>=w) { if (x>=w)
{
x = 0; x = 0;
y += FONT_H+2; y += FONT_H+2;
} }
n--; n--;
} }
}
*cx = x-1; *cx = x-1;
*cy = y; *cy = y;
} }
@ -1041,12 +1068,21 @@ int textwidthx(char *s, int w)
} }
int textposxy(char *s, int width, int w, int h) int textposxy(char *s, int width, int w, int h)
{ {
int x=0,y=0,n=0,cw; int x=0,y=0,n=0,cw, wordlen, charspace;
for (; *s; s++) while (*s)
{
wordlen = strcspn(s," .,!?\n");
charspace = textwidthx(s, width-x);
if (charspace<wordlen && wordlen && width-x<width/3)
{
x = 0;
y += FONT_H+2;
}
for (; *s && --wordlen>=-1; s++)
{ {
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
if (x+(cw/2) >= w && y+6 >= h) if ((x+(cw/2) >= w && y+6 >= h)||(y+6 >= h+FONT_H+2))
break; return n++;
x += cw; x += cw;
if (x>=width) { if (x>=width) {
x = 0; x = 0;
@ -1054,6 +1090,7 @@ int textposxy(char *s, int width, int w, int h)
} }
n++; n++;
} }
}
return n; return n;
} }
@ -1483,7 +1520,9 @@ void draw_parts(pixel *vid)
t!=PT_HFLM && t!=PT_SPRK && t!=PT_FIRW && t!=PT_HFLM && t!=PT_SPRK && t!=PT_FIRW &&
t!=PT_DUST && t!=PT_FIRW && t!=PT_FWRK && t!=PT_DUST && t!=PT_FIRW && t!=PT_FWRK &&
t!=PT_NEUT && t!=PT_LAVA && t!=PT_BOMB && t!=PT_NEUT && t!=PT_LAVA && t!=PT_BOMB &&
t!=PT_PHOT && t!=PT_THDR && t!=PT_SMKE) t!=PT_PHOT && t!=PT_THDR && t!=PT_SMKE &&
t!=PT_LCRY && t!=PT_SWCH && t!=PT_PCLN &&
t!=PT_PUMP && t!=PT_HSWC && t!=PT_FILT)
{ {
if (ptypes[parts[i].type].properties&TYPE_LIQUID) if (ptypes[parts[i].type].properties&TYPE_LIQUID)
{ {

View File

@ -3957,19 +3957,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show
int console_parse_type(char *txt, int *element, char *err) int console_parse_type(char *txt, int *element, char *err)
{ {
int i = atoi(txt); int i = -1;
char num[4];
if (i>=0 && i<PT_NUM)
{
sprintf(num,"%d",i);
if (strcmp(txt,num)==0)
{
*element = i;
strcpy(err,"");
return 1;
}
}
i = -1;
// alternative names for some elements // alternative names for some elements
if (strcasecmp(txt,"C4")==0) i = PT_PLEX; if (strcasecmp(txt,"C4")==0) i = PT_PLEX;
else if (strcasecmp(txt,"C5")==0) i = PT_C5; else if (strcasecmp(txt,"C5")==0) i = PT_C5;
@ -3995,13 +3983,7 @@ int console_parse_coords(char *txt, int *x, int *y, char *err)
{ {
// TODO: use regex? // TODO: use regex?
int nx = -1, ny = -1; int nx = -1, ny = -1;
sscanf(txt,"%d,%d",&nx,&ny); if (sscanf(txt,"%d,%d",&nx,&ny)!=2 || nx<0 || nx>=XRES || ny<0 || ny>=YRES)
if (nx<0 && nx>=XRES)
{
strcpy(err,"Invalid coordinates");
return 0;
}
if (ny<0 && ny>=YRES)
{ {
strcpy(err,"Invalid coordinates"); strcpy(err,"Invalid coordinates");
return 0; return 0;
@ -4012,9 +3994,10 @@ int console_parse_coords(char *txt, int *x, int *y, char *err)
} }
int console_parse_partref(char *txt, int *which, char *err) int console_parse_partref(char *txt, int *which, char *err)
{ {
strcpy(err,"");
// TODO: use regex? // TODO: use regex?
int i = -1, nx, ny; int i = -1, nx, ny;
if (console_parse_coords(txt, &nx, &ny, err)) if (strchr(txt,',') && console_parse_coords(txt, &nx, &ny, err))
{ {
i = pmap[ny][nx]; i = pmap[ny][nx];
if (!i || (i>>8)>=NPART) if (!i || (i>>8)>=NPART)
@ -4025,7 +4008,6 @@ int console_parse_partref(char *txt, int *which, char *err)
else if (txt) else if (txt)
{ {
char *num = (char*)malloc(strlen(txt)+3); char *num = (char*)malloc(strlen(txt)+3);
strcpy(err,""); // suppress error message from failed coordinate parsing
i = atoi(txt); i = atoi(txt);
sprintf(num,"%d",i); sprintf(num,"%d",i);
if (!txt || strcmp(txt,num)!=0) if (!txt || strcmp(txt,num)!=0)
@ -4038,6 +4020,6 @@ int console_parse_partref(char *txt, int *which, char *err)
strcpy(err,""); strcpy(err,"");
return 1; return 1;
} }
strcpy(err,"Particle does not exist"); if (strcmp(err,"")==0) strcpy(err,"Particle does not exist");
return 0; return 0;
} }

View File

@ -82,6 +82,8 @@ void play_sound(char *file)
Uint32 dlen; Uint32 dlen;
SDL_AudioCVT cvt; SDL_AudioCVT cvt;
if (!sound_enable) return;
/* Look for an empty (or finished) sound slot */ /* Look for an empty (or finished) sound slot */
for ( index=0; index<NUM_SOUNDS; ++index ) { for ( index=0; index<NUM_SOUNDS; ++index ) {
if ( sounds[index].dpos == sounds[index].dlen ) { if ( sounds[index].dpos == sounds[index].dlen ) {
@ -167,6 +169,7 @@ int FPSB = 0;
int MSIGN =-1; int MSIGN =-1;
//int CGOL = 0; //int CGOL = 0;
//int GSPEED = 1;//causes my .exe to crash.. //int GSPEED = 1;//causes my .exe to crash..
int sound_enable;
sign signs[MAXSIGNS]; sign signs[MAXSIGNS];
@ -1209,9 +1212,12 @@ int main(int argc, char *argv[])
if ( SDL_OpenAudio(&fmt, NULL) < 0 ) if ( SDL_OpenAudio(&fmt, NULL) < 0 )
{ {
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
exit(1);
} }
else
{
sound_enable = 1;
SDL_PauseAudio(0); SDL_PauseAudio(0);
}
#ifdef MT #ifdef MT
numCores = core_count(); numCores = core_count();
#endif #endif
@ -1930,7 +1936,7 @@ int main(int argc, char *argv[])
int tctype = parts[cr>>8].ctype; int tctype = parts[cr>>8].ctype;
if (tctype>=PT_NUM) if (tctype>=PT_NUM)
tctype = 0; tctype = 0;
sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, ptypes[tctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d, #%d", ptypes[cr&0xFF].name, ptypes[tctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life, cr>>8);
//sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, ptypes[parts[cr>>8].ctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); //sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, ptypes[parts[cr>>8].ctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life);
} else } else
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life);
@ -1941,7 +1947,6 @@ int main(int argc, char *argv[])
if (tctype>=PT_NUM) if (tctype>=PT_NUM)
tctype = 0; tctype = 0;
sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d, #%d", ptypes[cr&0xFF].name, ptypes[tctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life ,cr>>8); sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d, #%d", ptypes[cr&0xFF].name, ptypes[tctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life ,cr>>8);
sprintf(coordtext, "X:%d Y:%d", x/sdl_scale, y/sdl_scale);
//sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, ptypes[parts[cr>>8].ctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); //sprintf(heattext, "%s (%s), Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, ptypes[parts[cr>>8].ctype].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life);
} else { } else {
sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, 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", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f);
@ -1950,10 +1955,10 @@ int main(int argc, char *argv[])
} }
else else
{ {
if (DEBUG_MODE)
sprintf(coordtext, "X:%d Y:%d", x/sdl_scale, y/sdl_scale);
sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]);
} }
if (DEBUG_MODE)
sprintf(coordtext, "X:%d Y:%d", x/sdl_scale, y/sdl_scale);
} }
mx = x; mx = x;
my = y; my = y;
@ -2826,7 +2831,8 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
} }
else if(strcmp(console2, "sound")==0 && console3) else if(strcmp(console2, "sound")==0 && console3)
{ {
play_sound(console3); if (sound_enable) play_sound(console3);
else strcpy(console_error, "Audio device not available - cannot play sounds");
} }
else if(strcmp(console2, "load")==0 && console3) else if(strcmp(console2, "load")==0 && console3)
{ {

View File

@ -255,11 +255,9 @@ int try_move(int i, int x, int y, int nx, int ny)
parts[e].x += x-nx; parts[e].x += x-nx;
parts[e].y += y-ny; parts[e].y += y-ny;
pmap[(int)(parts[e].y+0.5f)][(int)(parts[e].x+0.5f)] = (e<<8)|parts[e].type;
} }
pmap[ny][nx] = (i<<8)|parts[i].type;
pmap[y][x] = r;
return 1; return 1;
} }
@ -417,7 +415,6 @@ void kill_part(int i)
{ {
int x, y; int x, y;
if (parts[i].type != PT_PHOT) {
x = (int)(parts[i].x+0.5f); x = (int)(parts[i].x+0.5f);
y = (int)(parts[i].y+0.5f); y = (int)(parts[i].y+0.5f);
if (parts[i].type == PT_STKM) if (parts[i].type == PT_STKM)
@ -444,7 +441,6 @@ void kill_part(int i)
else if ((photons[y][x]>>8)==i) else if ((photons[y][x]>>8)==i)
photons[y][x] = 0; photons[y][x] = 0;
} }
}
parts[i].type = PT_NONE; parts[i].type = PT_NONE;
parts[i].life = pfree; parts[i].life = pfree;
@ -460,11 +456,19 @@ inline void part_change_type(int i, int x, int y, int t)
if (x<0 || y<0 || x>=XRES || y>=YRES || i>=NPART) if (x<0 || y<0 || x>=XRES || y>=YRES || i>=NPART)
return -1; return -1;
parts[i].type = t; parts[i].type = t;
if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT)// && t!=PT_NEUT) if (t==PT_PHOT)// || t==PT_NEUT)
pmap[y][x] = t|(i<<8); {
else if ((pmap[y][x]>>8)==i) photons[y][x] = t|(i<<8);
if ((pmap[y][x]>>8)==i)
pmap[y][x] = 0; pmap[y][x] = 0;
} }
else
{
pmap[y][x] = t|(i<<8);
if ((photons[y][x]>>8)==i)
photons[y][x] = 0;
}
}
#if defined(WIN32) && !defined(__GNUC__) #if defined(WIN32) && !defined(__GNUC__)
_inline int create_n_parts(int n, int x, int y, float vx, float vy, int t) _inline int create_n_parts(int n, int x, int y, float vx, float vy, int t)
@ -502,6 +506,8 @@ inline int create_n_parts(int n, int x, int y, float vx, float vy, int t)
parts[i].tmp = 0; parts[i].tmp = 0;
if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT && !pmap[y][x])// && t!=PT_NEUT) if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT && !pmap[y][x])// && t!=PT_NEUT)
pmap[y][x] = t|(i<<8); pmap[y][x] = t|(i<<8);
else if (t==PT_PHOT && !photons[y][x])
photons[y][x] = t|(i<<8);
pv[y/CELL][x/CELL] += 6.0f * CFDS; pv[y/CELL][x/CELL] += 6.0f * CFDS;
} }
@ -1343,15 +1349,13 @@ void update_particles_i(pixel *vid, int start, int inc)
if(parts[r>>8].tmp==grule[golnum][9]-1) if(parts[r>>8].tmp==grule[golnum][9]-1)
parts[r>>8].tmp --; parts[r>>8].tmp --;
} }
if(parts[r>>8].tmp<=0) if (r && parts[r>>8].tmp<=0)
parts[r>>8].type = PT_NONE;//using kill_part makes it not work parts[r>>8].type = PT_NONE;//using kill_part makes it not work
} }
gol2[nx][ny][0] = 0;
for ( z = 1; z<=NGOL; z++)
gol2[nx][ny][z] = 0;
} }
if (createdsomething) if (createdsomething)
GENERATION ++; GENERATION ++;
memset(gol2, 0, sizeof(gol2));
} }
if (ISWIRE==1) if (ISWIRE==1)
{ {
@ -2032,11 +2036,20 @@ killed:
} }
nx = (int)(parts[i].x+0.5f); nx = (int)(parts[i].x+0.5f);
ny = (int)(parts[i].y+0.5f); ny = (int)(parts[i].y+0.5f);
if (ny!=y || nx!=x)
{
if ((pmap[y][x]>>8)==i) pmap[y][x] = 0;
else if (t==PT_PHOT&&(photons[y][x]>>8)==i) photons[y][x] = 0;
if (nx<CELL || nx>=XRES-CELL || ny<CELL || ny>=YRES-CELL) if (nx<CELL || nx>=XRES-CELL || ny<CELL || ny>=YRES-CELL)
{ {
kill_part(i); kill_part(i);
continue; continue;
} }
if (t==PT_PHOT)
photons[ny][nx] = t|(i<<8);
else
pmap[ny][nx] = t|(i<<8);
}
} }
if (framerender) { if (framerender) {
framerender = 0; framerender = 0;