Fixes from cracker64, also lolsounds

This commit is contained in:
Simon 2011-02-03 15:37:55 +00:00
commit 525a59e280
3 changed files with 170 additions and 10 deletions

View File

@ -3866,7 +3866,7 @@ 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? 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); 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" 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\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 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 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" "You can now use particle names (ex. set type all deut)\n"
@ -3875,6 +3875,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show
"Create particles with 'create deut x,y' where x and y are the coords\n" "Create particles with 'create deut x,y' where x and y are the coords\n"
"Run scripts from file 'file filename'\n" "Run scripts from file 'file filename'\n"
"You can delete/kill a particle with 'kill x,y'" "You can delete/kill a particle with 'kill x,y'"
"Play a sound with (sound blah.wav)"
,255, 187, 187, 255); ,255, 187, 187, 255);
cc = 0; cc = 0;

View File

@ -28,6 +28,7 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <SDL/SDL.h> #include <SDL/SDL.h>
#include <SDL/SDL_audio.h>
#include <bzlib.h> #include <bzlib.h>
#include <time.h> #include <time.h>
@ -51,6 +52,69 @@
#include <air.h> #include <air.h>
#include <icon.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 = static const char *it_msg =
"\brThe Powder Toy - http://powdertoy.co.uk/\n" "\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" "\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) if (replace)
{ {
gravityMode = 1; 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(bmap, 0, sizeof(bmap));
memset(emap, 0, sizeof(emap)); memset(emap, 0, sizeof(emap));
@ -1135,7 +1195,22 @@ int main(int argc, char *argv[])
pixel *load_img=NULL;//, *fbi_img=NULL; 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; int save_mode=0, save_x=0, save_y=0, save_w=0, save_h=0, copy_mode=0;
GSPEED = 1; 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 #ifdef MT
numCores = core_count(); numCores = core_count();
#endif #endif
@ -2303,7 +2378,6 @@ int main(int argc, char *argv[])
cb_bmap[cby][cbx] = bmap[cby][cbx]; cb_bmap[cby][cbx] = bmap[cby][cbx];
cb_emap[cby][cbx] = emap[cby][cbx]; cb_emap[cby][cbx] = emap[cby][cbx];
} }
create_parts(x, y, bsx, bsy, c); create_parts(x, y, bsx, bsy, c);
lx = x; lx = x;
ly = y; ly = y;
@ -2547,12 +2621,12 @@ int main(int argc, char *argv[])
} }
} }
SDL_CloseAudio();
http_done(); http_done();
return 0; return 0;
} }
int process_command(pixel *vid_buf,char *console,char *console_error) { 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 *console2;
char *console3; char *console3;
char *console4; char *console4;
@ -2594,6 +2668,10 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
else else
sprintf(console_error, "%s does not exist", console3); 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) else if(strcmp(console2, "load")==0 && console3)
{ {
j = atoi(console3); j = atoi(console3);
@ -2673,6 +2751,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
parts[i].life = j; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) if (console_parse_partref(console4, &i, console_error))
@ -2693,6 +2780,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
parts[i].type = j; 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 else
{ {
if (console_parse_partref(console4, &i, console_error) if (console_parse_partref(console4, &i, console_error)
@ -2713,6 +2809,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
parts[i].temp = j; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) 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; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) 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; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) 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; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) if (console_parse_partref(console4, &i, console_error))
@ -2793,6 +2925,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
parts[i].ctype = j; 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 else
{ {
if (console_parse_partref(console4, &i, console_error) if (console_parse_partref(console4, &i, console_error)
@ -2813,6 +2954,15 @@ int process_command(pixel *vid_buf,char *console,char *console_error) {
parts[i].vx = j; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) 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; 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 else
{ {
if (console_parse_partref(console4, &i, console_error)) if (console_parse_partref(console4, &i, console_error))

View File

@ -577,7 +577,7 @@ inline int create_part(int p, int x, int y, int t)
if (t==PT_SPRK) if (t==PT_SPRK)
{ {
if (!((pmap[y][x]&0xFF)==PT_INST||(ptypes[pmap[y][x]&0xFF].properties&PROP_CONDUCTS))) if ((pmap[y][x]>>8)>=NPART || !((pmap[y][x]&0xFF)==PT_INST||(ptypes[pmap[y][x]&0xFF].properties&PROP_CONDUCTS)))
return -1; return -1;
if (parts[pmap[y][x]>>8].life!=0) if (parts[pmap[y][x]>>8].life!=0)
return -1; return -1;