summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon <simon@hardwired.org.uk>2011-02-09 15:56:30 (GMT)
committer Simon <simon@hardwired.org.uk>2011-02-09 15:56:30 (GMT)
commit3de4d163a577def9f0c75e37bd80716e66a9ef0b (patch)
tree6f7d27f79676406f085bb5d663a8aee5040e2c10 /src
parentd5fe05d76079fda752fa3f6be26abdcd828d1f26 (diff)
parent7c100f29c0f62733156238d391ec1cec6fc508ee (diff)
downloadpowder-3de4d163a577def9f0c75e37bd80716e66a9ef0b.zip
powder-3de4d163a577def9f0c75e37bd80716e66a9ef0b.tar.gz
Merge branch 'dev' of git://github.com/jacksonmj/The-Powder-Toy
Diffstat (limited to 'src')
-rw-r--r--src/elements/prti.c2
-rw-r--r--src/elements/prto.c2
-rw-r--r--src/elements/wifi.c2
-rw-r--r--src/graphics.c141
-rw-r--r--src/interface.c60
-rw-r--r--src/main.c220
-rw-r--r--src/powder.c97
7 files changed, 285 insertions, 239 deletions
diff --git a/src/elements/prti.c b/src/elements/prti.c
index b25f7a3..560ba8c 100644
--- a/src/elements/prti.c
+++ b/src/elements/prti.c
@@ -4,6 +4,8 @@ int update_PRTI(UPDATE_FUNC_ARGS) {
int r, nnx, rx, ry;
int count =0;
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 (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
diff --git a/src/elements/prto.c b/src/elements/prto.c
index 2da6e00..8f743e7 100644
--- a/src/elements/prto.c
+++ b/src/elements/prto.c
@@ -4,6 +4,8 @@ int update_PRTO(UPDATE_FUNC_ARGS) {
int r, nnx, rx, ry, np;
int count = 0;
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 (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
diff --git a/src/elements/wifi.c b/src/elements/wifi.c
index fc5ee7f..a511e4b 100644
--- a/src/elements/wifi.c
+++ b/src/elements/wifi.c
@@ -3,6 +3,8 @@
int update_WIFI(UPDATE_FUNC_ARGS) {
int r, rx, ry;
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 (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
diff --git a/src/graphics.c b/src/graphics.c
index 786bdca..78f1867 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -855,49 +855,65 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
int rh = 12;
int rw = 0;
int cw = x;
- for (; *s; s++)
+ int wordlen;
+ int charspace;
+ while (*s)
{
- if (*s == '\n')
+ 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;
+ y+=FONT_H+2;
+ rh+=FONT_H+2;
}
- else if (*s == '\b')
+ for (; *s && --wordlen>=-1; s++)
{
- switch (s[1])
+ if (*s == '\n')
{
- case 'w':
- r = g = b = 255;
- break;
- case 'g':
- r = g = b = 192;
- break;
- case 'o':
- r = 255;
- g = 216;
- b = 32;
- break;
- case 'r':
- r = 255;
- g = b = 0;
- break;
- case 'b':
- r = g = 0;
- b = 255;
- break;
- }
- s++;
- }
- else
- {
- if (x-cw>=w) {
x = sx;
rw = 0;
- y+=FONT_H+2;
- rh+=FONT_H+2;
+ y += FONT_H+2;
+ }
+ else if (*s == '\b')
+ {
+ switch (s[1])
+ {
+ case 'w':
+ r = g = b = 255;
+ break;
+ case 'g':
+ r = g = b = 192;
+ break;
+ case 'o':
+ r = 255;
+ g = 216;
+ b = 32;
+ break;
+ case 'r':
+ r = 255;
+ g = b = 0;
+ break;
+ case 'b':
+ r = g = 0;
+ b = 255;
+ break;
+ }
+ s++;
+ }
+ else
+ {
+
+ if (x-cw>=w)
+ {
+ x = sx;
+ rw = 0;
+ y+=FONT_H+2;
+ rh+=FONT_H+2;
+ }
+ 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
@@ -1009,18 +1025,29 @@ void textnpos(char *s, int n, int w, int *cx, int *cy)
{
int x = 0;
int y = 0;
- //TODO: Implement Textnheight for wrapped text
- for (; *s; s++)
+ int wordlen, charspace;
+ while (*s&&n)
{
- if (!n) {
- break;
- }
- x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
- if (x>=w) {
+ wordlen = strcspn(s," .,!?\n");
+ charspace = textwidthx(s, w-x);
+ if (charspace<wordlen && wordlen && w-x<w/3)
+ {
x = 0;
y += FONT_H+2;
}
- n--;
+ for (; *s && --wordlen>=-1; s++)
+ {
+ if (!n) {
+ break;
+ }
+ x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
+ if (x>=w)
+ {
+ x = 0;
+ y += FONT_H+2;
+ }
+ n--;
+ }
}
*cx = x-1;
*cy = y;
@@ -1041,18 +1068,28 @@ int textwidthx(char *s, int w)
}
int textposxy(char *s, int width, int w, int h)
{
- int x=0,y=0,n=0,cw;
- for (; *s; s++)
+ int x=0,y=0,n=0,cw, wordlen, charspace;
+ while (*s)
{
- cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
- if (x+(cw/2) >= w && y+6 >= h)
- break;
- x += cw;
- if (x>=width) {
+ wordlen = strcspn(s," .,!?\n");
+ charspace = textwidthx(s, width-x);
+ if (charspace<wordlen && wordlen && width-x<width/3)
+ {
x = 0;
y += FONT_H+2;
}
- n++;
+ for (; *s && --wordlen>=-1; s++)
+ {
+ cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
+ if ((x+(cw/2) >= w && y+6 >= h)||(y+6 >= h+FONT_H+2))
+ return n++;
+ x += cw;
+ if (x>=width) {
+ x = 0;
+ y += FONT_H+2;
+ }
+ n++;
+ }
}
return n;
}
@@ -1483,7 +1520,9 @@ void draw_parts(pixel *vid)
t!=PT_HFLM && t!=PT_SPRK && t!=PT_FIRW &&
t!=PT_DUST && t!=PT_FIRW && t!=PT_FWRK &&
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)
{
@@ -2907,7 +2946,7 @@ void render_signs(pixel *vid_buf)
sprintf(buff, "Temp: 0.00"); //...tempirature
drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255);
}
-
+
if(sregexp(signs[i].text, "^{c:[0-9]*|.*}$")==0)
{
int sldr, startm;
diff --git a/src/interface.c b/src/interface.c
index e321d13..32c83a1 100644
--- a/src/interface.c
+++ b/src/interface.c
@@ -96,7 +96,7 @@ void get_sign_pos(int i, int *x0, int *y0, int *w, int *h)
memset(buff, 0, sizeof(buff));
for(sldr=3; signs[i].text[sldr-1] != '|'; sldr++)
startm = sldr + 1;
-
+
sldr = startm;
while(signs[i].text[sldr] != '}')
{
@@ -105,7 +105,7 @@ void get_sign_pos(int i, int *x0, int *y0, int *w, int *h)
}
*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;
@@ -874,13 +874,13 @@ void login_ui(pixel *vid_buf)
*(s_id++) = 0;
u_e = strchr(s_id, ' ');
- if (!u_e){
+ if (!u_e) {
u_e = malloc(1);
memset(u_e, 0, 1);
}
else
*(u_e++) = 0;
-
+
strcpy(svf_user_id, res+3);
strcpy(svf_session_id, s_id);
nres = mystrdup(u_e);
@@ -3866,18 +3866,18 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show
clearrect(vid_buf, 0, 0, XRES+BARSIZE, 220);//anyway to make it transparent?
draw_line(vid_buf, 1, 219, XRES, 219, 228, 228, 228, XRES+BARSIZE);
drawtext(vid_buf, 100, 15, "Welcome to The Powder Toy console v.2 (by cracker64)\n"
- "Current commands are quit, set, reset, load, create, file, kill, sound\n"
- "You can set type, temp, ctype, life, x, y, vx, vy using this format ('set life particle# 9001')\n"
- "You can also use 'all' instead of a particle number to do it to everything.\n"
- "You can now use particle names (ex. set type all deut)\n"
- "Reset works with pressure, velocity, sparks, temp (ex. 'reset pressure')\n"
- "To load a save use load saveID (ex. load 1337)\n"
- "Create particles with 'create deut x,y' where x and y are the coords\n"
- "Run scripts from file 'file filename'\n"
- "You can delete/kill a particle with 'kill x,y'"
- "Play a sound with (sound blah.wav)"
- ,255, 187, 187, 255);
-
+ "Current commands are quit, set, reset, load, create, file, kill, sound\n"
+ "You can set type, temp, ctype, life, x, y, vx, vy using this format ('set life particle# 9001')\n"
+ "You can also use 'all' instead of a particle number to do it to everything.\n"
+ "You can now use particle names (ex. set type all deut)\n"
+ "Reset works with pressure, velocity, sparks, temp (ex. 'reset pressure')\n"
+ "To load a save use load saveID (ex. load 1337)\n"
+ "Create particles with 'create deut x,y' where x and y are the coords\n"
+ "Run scripts from file 'file filename'\n"
+ "You can delete/kill a particle with 'kill x,y'"
+ "Play a sound with (sound blah.wav)"
+ ,255, 187, 187, 255);
+
cc = 0;
currentcommand = last_command;
while(cc < 10)
@@ -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 i = atoi(txt);
- 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;
+ int i = -1;
// alternative names for some elements
if (strcasecmp(txt,"C4")==0) i = PT_PLEX;
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?
int nx = -1, ny = -1;
- sscanf(txt,"%d,%d",&nx,&ny);
- if (nx<0 && nx>=XRES)
- {
- strcpy(err,"Invalid coordinates");
- return 0;
- }
- if (ny<0 && ny>=YRES)
+ if (sscanf(txt,"%d,%d",&nx,&ny)!=2 || nx<0 || nx>=XRES || ny<0 || ny>=YRES)
{
strcpy(err,"Invalid coordinates");
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)
{
+ strcpy(err,"");
// TODO: use regex?
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];
if (!i || (i>>8)>=NPART)
@@ -4025,7 +4008,6 @@ int console_parse_partref(char *txt, int *which, char *err)
else if (txt)
{
char *num = (char*)malloc(strlen(txt)+3);
- strcpy(err,""); // suppress error message from failed coordinate parsing
i = atoi(txt);
sprintf(num,"%d",i);
if (!txt || strcmp(txt,num)!=0)
@@ -4038,6 +4020,6 @@ int console_parse_partref(char *txt, int *which, char *err)
strcpy(err,"");
return 1;
}
- strcpy(err,"Particle does not exist");
+ if (strcmp(err,"")==0) strcpy(err,"Particle does not exist");
return 0;
}
diff --git a/src/main.c b/src/main.c
index 3a2ae3f..bb27473 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,65 +54,67 @@
#define NUM_SOUNDS 2
struct sample {
- Uint8 *data;
- Uint32 dpos;
- Uint32 dlen;
+ Uint8 *data;
+ Uint32 dpos;
+ Uint32 dlen;
} sounds[NUM_SOUNDS];
void mixaudio(void *unused, Uint8 *stream, int len)
{
- int i;
- Uint32 amount;
-
- for ( i=0; i<NUM_SOUNDS; ++i ) {
- amount = (sounds[i].dlen-sounds[i].dpos);
- if ( amount > len ) {
- amount = len;
- }
- SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
- sounds[i].dpos += amount;
- }
+ int i;
+ Uint32 amount;
+
+ for ( i=0; i<NUM_SOUNDS; ++i ) {
+ amount = (sounds[i].dlen-sounds[i].dpos);
+ if ( amount > len ) {
+ amount = len;
+ }
+ SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
+ sounds[i].dpos += amount;
+ }
}
void play_sound(char *file)
{
- int index;
- SDL_AudioSpec wave;
- Uint8 *data;
- Uint32 dlen;
- SDL_AudioCVT cvt;
-
- /* Look for an empty (or finished) sound slot */
- for ( index=0; index<NUM_SOUNDS; ++index ) {
- if ( sounds[index].dpos == sounds[index].dlen ) {
- break;
- }
- }
- if ( index == NUM_SOUNDS )
- return;
-
- /* Load the sound file and convert it to 16-bit stereo at 22kHz */
- if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
- fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
- return;
- }
- SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
- AUDIO_S16, 2, 22050);
- cvt.buf = malloc(dlen*cvt.len_mult);
- memcpy(cvt.buf, data, dlen);
- cvt.len = dlen;
- SDL_ConvertAudio(&cvt);
- SDL_FreeWAV(data);
-
- /* Put the sound data in the slot (it starts playing immediately) */
- if ( sounds[index].data ) {
- free(sounds[index].data);
- }
- SDL_LockAudio();
- sounds[index].data = cvt.buf;
- sounds[index].dlen = cvt.len_cvt;
- sounds[index].dpos = 0;
- SDL_UnlockAudio();
+ int index;
+ SDL_AudioSpec wave;
+ Uint8 *data;
+ Uint32 dlen;
+ SDL_AudioCVT cvt;
+
+ if (!sound_enable) return;
+
+ /* Look for an empty (or finished) sound slot */
+ for ( index=0; index<NUM_SOUNDS; ++index ) {
+ if ( sounds[index].dpos == sounds[index].dlen ) {
+ break;
+ }
+ }
+ if ( index == NUM_SOUNDS )
+ return;
+
+ /* Load the sound file and convert it to 16-bit stereo at 22kHz */
+ if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
+ fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
+ return;
+ }
+ SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
+ AUDIO_S16, 2, 22050);
+ cvt.buf = malloc(dlen*cvt.len_mult);
+ memcpy(cvt.buf, data, dlen);
+ cvt.len = dlen;
+ SDL_ConvertAudio(&cvt);
+ SDL_FreeWAV(data);
+
+ /* Put the sound data in the slot (it starts playing immediately) */
+ if ( sounds[index].data ) {
+ free(sounds[index].data);
+ }
+ SDL_LockAudio();
+ sounds[index].data = cvt.buf;
+ sounds[index].dlen = cvt.len_cvt;
+ sounds[index].dpos = 0;
+ SDL_UnlockAudio();
}
static const char *it_msg =
@@ -167,6 +169,7 @@ int FPSB = 0;
int MSIGN =-1;
//int CGOL = 0;
//int GSPEED = 1;//causes my .exe to crash..
+int sound_enable;
sign signs[MAXSIGNS];
@@ -1196,7 +1199,7 @@ int main(int argc, char *argv[])
pixel *load_img=NULL;//, *fbi_img=NULL;
int save_mode=0, save_x=0, save_y=0, save_w=0, save_h=0, copy_mode=0;
GSPEED = 1;
-
+
SDL_AudioSpec fmt;
/* Set 16-bit stereo audio at 22Khz */
fmt.freq = 22050;
@@ -1209,9 +1212,12 @@ int main(int argc, char *argv[])
if ( SDL_OpenAudio(&fmt, NULL) < 0 )
{
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
- exit(1);
}
- SDL_PauseAudio(0);
+ else
+ {
+ sound_enable = 1;
+ SDL_PauseAudio(0);
+ }
#ifdef MT
numCores = core_count();
#endif
@@ -1930,7 +1936,7 @@ int main(int argc, char *argv[])
int tctype = parts[cr>>8].ctype;
if (tctype>=PT_NUM)
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);
} 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);
@@ -1941,7 +1947,6 @@ int main(int argc, char *argv[])
if (tctype>=PT_NUM)
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(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);
} 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);
@@ -1950,10 +1955,10 @@ int main(int argc, char *argv[])
}
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]);
}
+ if (DEBUG_MODE)
+ sprintf(coordtext, "X:%d Y:%d", x/sdl_scale, y/sdl_scale);
}
mx = x;
my = y;
@@ -2340,10 +2345,10 @@ int main(int argc, char *argv[])
else if (y<YRES)
{
int signi;
-
+
c = (b&1) ? sl : sr;
su = c;
-
+
if(c!=WL_SIGN+100)
{
if(!bq)
@@ -2356,12 +2361,12 @@ int main(int argc, char *argv[])
{
char buff[256];
int sldr;
-
+
memset(buff, 0, sizeof(buff));
-
+
for(sldr=3; signs[signi].text[sldr] != '|'; sldr++)
buff[sldr-3] = signs[signi].text[sldr];
-
+
char buff2[sldr-2]; //TODO: Fix this for Visual Studio
memset(buff2, 0, sizeof(buff2));
memcpy(&buff2, &buff, sldr-3);
@@ -2369,7 +2374,7 @@ int main(int argc, char *argv[])
}
}
}
-
+
if (c==WL_SIGN+100)
{
if (!bq)
@@ -2697,7 +2702,7 @@ int main(int argc, char *argv[])
if(DEBUG_MODE)
{
fillrect(vid_buf, XRES-20-textwidth(coordtext), 26, textwidth(coordtext)+8, 11, 0, 0, 0, 140);
- drawtext(vid_buf, XRES-16-textwidth(coordtext), 27, coordtext, 255, 255, 255, 200);
+ drawtext(vid_buf, XRES-16-textwidth(coordtext), 27, coordtext, 255, 255, 255, 200);
}
}
fillrect(vid_buf, 12, 12, textwidth(uitext)+8, 15, 0, 0, 0, 140);
@@ -2826,7 +2831,8 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
}
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)
{
@@ -2856,7 +2862,7 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
else if (strcmp(console2, "create")==0 && console3 && console4)
{
if (console_parse_type(console3, &j, console_error)
- && console_parse_coords(console4, &nx, &ny, console_error))
+ && console_parse_coords(console4, &nx, &ny, console_error))
{
if (!j)
strcpy(console_error, "Cannot create particle with type NONE");
@@ -2927,10 +2933,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].life = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].life = k;
+ }
}
else
{
@@ -2953,18 +2959,18 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
}
}
else if (console_parse_type(console4, &j, console_error)
- && console_parse_type(console5, &k, console_error))
+ && console_parse_type(console5, &k, console_error))
{
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].type = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].type = k;
+ }
}
else
{
if (console_parse_partref(console4, &i, console_error)
- && console_parse_type(console5, &j, console_error))
+ && console_parse_type(console5, &j, console_error))
{
parts[i].type = j;
}
@@ -2985,10 +2991,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].temp= k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].temp= k;
+ }
}
else
{
@@ -3014,10 +3020,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].tmp = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].tmp = k;
+ }
}
else
{
@@ -3043,10 +3049,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].x = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].x = k;
+ }
}
else
{
@@ -3072,10 +3078,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].y = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].y = k;
+ }
}
else
{
@@ -3098,18 +3104,18 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
}
}
else if (console_parse_type(console4, &j, console_error)
- && console_parse_type(console5, &k, console_error))
+ && console_parse_type(console5, &k, console_error))
{
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].ctype = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].ctype = k;
+ }
}
else
{
if (console_parse_partref(console4, &i, console_error)
- && console_parse_type(console5, &j, console_error))
+ && console_parse_type(console5, &j, console_error))
{
parts[i].ctype = j;
}
@@ -3130,10 +3136,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].vx = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].vx = k;
+ }
}
else
{
@@ -3159,10 +3165,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
{
k = atoi(console5);
for(i=0; i<NPART; i++)
- {
- if(parts[i].type == j)
- parts[i].vy = k;
- }
+ {
+ if(parts[i].type == j)
+ parts[i].vy = k;
+ }
}
else
{
diff --git a/src/powder.c b/src/powder.c
index 74f4507..5784da6 100644
--- a/src/powder.c
+++ b/src/powder.c
@@ -255,11 +255,9 @@ int try_move(int i, int x, int y, int nx, int ny)
parts[e].x += x-nx;
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;
}
@@ -417,33 +415,31 @@ void kill_part(int i)
{
int x, y;
- if (parts[i].type != PT_PHOT) {
- x = (int)(parts[i].x+0.5f);
- y = (int)(parts[i].y+0.5f);
- if (parts[i].type == PT_STKM)
- {
- death = 1;
- isplayer = 0;
- }
- if (parts[i].type == PT_STKM2)
- {
- death2 = 1;
- isplayer2 = 0;
- }
- if (parts[i].type == PT_SPAWN)
- {
- ISSPAWN1 = 0;
- }
- if (parts[i].type == PT_SPAWN2)
- {
- ISSPAWN2 = 0;
- }
- if (x>=0 && y>=0 && x<XRES && y<YRES) {
- if ((pmap[y][x]>>8)==i)
- pmap[y][x] = 0;
- else if ((photons[y][x]>>8)==i)
- photons[y][x] = 0;
- }
+ x = (int)(parts[i].x+0.5f);
+ y = (int)(parts[i].y+0.5f);
+ if (parts[i].type == PT_STKM)
+ {
+ death = 1;
+ isplayer = 0;
+ }
+ if (parts[i].type == PT_STKM2)
+ {
+ death2 = 1;
+ isplayer2 = 0;
+ }
+ if (parts[i].type == PT_SPAWN)
+ {
+ ISSPAWN1 = 0;
+ }
+ if (parts[i].type == PT_SPAWN2)
+ {
+ ISSPAWN2 = 0;
+ }
+ if (x>=0 && y>=0 && x<XRES && y<YRES) {
+ if ((pmap[y][x]>>8)==i)
+ pmap[y][x] = 0;
+ else if ((photons[y][x]>>8)==i)
+ photons[y][x] = 0;
}
parts[i].type = PT_NONE;
@@ -460,10 +456,18 @@ inline void part_change_type(int i, int x, int y, int t)
if (x<0 || y<0 || x>=XRES || y>=YRES || i>=NPART)
return -1;
parts[i].type = t;
- if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT)// && t!=PT_NEUT)
+ if (t==PT_PHOT)// || t==PT_NEUT)
+ {
+ photons[y][x] = t|(i<<8);
+ if ((pmap[y][x]>>8)==i)
+ pmap[y][x] = 0;
+ }
+ else
+ {
pmap[y][x] = t|(i<<8);
- else if ((pmap[y][x]>>8)==i)
- pmap[y][x] = 0;
+ if ((photons[y][x]>>8)==i)
+ photons[y][x] = 0;
+ }
}
#if defined(WIN32) && !defined(__GNUC__)
@@ -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;
if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT && !pmap[y][x])// && t!=PT_NEUT)
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;
}
@@ -1343,15 +1349,13 @@ void update_particles_i(pixel *vid, int start, int inc)
if(parts[r>>8].tmp==grule[golnum][9]-1)
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
}
- gol2[nx][ny][0] = 0;
- for ( z = 1; z<=NGOL; z++)
- gol2[nx][ny][z] = 0;
}
if (createdsomething)
GENERATION ++;
+ memset(gol2, 0, sizeof(gol2));
}
if (ISWIRE==1)
{
@@ -1527,10 +1531,10 @@ void update_particles_i(pixel *vid, int start, int inc)
ctemph = ctempl = pt;
// change boiling point with pressure
if ((ptypes[t].state==ST_LIQUID && ptransitions[t].tht>-1 && ptransitions[t].tht<PT_NUM && ptypes[ptransitions[t].tht].state==ST_GAS)
- || t==PT_LNTG || t==PT_SLTW)
+ || t==PT_LNTG || t==PT_SLTW)
ctemph -= 2.0f*pv[y/CELL][x/CELL];
else if ((ptypes[t].state==ST_GAS && ptransitions[t].tlt>-1 && ptransitions[t].tlt<PT_NUM && ptypes[ptransitions[t].tlt].state==ST_LIQUID)
- || t==PT_WTRV)
+ || t==PT_WTRV)
ctempl -= 2.0f*pv[y/CELL][x/CELL];
s = 1;
if (ctemph>ptransitions[t].thv&&ptransitions[t].tht>-1) {
@@ -2032,10 +2036,19 @@ killed:
}
nx = (int)(parts[i].x+0.5f);
ny = (int)(parts[i].y+0.5f);
- if (nx<CELL || nx>=XRES-CELL || ny<CELL || ny>=YRES-CELL)
+ if (ny!=y || nx!=x)
{
- kill_part(i);
- continue;
+ 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)
+ {
+ kill_part(i);
+ continue;
+ }
+ if (t==PT_PHOT)
+ photons[ny][nx] = t|(i<<8);
+ else
+ pmap[ny][nx] = t|(i<<8);
}
}
if (framerender) {