Python console changes

This commit is contained in:
Simon 2011-03-04 11:14:34 +00:00
commit 30462ec28d
9 changed files with 458 additions and 125 deletions

View File

@ -1,10 +1,21 @@
import tpt import utils
import random
import time
# example script # example script
def noise(typ,amount=50): def noise(typ,amount=50):
for xx in range(284,316): for xx in range(4,612):
for yy in range(184,216): for yy in range(4,384):
if(random.randrange(0,100)<amount): if(random.randrange(0,100)<amount):
tpt.create(xx,yy,typ) tpt.create(xx,yy,typ)
def increment(amount=1):
for xx in range(4,612):
for yy in range(4,384):
i = tpt.get_pmap(xx,yy)>>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)

View File

@ -2,37 +2,36 @@
the console in this version is a python console and will execute any command you enter. 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. the api for interacting with the powder toy is contained in the tpt module and is already imported at startup.
currently implemented api functions: currently implemented api functions:
tpt.create(x,y,type) create a particle of type <type> at <x>,<y> create(x,y,type) create a particle of type <type> at <x>,<y>
tpt.reset_velocity() resets all velocity reset_velocity() resets all velocity
tpt.reset_pressure() resets all pressure reset_pressure() resets all pressure
tpt.reset_sparks() resets all sparks reset_sparks() resets all sparks
tpt.set_life(type,life) sets the life of all particles with type <type>
to <life>(set <type> to -1 for all) ### USING SET COMMANDS ###
tpt.set_type(type1,type2) sets the type of all particles with type <type1> the console uses keywords to identify variables of what to set, you can specify x and y coords with x=100 y=100, ect.
to <type2>(set <type1> to -1 for all) i is the particle number
tpt.set_temp(type,temp) sets the temp of all particles with type <type> name will change all of name's type to the setto variable. It needs to be a string "dust" ect, "all" for all.
to <temp>(set <type> to -1 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.
tpt.set_tmp(type,tmp) sets the tmp of all particles with type <type> you need to set the to* variable and one location/name/coords for it to work.
to <tmp>(set <type> to -1 for all) set_type(x=,y=,i=,name="",setto="")
tpt.set_x(type,x) sets the x of all particles with type <type> set_life()
to <x>(set <type> to -1 for all) set_temp()
tpt.set_y(type,y) sets the y of all particles with type <type> set_tmp()
to <y>(set <type> to -1 for all) set_x()
tpt.set_vx(type,vx) sets the vx of all particles with type <type> set_y()
to <vx>(set <type> to -1 for all) set_vx()
tpt.set_vy(type,vy) sets the vy of all particles with type <type> set_vy()
to <vy>(set <type> to -1 for all) set_ctype()
tpt.set_ctype(type,ctype) sets the ctype of all particles with type
<type> to <ctype>(set <type> to -1 for all) pause() pause the game(note that closing the console
tpt.pause() pause the game(note that closing the console
pauses the game) pauses the game)
tpt.unpause() unpause the game(note that closing the console unpause() unpause the game(note that closing the console
pauses the game) pauses the game)
tpt.toggle_pause() toggle pause(note that closing the console toggle_pause() toggle pause(note that closing the console
pauses the game) pauses the game)
tpt.close_console() closes the console and pauses the game close_console() closes the console and pauses the game
tpt.open_console() opens the console open_console() opens the console
tpt.toggle_console() toggles the console toggle_console() toggles the console
NOTE: these functions don't do bounds checking, which means that they CAN AND NOTE: these functions don't do bounds checking, which means that they CAN AND
WILL CRASH the powder toy. be carefull. WILL CRASH the powder toy. be carefull.
@ -43,5 +42,4 @@ tpt.set_life(32,life) you can do tpt.set_life(element['uran'],life)
### COMPILING ### ### COMPILING ###
before you compile you should have python 2.x installed. before you compile you should have python 2.x installed.
you must run the "getheader.py" script to get the correct linking options, add you must run the "getheader.py" script to get the correct linking options, add these options to the makefile
these options to the makefile

View File

@ -1,5 +1,6 @@
import sys import sys
import os.path import os.path
import compileall
path=os.path.join(sys.exec_prefix,"include","python%s"%sys.version[:3]) path=os.path.join(sys.exec_prefix,"include","python%s"%sys.version[:3])
#print "headers at ",repr(path) #print "headers at ",repr(path)
#-lpython2.3 -lm -L/usr/lib/python2.3/config #-lpython2.3 -lm -L/usr/lib/python2.3/config
@ -11,3 +12,26 @@ path=os.path.join(sys.exec_prefix,"include")
args="-lpython%s -lm -L%s"%(sys.version[:3],os.path.join(sys.exec_prefix,"lib","config"))#,"python%s"%sys.version[:3] args="-lpython%s -lm -L%s"%(sys.version[:3],os.path.join(sys.exec_prefix,"lib","config"))#,"python%s"%sys.version[:3]
print "\n windows args are" print "\n windows args are"
print args,"-I%s"%path print args,"-I%s"%path
#unsigned char tpt_console_pyc[] = { 0x1B, 0x57};
lst=[]
compileall.compile_dir("./src/python", force=1)
print "\n\n\ngenerating pyconsole.h"
fname="./src/python/tpt_console.pyc"
try:
fid=open(fname,"r")
except IOError:
fname="./src/python/tpt_console.pyo"
finally:
fid.close()
with open(fname,"r") as fid:
for char in fid.read():
lst.append(hex(ord(char)))
tmp=",".join(lst)
out=''.join(["#include <Python.h>\nunsigned char tpt_console_pyc[] = {",tmp,"};"])
with open("./includes/pyconsole.h","w") as fid:
fid.write(out)
print "done"

View File

@ -16,6 +16,8 @@
#define THUMB_CACHE_SIZE 256 #define THUMB_CACHE_SIZE 256
//#define pyconsole
#define IMGCONNS 3 #define IMGCONNS 3
#define TIMEOUT 100 #define TIMEOUT 100
#define HTTP_TIMEOUT 10 #define HTTP_TIMEOUT 10

2
includes/pyconsole.h Normal file

File diff suppressed because one or more lines are too long

View File

@ -3847,10 +3847,12 @@ struct command_history {
}; };
typedef struct command_history command_history; typedef struct command_history command_history;
command_history *last_command = NULL; command_history *last_command = NULL;
command_history *last_command2 = NULL;
char *console_ui(pixel *vid_buf,char error[255],char console_more) { char *console_ui(pixel *vid_buf,char error[255],char console_more) {
int mx,my,b,cc,ci = -1; int mx,my,b,cc,ci = -1;
pixel *old_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); pixel *old_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE);
command_history *currentcommand; command_history *currentcommand;
command_history *currentcommand2;
ui_edit ed; ui_edit ed;
ed.x = 15; ed.x = 15;
ed.y = 207; ed.y = 207;
@ -3864,10 +3866,15 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) {
ed.cursor = 0; ed.cursor = 0;
//fillrect(vid_buf, -1, -1, XRES, 220, 0, 0, 0, 190); //fillrect(vid_buf, -1, -1, XRES, 220, 0, 0, 0, 190);
memcpy(old_buf,vid_buf,(XRES+BARSIZE)*YRES*PIXELSIZE); 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); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
cc = 0; cc = 0;
while(cc < 80){ while(cc < 80){
fillrect(old_buf, -1, -1+cc, XRES+BARSIZE, 2, 0, 0, 0, 160-(cc*2)); fillrect(old_buf, -1, -1+cc, XRES+BARSIZE, 2, 0, 0, 0, 160-(cc*2));
@ -3880,6 +3887,7 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) {
my /= sdl_scale; my /= sdl_scale;
ed.focus = 1; 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); memcpy(vid_buf,old_buf,(XRES+BARSIZE)*YRES*PIXELSIZE);
draw_line(vid_buf, 0, 219, XRES+BARSIZE-1, 219, 228, 228, 228, XRES+BARSIZE); 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 drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64, python by Doxin)" //TODO: help command
@ -3907,9 +3915,31 @@ char *console_ui(pixel *vid_buf,char error[255],char console_more) {
break; 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') //if(error && ed.str[0]=='\0')
drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200); //drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200);
if(console_more==0) if(console_more==0)
drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240); drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240);
else else

