diff --git a/build/example.py b/build/example.py index 3bde517bd..6b0b7c1f7 100644 --- a/build/example.py +++ b/build/example.py @@ -4,7 +4,20 @@ import time # example script def noise(typ,amount=50): - for xx in range(284,316): - for yy in range(184,216): + for xx in range(4,612): + for yy in range(4,384): if(random.randrange(0,100)>8 + t = tpt.get_prop(i,"type")+amount + if t>=148: + t=t-148 + if t==128: + t=129 + if t==55: + t=56 + tpt.set_type(i=i,settoint=t) diff --git a/build/tpt_console.py b/build/tpt_console.py index e6ecbe485..ab427e355 100644 --- a/build/tpt_console.py +++ b/build/tpt_console.py @@ -1,4 +1,5 @@ import tpt +from tpt import * import sys import code import ctypes @@ -8,10 +9,11 @@ print "console module loaded." #redirect stdout like this: class logger: def write(self,txt): - txt=txt.split("\n")[-1][:254] + txt=txt.strip().split("\n")[-1] + repr(txt) tpt.log(txt) -#sys.stdout=logger() -#sys.stderr=logger() +sys.stdout=logger() +sys.stderr=logger() element={"none":0,"dust":1,"watr":2,"oil":3,"fire":4,"stne":5,"lava":6,"gunp":7, "nitr":8,"clne":9,"gas":10,"plex":11,"goo":12,"icei":13,"metl":14,"sprk":15, @@ -95,12 +97,9 @@ def handle(txt): def _handle(txt): #print "handling '%s'"%txt try: - sys.stdout.write(repr(eval(tmp,handle.glob))) + sys.stdout.write(repr(eval(txt,handle.glob))) except: try: exec txt in handle.glob except Exception as ex: error(ex) - - - \ No newline at end of file diff --git a/console_README b/console_README index c989987b1..bd85e824a 100644 --- a/console_README +++ b/console_README @@ -2,37 +2,36 @@ the console in this version is a python console and will execute any command you enter. the api for interacting with the powder toy is contained in the tpt module and is already imported at startup. currently implemented api functions: - tpt.create(x,y,type) create a particle of type at , - tpt.reset_velocity() resets all velocity - tpt.reset_pressure() resets all pressure - tpt.reset_sparks() resets all sparks - tpt.set_life(type,life) sets the life of all particles with type - to (set to -1 for all) - tpt.set_type(type1,type2) sets the type of all particles with type - to (set to -1 for all) - tpt.set_temp(type,temp) sets the temp of all particles with type - to (set to -1 for all) - tpt.set_tmp(type,tmp) sets the tmp of all particles with type - to (set to -1 for all) - tpt.set_x(type,x) sets the x of all particles with type - to (set to -1 for all) - tpt.set_y(type,y) sets the y of all particles with type - to (set to -1 for all) - tpt.set_vx(type,vx) sets the vx of all particles with type - to (set to -1 for all) - tpt.set_vy(type,vy) sets the vy of all particles with type - to (set to -1 for all) - tpt.set_ctype(type,ctype) sets the ctype of all particles with type - to (set to -1 for all) - tpt.pause() pause the game(note that closing the console - pauses the game) - tpt.unpause() unpause the game(note that closing the console - pauses the game) - tpt.toggle_pause() toggle pause(note that closing the console - pauses the game) - tpt.close_console() closes the console and pauses the game - tpt.open_console() opens the console - tpt.toggle_console() toggles the console + create(x,y,type) create a particle of type at , + reset_velocity() resets all velocity + reset_pressure() resets all pressure + reset_sparks() resets all sparks + +### USING SET COMMANDS ### +the console uses keywords to identify variables of what to set, you can specify x and y coords with x=100 y=100, ect. +i is the particle number +name will change all of name's type to the setto variable. It needs to be a string "dust" ect, "all" for all. +the setto is what the particle(s) will be set to, it is a string for the type/ctype commands, and an int for the rest. +you need to set the to* variable and one location/name/coords for it to work. + set_type(x=,y=,i=,name="",setto="") + set_life() + set_temp() + set_tmp() + set_x() + set_y() + set_vx() + set_vy() + set_ctype() + + pause() pause the game(note that closing the console + pauses the game) + unpause() unpause the game(note that closing the console + pauses the game) + toggle_pause() toggle pause(note that closing the console + pauses the game) + close_console() closes the console and pauses the game + open_console() opens the console + toggle_console() toggles the console NOTE: these functions don't do bounds checking, which means that they CAN AND WILL CRASH the powder toy. be carefull. @@ -44,4 +43,4 @@ tpt.set_life(32,life) you can do tpt.set_life(element['uran'],life) ### COMPILING ### before you compile you should have python 2.x installed. you must run the "getheader.py" script to get the correct linking options, add -these options to the makefile \ No newline at end of file +these options to the makefile diff --git a/src/interface.c b/src/interface.c index f529d54ac..d453a107b 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; } diff --git a/src/main.c b/src/main.c index 005fc656a..e333830f6 100644 --- a/src/main.c +++ b/src/main.c @@ -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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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=0 && x=0 && y>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 55c12337e..e15565b7a 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]))