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 random
import time
import utils
# 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)<amount):
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 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 <type> at <x>,<y>
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 <type>
to <life>(set <type> to -1 for all)
tpt.set_type(type1,type2) sets the type of all particles with type <type1>
to <type2>(set <type1> to -1 for all)
tpt.set_temp(type,temp) sets the temp of all particles with type <type>
to <temp>(set <type> to -1 for all)
tpt.set_tmp(type,tmp) sets the tmp of all particles with type <type>
to <tmp>(set <type> to -1 for all)
tpt.set_x(type,x) sets the x of all particles with type <type>
to <x>(set <type> to -1 for all)
tpt.set_y(type,y) sets the y of all particles with type <type>
to <y>(set <type> to -1 for all)
tpt.set_vx(type,vx) sets the vx of all particles with type <type>
to <vx>(set <type> to -1 for all)
tpt.set_vy(type,vy) sets the vy of all particles with type <type>
to <vy>(set <type> to -1 for all)
tpt.set_ctype(type,ctype) sets the ctype of all particles with type
<type> to <ctype>(set <type> to -1 for all)
tpt.pause() pause the game(note that closing the console
create(x,y,type) create a particle of type <type> at <x>,<y>
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)
tpt.unpause() unpause the game(note that closing the console
unpause() unpause the game(note that closing the console
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)
tpt.close_console() closes the console and pauses the game
tpt.open_console() opens the console
tpt.toggle_console() toggles the console
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.
@ -43,5 +42,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
you must run the "getheader.py" script to get the correct linking options, add these options to the makefile

View File

@ -1,5 +1,6 @@
import sys
import os.path
import compileall
path=os.path.join(sys.exec_prefix,"include","python%s"%sys.version[:3])
#print "headers at ",repr(path)
#-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]
print "\n windows args are"
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 pyconsole
#define IMGCONNS 3
#define TIMEOUT 100
#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;
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;
@ -3864,10 +3866,15 @@ 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));
@ -3880,6 +3887,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
@ -3907,9 +3915,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

View File

@ -24,6 +24,8 @@
*/
#include "Python.h"
#include "pyconsole.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -1189,12 +1191,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 +1344,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 +1362,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 +1370,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 +1404,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 +1412,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 +1444,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 +1452,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 +1484,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 +1492,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 +1525,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 +1533,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 +1565,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 +1573,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 +1608,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 +1616,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 +1648,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 +1656,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 +1688,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 +1696,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}
};
@ -1639,11 +1830,13 @@ int main(int argc, char *argv[])
PyRun_SimpleString("import sys\nsys.path.append('.')");
PyRun_SimpleString("print 'python present.'");
//load the console module and whatnot
pname=PyString_FromString("tpt_console");//create string object
pmodule = PyImport_Import(pname);//import module
//pname=PyString_FromString("tpt_console");//create string object
//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)
{
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
if(pfunc && PyCallable_Check(pfunc))//check if it's really a function
{
@ -2885,9 +3078,7 @@ int main(int argc, char *argv[])
}
}
else
{
create_line(lx, ly, x, y, bsx, bsy, c);
}
lx = x;
ly = y;
}
@ -2912,7 +3103,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);

View File

@ -1138,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;
@ -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)
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 --;
@ -2873,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;

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)