diff options
| author | Lieuwe <lieuwemo@gmail.com> | 2011-03-03 18:38:06 (GMT) |
|---|---|---|
| committer | Lieuwe <lieuwemo@gmail.com> | 2011-03-03 18:38:06 (GMT) |
| commit | 9f8811159cc80eed0cf30408fdca139a6604fffe (patch) | |
| tree | ee9469afc173814ecfdffedac2dc3c474a8f0935 /src | |
| parent | 021f2a6c55e67b9223e21ed819285c51e467a90d (diff) | |
| parent | 9e8b7440ba464f4f84c0058095f4546e1d4da9de (diff) | |
| download | powder-9f8811159cc80eed0cf30408fdca139a6604fffe.zip powder-9f8811159cc80eed0cf30408fdca139a6604fffe.tar.gz | |
pulled some code by cracker which makes output even more awesome :P
Diffstat (limited to 'src')
| -rw-r--r-- | src/interface.c | 40 | ||||
| -rw-r--r-- | src/main.c | 331 | ||||
| -rw-r--r-- | src/powder.c | 28 |
3 files changed, 316 insertions, 83 deletions
diff --git a/src/interface.c b/src/interface.c index f529d54..d453a10 100644 --- a/src/interface.c +++ b/src/interface.c @@ -3839,10 +3839,12 @@ struct command_history { }; typedef struct command_history command_history; command_history *last_command = NULL; +command_history *last_command2 = NULL; char *console_ui(pixel *vid_buf,char error[255],char console_more) { int mx,my,b,cc,ci = -1; pixel *old_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); command_history *currentcommand; + command_history *currentcommand2; ui_edit ed; ed.x = 15; ed.y = 207; @@ -3856,7 +3858,13 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) { ed.cursor = 0; //fillrect(vid_buf, -1, -1, XRES, 220, 0, 0, 0, 190); memcpy(old_buf,vid_buf,(XRES+BARSIZE)*YRES*PIXELSIZE); - fillrect(old_buf, -1, -1, XRES, 220, 0, 0, 0, 190); + fillrect(old_buf, -1, -1, XRES+1, 220, 0, 0, 0, 190); + currentcommand2 = malloc(sizeof(command_history)); + memset(currentcommand2, 0, sizeof(command_history)); + currentcommand2->prev_command = last_command2; + currentcommand2->command = mystrdup(error); + last_command2 = currentcommand2; + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); cc = 0; while(cc < 80){ fillrect(old_buf, -1, -1+cc, XRES+BARSIZE, 2, 0, 0, 0, 160-(cc*2)); @@ -3869,6 +3877,7 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) { my /= sdl_scale; ed.focus = 1; + //clearrect(vid_buf, 0, 0, XRES+BARSIZE, 220);//anyway to make it transparent? memcpy(vid_buf,old_buf,(XRES+BARSIZE)*YRES*PIXELSIZE); draw_line(vid_buf, 0, 219, XRES+BARSIZE-1, 219, 228, 228, 228, XRES+BARSIZE); drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64, python by Doxin)" //TODO: help command @@ -3896,9 +3905,31 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) { break; } } + cc = 0; + currentcommand2 = last_command2; + while(cc < 10) + { + if(currentcommand2==NULL) + break; + drawtext(vid_buf, 215, 175-(cc*12), currentcommand2->command, 255, 225, 225, 255); + if(currentcommand2->prev_command!=NULL) + { + if(cc<9) { + currentcommand2 = currentcommand2->prev_command; + } else if(currentcommand2->prev_command!=NULL) { + free(currentcommand2->prev_command); + currentcommand2->prev_command = NULL; + } + cc++; + } + else + { + break; + } + } - if(error && ed.str[0]=='\0') - drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200); + //if(error && ed.str[0]=='\0') + //drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200); if(console_more==0) drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240); else @@ -3915,12 +3946,14 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) { currentcommand->command = mystrdup(ed.str); last_command = currentcommand; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return currentcommand->command; } if (sdl_key==SDLK_ESCAPE || sdl_key==SDLK_BACKQUOTE) { console_mode = 0; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return NULL; } if(sdl_key==SDLK_UP || sdl_key==SDLK_DOWN) @@ -3957,6 +3990,7 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) { } console_mode = 0; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return NULL; } @@ -1189,12 +1189,16 @@ char console_error[255] = ""; //functions callable from python: static PyObject* -emb_create(PyObject *self, PyObject *args) +emb_create(PyObject *self, PyObject *args, PyObject *keywds) { int x,y,t; - if(!PyArg_ParseTuple(args, "III:create",&x,&y,&t)) + char *name = ""; + char *kwlist[] = {"x","y","t","name", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "II|Is:create",kwlist, &x,&y,&t,&name)) return NULL; // + if(strcmp(name,"")!=0) + console_parse_type(name, &t, console_error); return Py_BuildValue("i",create_part(-1,x,y,t)); } //sys_pause = !sys_pause @@ -1338,13 +1342,17 @@ emb_reset_sparks(PyObject *self, PyObject *args) return Py_BuildValue("i",1); } -emb_set_life(PyObject *self, PyObject *args) +emb_set_life(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_life",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1352,7 +1360,7 @@ emb_set_life(PyObject *self, PyObject *args) parts[i].life = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1360,16 +1368,33 @@ emb_set_life(PyObject *self, PyObject *args) parts[i].life = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].life = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].life = life; + } return Py_BuildValue("i",1); } -emb_set_type(PyObject *self, PyObject *args) +emb_set_type(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_type",&j,&life)) + int i = -1,life,j=-1,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "settoint", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "|sIsIII:set_type",kwlist ,&type,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1 && j==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + console_parse_type(type, &life, console_error); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1377,7 +1402,7 @@ emb_set_type(PyObject *self, PyObject *args) parts[i].type = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1385,16 +1410,31 @@ emb_set_type(PyObject *self, PyObject *args) parts[i].type = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].type = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].type = life; + } return Py_BuildValue("i",1); } -emb_set_temp(PyObject *self, PyObject *args) +emb_set_temp(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_temp",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1402,7 +1442,7 @@ emb_set_temp(PyObject *self, PyObject *args) parts[i].temp = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1410,16 +1450,31 @@ emb_set_temp(PyObject *self, PyObject *args) parts[i].temp = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].temp = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].temp = life; + } return Py_BuildValue("i",1); } -emb_set_tmp(PyObject *self, PyObject *args) +emb_set_tmp(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_tmp",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1427,7 +1482,7 @@ emb_set_tmp(PyObject *self, PyObject *args) parts[i].tmp = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1435,16 +1490,32 @@ emb_set_tmp(PyObject *self, PyObject *args) parts[i].tmp = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].tmp = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].tmp = life; + } return Py_BuildValue("i",1); } -emb_set_x(PyObject *self, PyObject *args) +emb_set_x(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_x",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1452,7 +1523,7 @@ emb_set_x(PyObject *self, PyObject *args) parts[i].x = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1460,16 +1531,31 @@ emb_set_x(PyObject *self, PyObject *args) parts[i].x = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].x = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].x = life; + } return Py_BuildValue("i",1); } -emb_set_y(PyObject *self, PyObject *args) +emb_set_y(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_y",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1477,7 +1563,7 @@ emb_set_y(PyObject *self, PyObject *args) parts[i].y = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1485,16 +1571,34 @@ emb_set_y(PyObject *self, PyObject *args) parts[i].y = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].y = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].y = life; + } return Py_BuildValue("i",1); } -emb_set_ctype(PyObject *self, PyObject *args) +emb_set_ctype(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_ctype",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "toctypeint", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "s|IsIII:set_type",kwlist ,&type, &life, &name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(!life) + console_parse_type(type, &life, console_error); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1502,7 +1606,7 @@ emb_set_ctype(PyObject *self, PyObject *args) parts[i].ctype = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1510,16 +1614,31 @@ emb_set_ctype(PyObject *self, PyObject *args) parts[i].ctype = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].ctype = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].ctype = life; + } return Py_BuildValue("i",1); } -emb_set_vx(PyObject *self, PyObject *args) +emb_set_vx(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_vx",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1527,7 +1646,7 @@ emb_set_vx(PyObject *self, PyObject *args) parts[i].vx = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1535,16 +1654,31 @@ emb_set_vx(PyObject *self, PyObject *args) parts[i].vx = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].vx = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].vx = life; + } return Py_BuildValue("i",1); } -emb_set_vy(PyObject *self, PyObject *args) +emb_set_vy(PyObject *self, PyObject *args, PyObject *keywds) { - int i,life,j; - if(!PyArg_ParseTuple(args, "II:set_vy",&j,&life)) + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "from", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) return NULL; // - if(j==-1) + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) { for(i=0; i<NPART; i++) { @@ -1552,7 +1686,7 @@ emb_set_vy(PyObject *self, PyObject *args) parts[i].vy = life; } } - else + else if(console_parse_type(name, &j, console_error)) { for(i=0; i<NPART; i++) { @@ -1560,32 +1694,87 @@ emb_set_vy(PyObject *self, PyObject *args) parts[i].vy = life; } } + else if(i!=-1) + { + if(parts[i].type != PT_NONE) + parts[i].vy = life; + + } + else if(x!=-1 && y!=-1 && x>=0 && x<XRES && y>=0 && y<YRES) + { + if(parts[pmap[y][x]>>8].type != PT_NONE) + parts[pmap[y][x]>>8].vy = life; + } return Py_BuildValue("i",1); } +emb_get_pmap(PyObject *self, PyObject *args) +{ + int x,y; + if(!PyArg_ParseTuple(args, "II:get_pmap",&x,&y)) + return NULL; + // + if(x<0 || y<0 || x>=XRES || y>=YRES) + return Py_BuildValue("i",-1); + + return Py_BuildValue("I",pmap[y][x]); +} +emb_get_prop(PyObject *self, PyObject *args) +{ + int i; + char *prop = ""; + if(!PyArg_ParseTuple(args, "Is:get_pmap",&i,&prop)) + return NULL; + // + if(parts[i].type) + { + if(strcmp(prop,"type")==0) + return Py_BuildValue("i",parts[i].type); + if(strcmp(prop,"life")==0) + return Py_BuildValue("i",parts[i].life); + if(strcmp(prop,"ctype")==0) + return Py_BuildValue("i",parts[i].ctype); + if(strcmp(prop,"temp")==0) + return Py_BuildValue("i",parts[i].temp); + if(strcmp(prop,"tmp")==0) + return Py_BuildValue("i",parts[i].tmp); + if(strcmp(prop,"vy")==0) + return Py_BuildValue("f",parts[i].vy); + if(strcmp(prop,"vx")==0) + return Py_BuildValue("f",parts[i].vx); + if(strcmp(prop,"x")==0) + return Py_BuildValue("i",parts[i].x); + if(strcmp(prop,"y")==0) + return Py_BuildValue("i",parts[i].y); + } + + return Py_BuildValue("i",-1); +} static PyMethodDef EmbMethods[] = { //WARNING! don't forget to register your function here! - {"create", emb_create, METH_VARARGS,"create a particle."}, - {"log", emb_log, METH_VARARGS,"logs an error string to the console."}, - {"reset_pressure", emb_reset_pressure, METH_VARARGS,"resets all the pressure."}, - {"reset_velocity", emb_reset_velocity, METH_VARARGS,"resets all the velocity."}, - {"reset_sparks", emb_reset_sparks, METH_VARARGS,"resets all the sparks."}, - {"set_life", emb_set_life, METH_VARARGS,"sets life of a specified particle."}, - {"set_type", emb_set_type, METH_VARARGS,"sets type of a specified particle."}, - {"set_temp", emb_set_temp, METH_VARARGS,"sets temp of a specified particle."}, - {"set_tmp", emb_set_tmp, METH_VARARGS,"sets tmp of a specified particle."}, - {"set_x", emb_set_x, METH_VARARGS,"sets x of a specified particle."}, - {"set_y", emb_set_y, METH_VARARGS,"sets y of a specified particle."}, - {"set_ctype", emb_set_y, METH_VARARGS,"sets ctype of a specified particle."}, - {"set_vx", emb_set_vx, METH_VARARGS,"sets vx of a specified particle."}, - {"set_vy", emb_set_vy, METH_VARARGS,"sets vy of a specified particle."}, - {"pause", emb_pause, METH_VARARGS,"pause the game."}, - {"unpause", emb_unpause, METH_VARARGS,"unpause the game."}, - {"toggle_pause", emb_toggle_pause, METH_VARARGS,"toggle game pause."}, - {"open_console", emb_open_console, METH_VARARGS,"open the game console."}, - {"close_console", emb_close_console, METH_VARARGS,"close the game console."}, - {"toggle_console", emb_toggle_console, METH_VARARGS,"toggle the game console."}, - {"console_more", emb_console_more, METH_VARARGS,"turns the more indicator on."}, - {"console_less", emb_console_less, METH_VARARGS,"turns the more indicator off."}, + {"create", emb_create, METH_VARARGS|METH_KEYWORDS, "create a particle."}, + {"log", emb_log, METH_VARARGS, "logs an error string to the console."}, + {"reset_pressure", emb_reset_pressure, METH_VARARGS, "resets all the pressure."}, + {"reset_velocity", emb_reset_velocity, METH_VARARGS, "resets all the velocity."}, + {"reset_sparks", emb_reset_sparks, METH_VARARGS, "resets all the sparks."}, + {"set_life", emb_set_life, METH_VARARGS|METH_KEYWORDS, "sets life of a specified particle."}, + {"set_type", emb_set_type, METH_VARARGS|METH_KEYWORDS, "sets type of a specified particle."}, + {"set_temp", emb_set_temp, METH_VARARGS|METH_KEYWORDS, "sets temp of a specified particle."}, + {"set_tmp", emb_set_tmp, METH_VARARGS|METH_KEYWORDS, "sets tmp of a specified particle."}, + {"set_x", emb_set_x, METH_VARARGS|METH_KEYWORDS, "sets x of a specified particle."}, + {"set_y", emb_set_y, METH_VARARGS|METH_KEYWORDS, "sets y of a specified particle."}, + {"set_ctype", emb_set_y, METH_VARARGS|METH_KEYWORDS, "sets ctype of a specified particle."}, + {"set_vx", emb_set_vx, METH_VARARGS|METH_KEYWORDS, "sets vx of a specified particle."}, + {"set_vy", emb_set_vy, METH_VARARGS|METH_KEYWORDS, "sets vy of a specified particle."}, + {"pause", emb_pause, METH_VARARGS, "pause the game."}, + {"unpause", emb_unpause, METH_VARARGS, "unpause the game."}, + {"toggle_pause", emb_toggle_pause, METH_VARARGS, "toggle game pause."}, + {"open_console", emb_open_console, METH_VARARGS, "open the game console."}, + {"close_console", emb_close_console, METH_VARARGS, "close the game console."}, + {"toggle_console", emb_toggle_console, METH_VARARGS, "toggle the game console."}, + {"console_more", emb_console_more, METH_VARARGS, "turns the more indicator on."}, + {"console_less", emb_console_less, METH_VARARGS, "turns the more indicator off."}, + {"get_pmap", emb_get_pmap, METH_VARARGS, "get the pmap value."}, + {"get_prop", emb_get_prop, METH_VARARGS, "get some properties."}, {NULL, NULL, 0, NULL} }; @@ -2885,9 +3074,7 @@ int main(int argc, char *argv[]) } } else - { create_line(lx, ly, x, y, bsx, bsy, c); - } lx = x; ly = y; } @@ -2912,7 +3099,7 @@ int main(int argc, char *argv[]) { if (sdl_mod & (KMOD_CAPS)) c = 0; - if (c!=WL_STREAM+100&&c!=SPC_AIR&&c!=SPC_HEAT&&c!=SPC_COOL&&c!=SPC_VACUUM&&c!=PT_WIND&&!REPLACE_MODE) + if (c!=WL_STREAM+100&&c!=SPC_AIR&&c!=SPC_HEAT&&c!=SPC_COOL&&c!=SPC_VACUUM&&!REPLACE_MODE&&c!=PT_WIND) flood_parts(x, y, c, -1, -1); if (c==SPC_HEAT || c==SPC_COOL) create_parts(x, y, bsx, bsy, c); diff --git a/src/powder.c b/src/powder.c index 55c1233..e15565b 100644 --- a/src/powder.c +++ b/src/powder.c @@ -79,6 +79,9 @@ int eval_move(int pt, int nx, int ny, unsigned *rr) if ((r&0xFF)==PT_VOID || (r&0xFF)==PT_BHOL) return 1; + if(pt==PT_SPRK)//spark shouldn't move + return 0; + if (pt==PT_PHOT&&( (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || @@ -1135,7 +1138,7 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { - int i, j, x, y, t, nx, ny, r, surround_space, s, lt, rt, nt, nnx, nny, q, golnum, goldelete, z, neighbors; + int i, j, x, y, t, nx, ny, r, surround_space, s, lt, rt, nt, nnx, nny, q, golnum, goldelete, z, neighbors, createdsomething; float mv, dx, dy, ix, iy, lx, ly, nrx, nry, dp, ctemph, ctempl; int fin_x, fin_y, clear_x, clear_y; float fin_xf, fin_yf, clear_xf, clear_yf; @@ -1342,14 +1345,14 @@ void update_particles_i(pixel *vid, int start, int inc) if(neighbors==0 || !(ptypes[r&0xFF].properties&PROP_LIFE || !r&0xFF) || (r>>8)>=NPART) continue; for ( golnum = 1; golnum<=NGOL; golnum++) - for ( goldelete = 0; goldelete<9; goldelete++) { - if (neighbors==goldelete&&gol[nx][ny]==0&&grule[golnum][goldelete]>=2&&gol2[nx][ny][golnum]>=(goldelete%2)+goldelete/2) + goldelete = neighbors; + if (gol[nx][ny]==0&&grule[golnum][goldelete]>=2&&gol2[nx][ny][golnum]>=(goldelete%2)+goldelete/2) { if (create_part(-1,nx,ny,goltype[golnum-1])) createdsomething = 1; } - else if (neighbors-1==goldelete&&gol[nx][ny]==golnum&&(grule[golnum][goldelete]==0||grule[golnum][goldelete]==2))//subtract 1 because it counted itself + else if (gol[nx][ny]==golnum&&(grule[golnum][goldelete-1]==0||grule[golnum][goldelete-1]==2))//subtract 1 because it counted itself { if(parts[r>>8].tmp==grule[golnum][9]-1) parts[r>>8].tmp --; @@ -2763,7 +2766,7 @@ int flood_parts(int x, int y, int c, int cm, int bm) bm = 0; } - if (((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm )||( (sdl_mod & (KMOD_CAPS)) && cm!=SLALT)) + if (((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm )||( (sdl_mod & (KMOD_CAPS)) && cm!=SLALT && !(cm==PT_INST&&co==PT_SPRK))) return 1; // go left as far as possible @@ -2788,7 +2791,12 @@ int flood_parts(int x, int y, int c, int cm, int bm) // fill span for (x=x1; x<=x2; x++) { - if (!create_parts(x, y, 0, 0, co)) + if(cm==PT_INST&&co==PT_SPRK) + { + if(create_part(-1,x, y, co)==-1) + return 0; + } + else if (!create_parts(x, y, 0, 0, co)) return 0; } // fill children @@ -2865,9 +2873,7 @@ int create_parts(int x, int y, int rx, int ry, int c) dw = 1; } if (c == PT_WIND) - { return 1; - } if (dw==1) { rx = rx/CELL; @@ -2939,10 +2945,14 @@ int create_parts(int x, int y, int rx, int ry, int c) for (j=-ry; j<=ry; j++) for (i=-rx; i<=rx; i++) if ((CURRENT_BRUSH==CIRCLE_BRUSH && (pow(i,2))/(pow(rx,2))+(pow(j,2))/(pow(ry,2))<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) + { + if( x+i<0 || y+j<0 || x+i>=XRES || y+j>=YRES) + continue; if (!REPLACE_MODE) create_part(-2, x+i, y+j, c); else if ((pmap[y+j][x+i]&0xFF)==SLALT&&SLALT!=0) create_part(-2, x+i, y+j, c); + } return 1; } @@ -2981,6 +2991,8 @@ int create_parts(int x, int y, int rx, int ry, int c) for (i=-rx; i<=rx; i++) if ((CURRENT_BRUSH==CIRCLE_BRUSH && (pow(i,2))/(pow(rx,2))+(pow(j,2))/(pow(ry,2))<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) { + if( x+i<0 || y+j<0 || x+i>=XRES || y+j>=YRES) + continue; if ((pmap[y+j][x+i]&0xFF)!=SLALT&&SLALT!=0) continue; if ((pmap[y+j][x+i])) |
