diff options
| author | jacksonmj <jacksonmj@jacksonmj.none> | 2011-02-03 18:45:56 (GMT) |
|---|---|---|
| committer | jacksonmj <jacksonmj@jacksonmj.none> | 2011-02-03 18:47:23 (GMT) |
| commit | d21d1f7ba58d1fc2f1b6ccbfc945e440e16a06b7 (patch) | |
| tree | 186b21250c8f731887de996156d845e064722a47 /src/main.c | |
| parent | 54caad7a69c424b6bcb78374aa0d0785a8a5ac93 (diff) | |
| parent | 525a59e28011cf26993c8e3f040a36ba7b7bf5e2 (diff) | |
| download | powder-d21d1f7ba58d1fc2f1b6ccbfc945e440e16a06b7.zip powder-d21d1f7ba58d1fc2f1b6ccbfc945e440e16a06b7.tar.gz | |
Merge branch 'upstream' into dev
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 193 |
1 files changed, 176 insertions, 17 deletions
@@ -28,6 +28,7 @@ #include <string.h> #include <math.h> #include <SDL/SDL.h> +#include <SDL/SDL_audio.h> #include <bzlib.h> #include <time.h> @@ -51,6 +52,69 @@ #include <air.h> #include <icon.h> +#define NUM_SOUNDS 2 +struct sample { + 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; + } +} + +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(); +} + static const char *it_msg = "\brThe Powder Toy - http://powdertoy.co.uk/\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" @@ -479,10 +543,6 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if (replace) { gravityMode = 1; - memset(photons, 0, sizeof(photons)); - memset(wireless, 0, sizeof(wireless)); - memset(gol2, 0, sizeof(gol2)); - memset(portal, 0, sizeof(portal)); memset(bmap, 0, sizeof(bmap)); memset(emap, 0, sizeof(emap)); @@ -1136,6 +1196,21 @@ int main(int argc, char *argv[]) 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; + fmt.format = AUDIO_S16; + fmt.channels = 2; + fmt.samples = 512; + fmt.callback = mixaudio; + fmt.userdata = NULL; + /* Open the audio device and start playing sound! */ + if ( SDL_OpenAudio(&fmt, NULL) < 0 ) + { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + exit(1); + } + SDL_PauseAudio(0); #ifdef MT numCores = core_count(); #endif @@ -2164,10 +2239,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) @@ -2180,12 +2255,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); @@ -2193,7 +2268,7 @@ int main(int argc, char *argv[]) } } } - + if (c==WL_SIGN+100) { if (!bq) @@ -2303,7 +2378,6 @@ int main(int argc, char *argv[]) cb_bmap[cby][cbx] = bmap[cby][cbx]; cb_emap[cby][cbx] = emap[cby][cbx]; } - create_parts(x, y, bsx, bsy, c); lx = x; ly = y; @@ -2522,7 +2596,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); @@ -2547,12 +2621,12 @@ int main(int argc, char *argv[]) } } - + SDL_CloseAudio(); http_done(); return 0; } int process_command(pixel *vid_buf,char *console,char *console_error) { - int nx,ny,i,j; + int nx,ny,i,j,k; char *console2; char *console3; char *console4; @@ -2594,6 +2668,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { else sprintf(console_error, "%s does not exist", console3); } + else if(strcmp(console2, "sound")==0 && console3) + { + play_sound(console3); + } else if(strcmp(console2, "load")==0 && console3) { j = atoi(console3); @@ -2606,7 +2684,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"); @@ -2673,6 +2751,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].life = 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].life = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2693,10 +2780,19 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].type = j; } } + else if (console_parse_type(console4, &j, console_error) + && console_parse_type(console5, &k, console_error)) + { + for(i=0; i<NPART; i++) + { + 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; } @@ -2713,6 +2809,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].temp = 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].temp= k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2733,6 +2838,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].tmp = 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].tmp = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2753,6 +2867,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].x = 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].x = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2773,6 +2896,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].y = 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].y = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2793,10 +2925,19 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].ctype = j; } } + else if (console_parse_type(console4, &j, console_error) + && console_parse_type(console5, &k, console_error)) + { + for(i=0; i<NPART; i++) + { + 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; } @@ -2813,6 +2954,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].vx = 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].vx = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) @@ -2833,6 +2983,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { parts[i].vy = 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].vy = k; + } + } else { if (console_parse_partref(console4, &i, console_error)) |