View File

@ -24,6 +24,8 @@
*/ */
#include "Python.h" #include "Python.h"
#include "pyconsole.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -1189,12 +1191,16 @@ char console_error[255] = "";
//functions callable from python: //functions callable from python:
static PyObject* static PyObject*
emb_create(PyObject *self, PyObject *args) emb_create(PyObject *self, PyObject *args, PyObject *keywds)
{ {
int x,y,t; 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; return NULL;
// //
if(strcmp(name,"")!=0)
console_parse_type(name, &t, console_error);
return Py_BuildValue("i",create_part(-1,x,y,t)); return Py_BuildValue("i",create_part(-1,x,y,t));
} }
//sys_pause = !sys_pause //sys_pause = !sys_pause
@ -1338,13 +1344,17 @@ emb_reset_sparks(PyObject *self, PyObject *args)
return Py_BuildValue("i",1); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_life",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1352,7 +1362,7 @@ emb_set_life(PyObject *self, PyObject *args)
parts[i].life = life; parts[i].life = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1360,16 +1370,33 @@ emb_set_life(PyObject *self, PyObject *args)
parts[i].life = life; 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); 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; int i = -1,life,j=-1,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_type",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1377,7 +1404,7 @@ emb_set_type(PyObject *self, PyObject *args)
parts[i].type = life; parts[i].type = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1385,16 +1412,31 @@ emb_set_type(PyObject *self, PyObject *args)
parts[i].type = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_temp",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1402,7 +1444,7 @@ emb_set_temp(PyObject *self, PyObject *args)
parts[i].temp = life; parts[i].temp = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1410,16 +1452,31 @@ emb_set_temp(PyObject *self, PyObject *args)
parts[i].temp = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_tmp",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1427,7 +1484,7 @@ emb_set_tmp(PyObject *self, PyObject *args)
parts[i].tmp = life; parts[i].tmp = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1435,16 +1492,32 @@ emb_set_tmp(PyObject *self, PyObject *args)
parts[i].tmp = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_x",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1452,7 +1525,7 @@ emb_set_x(PyObject *self, PyObject *args)
parts[i].x = life; parts[i].x = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1460,16 +1533,31 @@ emb_set_x(PyObject *self, PyObject *args)
parts[i].x = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_y",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1477,7 +1565,7 @@ emb_set_y(PyObject *self, PyObject *args)
parts[i].y = life; parts[i].y = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1485,16 +1573,34 @@ emb_set_y(PyObject *self, PyObject *args)
parts[i].y = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_ctype",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1502,7 +1608,7 @@ emb_set_ctype(PyObject *self, PyObject *args)
parts[i].ctype = life; parts[i].ctype = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1510,16 +1616,31 @@ emb_set_ctype(PyObject *self, PyObject *args)
parts[i].ctype = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_vx",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1527,7 +1648,7 @@ emb_set_vx(PyObject *self, PyObject *args)
parts[i].vx = life; parts[i].vx = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1535,16 +1656,31 @@ emb_set_vx(PyObject *self, PyObject *args)
parts[i].vx = life; 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); 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; int i = -1,life,j,x=-1,y=-1;
if(!PyArg_ParseTuple(args, "II:set_vy",&j,&life)) 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; 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++) for(i=0; i<NPART; i++)
{ {
@ -1552,7 +1688,7 @@ emb_set_vy(PyObject *self, PyObject *args)
parts[i].vy = life; parts[i].vy = life;
} }
} }
else else if(console_parse_type(name, &j, console_error))
{ {
for(i=0; i<NPART; i++) for(i=0; i<NPART; i++)
{ {
@ -1560,32 +1696,87 @@ emb_set_vy(PyObject *self, PyObject *args)
parts[i].vy = life; 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); 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! static PyMethodDef EmbMethods[] = { //WARNING! don't forget to register your function here!
{"create", emb_create, METH_VARARGS,"create a particle."}, {"create", emb_create, METH_VARARGS|METH_KEYWORDS, "create a particle."},
{"log", emb_log, METH_VARARGS,"logs an error string to the console."}, {"log", emb_log, METH_VARARGS, "logs an error string to the console."},
{"reset_pressure", emb_reset_pressure, METH_VARARGS,"resets all the pressure."}, {"reset_pressure", emb_reset_pressure, METH_VARARGS, "resets all the pressure."},
{"reset_velocity", emb_reset_velocity, METH_VARARGS,"resets all the velocity."}, {"reset_velocity", emb_reset_velocity, METH_VARARGS, "resets all the velocity."},
{"reset_sparks", emb_reset_sparks, METH_VARARGS,"resets all the sparks."}, {"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_life", emb_set_life, METH_VARARGS|METH_KEYWORDS, "sets life of a specified particle."},
{"set_type", emb_set_type, METH_VARARGS,"sets type 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,"sets temp 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,"sets tmp 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,"sets x 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,"sets y 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,"sets ctype 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,"sets vx 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,"sets vy 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."}, {"pause", emb_pause, METH_VARARGS, "pause the game."},
{"unpause", emb_unpause, METH_VARARGS,"unpause the game."}, {"unpause", emb_unpause, METH_VARARGS, "unpause the game."},
{"toggle_pause", emb_toggle_pause, METH_VARARGS,"toggle game pause."}, {"toggle_pause", emb_toggle_pause, METH_VARARGS, "toggle game pause."},
{"open_console", emb_open_console, METH_VARARGS,"open the game console."}, {"open_console", emb_open_console, METH_VARARGS, "open the game console."},
{"close_console", emb_close_console, METH_VARARGS,"close 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."}, {"toggle_console", emb_toggle_console, METH_VARARGS, "toggle the game console."},
{"console_more", emb_console_more, METH_VARARGS,"turns the more indicator on."}, {"console_more", emb_console_more, METH_VARARGS, "turns the more indicator on."},
{"console_less", emb_console_less, METH_VARARGS,"turns the more indicator off."}, {"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} {NULL, NULL, 0, NULL}
}; };
@ -1639,11 +1830,13 @@ int main(int argc, char *argv[])
PyRun_SimpleString("import sys\nsys.path.append('.')"); PyRun_SimpleString("import sys\nsys.path.append('.')");
PyRun_SimpleString("print 'python present.'"); PyRun_SimpleString("print 'python present.'");
//load the console module and whatnot //load the console module and whatnot
pname=PyString_FromString("tpt_console");//create string object //pname=PyString_FromString("tpt_console");//create string object
pmodule = PyImport_Import(pname);//import module //pmodule = PyImport_Import(pname);//import module
PyObject *tpt_console_obj = PyMarshal_ReadObjectFromString(tpt_console_pyc+8, sizeof(tpt_console_pyc)-8);
pmodule=PyImport_ExecCodeModule("tpt_console", tpt_console_obj);
if(pmodule!=NULL) if(pmodule!=NULL)
{ {
Py_DECREF(pname);//throw away the string object //Py_DECREF(pname);//throw away the string object
pfunc=PyObject_GetAttrString(pmodule,"handle");//get the handler function pfunc=PyObject_GetAttrString(pmodule,"handle");//get the handler function
if(pfunc && PyCallable_Check(pfunc))//check if it's really a function if(pfunc && PyCallable_Check(pfunc))//check if it's really a function
{ {
@ -2885,9 +3078,7 @@ int main(int argc, char *argv[])
} }
} }
else else
{
create_line(lx, ly, x, y, bsx, bsy, c); create_line(lx, ly, x, y, bsx, bsy, c);
}
lx = x; lx = x;
ly = y; ly = y;
} }
@ -2912,7 +3103,7 @@ int main(int argc, char *argv[])
{ {
if (sdl_mod & (KMOD_CAPS)) if (sdl_mod & (KMOD_CAPS))
c = 0; 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); flood_parts(x, y, c, -1, -1);
if (c==SPC_HEAT || c==SPC_COOL) if (c==SPC_HEAT || c==SPC_COOL)
create_parts(x, y, bsx, bsy, c); create_parts(x, y, bsx, bsy, c);

View File

@ -1138,7 +1138,7 @@ int nearest_part(int ci, int t)
void update_particles_i(pixel *vid, int start, int inc) 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; float mv, dx, dy, ix, iy, lx, ly, nrx, nry, dp, ctemph, ctempl;
int fin_x, fin_y, clear_x, clear_y; int fin_x, fin_y, clear_x, clear_y;
float fin_xf, fin_yf, clear_xf, clear_yf; float fin_xf, fin_yf, clear_xf, clear_yf;
@ -1345,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) if(neighbors==0 || !(ptypes[r&0xFF].properties&PROP_LIFE || !r&0xFF) || (r>>8)>=NPART)
continue; continue;
for ( golnum = 1; golnum<=NGOL; golnum++) 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])) if (create_part(-1,nx,ny,goltype[golnum-1]))
createdsomething = 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) if(parts[r>>8].tmp==grule[golnum][9]-1)
parts[r>>8].tmp --; parts[r>>8].tmp --;
@ -2873,9 +2873,7 @@ int create_parts(int x, int y, int rx, int ry, int c)
dw = 1; dw = 1;
} }
if (c == PT_WIND) if (c == PT_WIND)
{
return 1; return 1;
}
if (dw==1) if (dw==1)
{ {
rx = rx/CELL; rx = rx/CELL;

77
src/python/tpt_console.py Normal file
View File

@ -0,0 +1,77 @@
import tpt
from tpt import *
from utils import *
import sys
import code
import ctypes
import traceback
#print "console module loaded."
#redirect stdout like this:
class logger:
def write(self,txt):
txt=txt.strip().split("\n")[-1]
repr(txt)
tpt.log(txt)
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,
"snow":16,"wood":17,"neut":18,"plut":19,"plnt":20,"acid":21,"void":22,
"wtrv":23,"cnct":24,"dstw":25,"salt":26,"sltw":27,"dmnd":28,"bmtl":29,
"brmt":30,"phot":31,"uran":32,"wax":33,"mwax":34,"pscn":35,"nscn":36,
"lntg":37,"insl":38,"bhol":39,"whol":40,"rbdm":41,"lrbd":42,"ntct":43,
"sand":44,"glas":45,"ptct":46,"bgla":47,"thdr":48,"plsm":49,"etrd":50,
"nice":51,"nble":52,"btry":53,"lcry":54,"stkm":55,"swch":56,"smke":57,
"desl":58,"coal":59,"lo2":60,"o2":61,"inwr":62,"yest":63,"dyst":64,
"thrm":65,"glow":66,"brck":67,"hflm":68,"firw":69,"fuse":70,"fsep":71,
"amtr":72,"bcol":73,"pcln":74,"hswc":75,"iron":76,"mort":77,"gol":78,
"hlif":79,"asim":80,"2x2":81,"dani":82,"amoe":83,"move":84,"pgol":85,
"dmoe":86,"34":87,"llif":88,"stan":89,"spng":90,"rime":91,"fog":92,
"bcln":93,"love":94,"deut":95,"warp":96,"pump":97,"fwrk":98,"pipe":99,
"frzz":100,"frzw":101,"grav":102,"bizr":103,"bizrg":104,"bizrs":105,
"inst":106,"isoz":107,"iszs":108,"prti":109,"prto":110,"pste":111,
"psts":112,"anar":113,"vine":114,"invis":115,"equalvel":116,"spawn2":117,
"spawn":118,"shld1":119,"shld2":120,"shld3":121,"shld4":122,"lolz":123,
"wifi":124,"filt":125,"aray":126,"bray":127,"stkm2":128,"bomb":129,
"c5":130,"sing":131,"qrtz":132,"pqrt":133,"seed":134,"maze":135,
"coag":136,"wall":137,"gnar":138,"repl":139,"myst":140,"boyl":141,
"lote":142,"frg2":143,"star":144,"frog":145,"bran":146,"wind":147,
"num":148}
def fork_unblock():
pass#i need to implement this some day.
def error(ex):
err=traceback.format_exc()
sys.stdout.write(err)
def clean():
#add any functions that must be reachable here.
"""copy=["__builtins__","__name__","__doc__","__package__",'tpt','clean',
'element','fork','_fork','fork_status','fork_unblock','sys']
handle.glob={}
for item in copy:
handle.glob[item]=globals()[item]"""
handle.glob=globals()
handle.buf=""
def handle(txt):
try:
a=handle.glob
except:
clean()
try:
_handle(txt)
except Exception as ex:
error(ex)
def _handle(txt):
#print "handling '%s'"%txt
try:
sys.stdout.write(repr(eval(txt,handle.glob)))
except:
try:
exec txt in handle.glob
except Exception as ex:
error(ex)