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?
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\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"
@ -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"
"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;

View File

@ -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));
@ -1135,7 +1195,22 @@ 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;
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
@ -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;
@ -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);
@ -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,6 +2780,15 @@ 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)
@ -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,6 +2925,15 @@ 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)
@ -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))

View File

@ -577,7 +577,7 @@ inline int create_part(int p, int x, int y, int t)
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;
if (parts[pmap[y][x]>>8].life!=0)
return -1;