Merge pull request #66 from jacob1/Modstuff

Code structure improvements for graphics/drawing, improvements to prevent accidental infinite loops in Lua, Fixes for fusion, improvements for VOID types. And other minor improvements
This commit is contained in:
Simon Robertshaw 2012-05-24 11:53:50 -07:00
commit 8196d2a645
20 changed files with 435 additions and 292 deletions

2
.gitignore vendored
View File

@ -16,4 +16,4 @@ src/python/stdlib/*
*.srv *.srv
*.bat *.bat
*.o *.o
*.me *.me

59
README
View File

@ -102,7 +102,60 @@ scripts - enable scripts to be run from old console
History: History:
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
* Version 74.1
* Version 79.2 Beta Build 167
o Fix minor spelling errors
o Fix crash when using flood-fill or a lot of INST
o Fix an issue that made it impossible to change the Windows size from the options screen
* Version 79.1 Beta Build 166
o Prevent changing of Window size if the screen is too small.
o Fix bug that caused pressure to leak from TTAN when pausing/framestepping
o Fix crash when opening display options
* Version 79.0 Beta Build 165
o Fix Titanium only conducting once
o Better colour options preview.
* Version 79.0 Beta Build 164
o Fix a problem with GPMP that caused gravity to depend on air pressure
o Fix TNT sometimes not exploding if multiple TNT particles are in the same place
o Fix PUMP not generating negative pressure if it is next to a wall
o New element: titanium (in the solids menu), which completely blocks air and absorbs some neutrons
* Version 78.1 Build 163
o Fix bug that created "weaponised explosive GEL"
o Changes to License (GPLv2 to GPLv3)
o Fix bug that caused thumbnail caching to not work
o Remove unused debug output of thumbnail cache
o Plasma can now travel through portals and PIPE
o Fix file opening on Mac OS X
* Version 78.0 Beta Build 162
o Fixes when moving signs
o Line snapping in the decoration editor
o Changes to SING to prevent it from exploding through walls
o Save soap bubbles
o Changes to GEL, will no longer absorb water when saturated
o FILT not heated by photons with ambient heat on
o New save format: OPS, allows saving of almost all data within the simulation
* Version 77.0 Build 159
o tmp2 support for old console
o save tmp2 for TRON
* Version 76.0 Build 158
o GEL won't try to move solids anymore
* Version 76.0 Build 157
o Fixes for GEL and TRON
o Fix sponge bug
* Version 76.0 Beta Build 156
o New element: TRON
* Version 75.0 Beta Build 155
o New element: GEL
* Version 74.2 Build 154
o Walls don't trigger automatic pipe pattern generation
o BCOL uses COAL's graphics function
o Report icon
o Fix unmeltable ice
* Version 74.1 Build 152
o Fix ice with ctype of 0
* Version 74.1 Build 151
o BRAY glows in fancy display mode
* Version 74.1 Build 150
o Icon for Force Elements o Icon for Force Elements
o Allow DEST to be used with clone elements. o Allow DEST to be used with clone elements.
* Version 74.0 * Version 74.0
@ -146,8 +199,6 @@ History:
* Version 70.0 * Version 70.0
o New element: ignition cord o New element: ignition cord
o Stickmen and fighter fixes o Stickmen and fighter fixes
o Fixed WIRE graphics
o New elements: ACEL and DCEL, accelerate nearby photons
* Version 69.1 * Version 69.1
o New Lua API features, ability to edit particle properties from tpt.el... array, particles are exposed as an array now o New Lua API features, ability to edit particle properties from tpt.el... array, particles are exposed as an array now
* Version 69.0 * Version 69.0
@ -168,7 +219,7 @@ History:
o Correct icons in render_ui o Correct icons in render_ui
o Add back portal effects o Add back portal effects
* Version 68.5 * Version 68.5
o fix decorations o Fix decorations
* Version 68.4 * Version 68.4
o Stamp browser fixes o Stamp browser fixes
o Remove some stuff from HUD to make it fit o Remove some stuff from HUD to make it fit

View File

@ -189,14 +189,7 @@ extern int ngrav_enable;
int limitFPS; int limitFPS;
int water_equal_test; int water_equal_test;
extern int quickoptions_tooltip_fade; extern int quickoptions_tooltip_fade;
extern int loop_time;
extern int debug_flags;
#define DEBUG_PERF_FRAMECOUNT 256
extern int debug_perf_istart;
extern int debug_perf_iend;
extern long debug_perf_frametime[DEBUG_PERF_FRAMECOUNT];
extern long debug_perf_partitime[DEBUG_PERF_FRAMECOUNT];
extern long debug_perf_time;
extern int debug_flags; extern int debug_flags;
#define DEBUG_PERF_FRAMECOUNT 256 #define DEBUG_PERF_FRAMECOUNT 256

View File

@ -195,6 +195,10 @@ void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b,
void render_parts(pixel *vid); void render_parts(pixel *vid);
void render_before(pixel *part_vbuf);
void render_after(pixel *part_vbuf, pixel *vid_buf);
#ifdef OGLR #ifdef OGLR
void draw_parts_fbo(); void draw_parts_fbo();
#endif #endif

View File

@ -40,7 +40,7 @@
#define LUACON_EL_MODIFIED_GRAPHICS 0x2 #define LUACON_EL_MODIFIED_GRAPHICS 0x2
#define LUACON_EL_MODIFIED_MENUS 0x4 #define LUACON_EL_MODIFIED_MENUS 0x4
int *lua_el_func, *lua_el_mode; int *lua_el_func, *lua_el_mode, *lua_gr_func;
void luacon_open(); void luacon_open();
int luacon_step(int mx, int my, int selectl, int selectr); int luacon_step(int mx, int my, int selectl, int selectr);
@ -48,6 +48,7 @@ int luacon_mouseevent(int mx, int my, int mb, int event);
int luacon_keyevent(int key, int modifier, int event); int luacon_keyevent(int key, int modifier, int event);
int luacon_eval(char *command); int luacon_eval(char *command);
int luacon_part_update(int t, int i, int x, int y, int surround_space, int nt); int luacon_part_update(int t, int i, int x, int y, int surround_space, int nt);
int luacon_graphics_update(int t, int i, int *pixel_mode, int *cola, int *colr, int *colg, int *colb, int *firea, int *firer, int *fireg, int *fireb);
char *luacon_geterror(); char *luacon_geterror();
void luacon_close(); void luacon_close();
int luacon_partsread(lua_State* l); int luacon_partsread(lua_State* l);
@ -62,6 +63,7 @@ int luacon_particle_getproperty(char * key, int * format);
int luacon_transition_getproperty(char * key, int * format); int luacon_transition_getproperty(char * key, int * format);
int luacon_element_getproperty(char * key, int * format, unsigned int * modified_stuff); int luacon_element_getproperty(char * key, int * format, unsigned int * modified_stuff);
int process_command_lua(pixel *vid_buf, char *console, char *console_error); int process_command_lua(pixel *vid_buf, char *console, char *console_error);
void lua_hook(lua_State *L, lua_Debug *ar);
int getPartIndex_curIdx; int getPartIndex_curIdx;
@ -69,6 +71,7 @@ int getPartIndex_curIdx;
int luatpt_test(lua_State* l); int luatpt_test(lua_State* l);
int luatpt_getelement(lua_State *l); int luatpt_getelement(lua_State *l);
int luatpt_element_func(lua_State *l); int luatpt_element_func(lua_State *l);
int luatpt_graphics_func(lua_State *l);
int luatpt_drawtext(lua_State* l); int luatpt_drawtext(lua_State* l);
int luatpt_create(lua_State* l); int luatpt_create(lua_State* l);
int luatpt_setpause(lua_State* l); int luatpt_setpause(lua_State* l);

View File

@ -65,6 +65,5 @@
#define DISPLAY_AIR 0x0000000F #define DISPLAY_AIR 0x0000000F
#define DISPLAY_WARP 0x00000010 #define DISPLAY_WARP 0x00000010
#define DISPLAY_PERS 0x00000020 #define DISPLAY_PERS 0x00000020
#define DISPLAY_EFFE 0x00000040
#endif #endif

View File

@ -79,8 +79,8 @@ part_type ptypes[PT_NUM] =
{"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure", ST_SOLID, TYPE_SOLID | PROP_NEUTPASS | PROP_HOT_GLOW | PROP_SPARKSETTLE, &update_GLAS, NULL}, {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure", ST_SOLID, TYPE_SOLID | PROP_NEUTPASS | PROP_HOT_GLOW | PROP_SPARKSETTLE, &update_GLAS, NULL},
{"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 100C)", ST_SOLID, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, &update_NPTCT, NULL}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 100C)", ST_SOLID, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, &update_NPTCT, NULL},
{"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels.", ST_SOLID, TYPE_PART | PROP_HOT_GLOW, NULL, NULL}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels.", ST_SOLID, TYPE_PART | PROP_HOT_GLOW, NULL, NULL},
{"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_EXPLOSIVE, 9000.0f +273.15f, 1, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals.", ST_NONE, TYPE_ENERGY, &update_THDR, &graphics_THDR}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_EXPLOSIVE, 9000.0f +273.15f, 1, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals.", ST_NONE, TYPE_PART, &update_THDR, &graphics_THDR},
{"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_GAS, 10000.0f +273.15f, 5, "Plasma, extremely hot.", ST_NONE, TYPE_GAS|PROP_LIFE_DEC|PROP_LIFE_KILL, &update_PYRO, &graphics_PLSM}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_GAS, 10000.0f +273.15f, 5, "Plasma, extremely hot.", ST_NONE, TYPE_GAS|PROP_LIFE_DEC|PROP_LIFE_KILL, &update_PYRO, &graphics_PLSM},
{"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)", ST_NONE, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, NULL, NULL}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)", ST_NONE, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, NULL, NULL},
{"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice.", ST_SOLID, TYPE_SOLID, NULL, NULL}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice.", ST_SOLID, TYPE_SOLID, NULL, NULL},
{"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when introduced to electricity", ST_GAS, TYPE_GAS|PROP_CONDUCTS|PROP_LIFE_DEC, &update_NBLE, NULL}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when introduced to electricity", ST_GAS, TYPE_GAS|PROP_CONDUCTS|PROP_LIFE_DEC, &update_NBLE, NULL},

View File

@ -18,28 +18,47 @@
int update_O2(UPDATE_FUNC_ARGS) int update_O2(UPDATE_FUNC_ARGS)
{ {
int r,rx,ry; int r,rx,ry;
for (rx=-2; rx<3; rx++) if (parts[i].temp < 9273.15)
for (ry=-2; ry<3; ry++) {
if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES && (rx || ry)) for (rx=-2; rx<3; rx++)
{ for (ry=-2; ry<3; ry++)
r = pmap[y+ry][x+rx]; if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES && (rx || ry))
if (!r)
continue;
if ((r&0xFF)==PT_FIRE)
{ {
parts[r>>8].temp+=(rand()/(RAND_MAX/100)); r = pmap[y+ry][x+rx];
if(parts[r>>8].tmp&0x01) if (!r)
parts[r>>8].temp=3473; continue;
parts[r>>8].tmp |= 2;
}
if ((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM)
{
create_part(i,x,y,PT_FIRE);
parts[i].temp+=(rand()/(RAND_MAX/100));
parts[i].tmp |= 2;
}
} if ((r&0xFF)==PT_FIRE)
{
parts[r>>8].temp+=(rand()/(RAND_MAX/100));
if(parts[r>>8].tmp&0x01)
parts[r>>8].temp=3473;
parts[r>>8].tmp |= 2;
}
if ((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM)
{
create_part(i,x,y,PT_FIRE);
parts[i].temp+=(rand()/(RAND_MAX/100));
parts[i].tmp |= 2;
}
}
}
else if (parts[i].temp > 9973.15 && pv[y/CELL][x/CELL] > 250.0f && abs(gravx[(((y/sdl_scale)/CELL)*(XRES/CELL))+((x/sdl_scale)/CELL)]) + abs(gravy[(((y/sdl_scale)/CELL)*(XRES/CELL))+((x/sdl_scale)/CELL)]) > 20)
{
if (rand()%5 < 1)
{
int j;
part_change_type(i,x,y,PT_PLSM);
parts[i].life = rand()%150+50;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = 15000;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT); if (j != -1) parts[j].temp = 15000;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_BRMT); if (j != -1) parts[j].temp = 15000;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_SING); if (j != -1) { parts[j].temp = 15000; parts[i].life = rand()%25+50; }
parts[i].temp += 15000;
pv[y/CELL][x/CELL] += 300;
}
}
return 0; return 0;
} }

View File

@ -49,12 +49,13 @@ int update_CO2(UPDATE_FUNC_ARGS) {
int j; int j;
kill_part(i); kill_part(i);
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = 15000; j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = 15000;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) parts[j].temp = 15000; if (!(rand()%50)) { j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) parts[j].temp = 15000; }
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_O2); if (j != -1) parts[j].temp = 15000; j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_O2); if (j != -1) parts[j].temp = 15000;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_SING); if (j != -1) { parts[j].temp = 15000; parts[i].life = rand()%100+450; } if (rand()%1000 < 1) { j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_SING); if (j != -1) { parts[j].temp = 15000; parts[i].life = 3; } }
parts[i].temp += 15000; parts[i].temp += 15000;
pv[y/CELL][x/CELL] += 100; pv[y/CELL][x/CELL] += 100;
return 1;
} }
} }
return 0; return 0;

View File

@ -94,7 +94,7 @@ int update_ELEC(UPDATE_FUNC_ARGS) {
kill_part(i); kill_part(i);
return 1; return 1;
} }
if (ptypes[r&0xFF].properties & PROP_CONDUCTS && ((r&0xFF)!=PT_H2||parts[i].tmp!=1)) if (ptypes[r&0xFF].properties & PROP_CONDUCTS && ((r&0xFF)!=PT_NBLE||parts[i].temp<2273.15))
{ {
create_part(-1, x+rx, y+ry, PT_SPRK); create_part(-1, x+rx, y+ry, PT_SPRK);
kill_part(i); kill_part(i);

View File

@ -17,6 +17,8 @@
int update_GEL(UPDATE_FUNC_ARGS) { int update_GEL(UPDATE_FUNC_ARGS) {
int r, rx, ry; int r, rx, ry;
float dx, dy;
char gel;
if (parts[i].tmp>100) parts[i].tmp = 100; if (parts[i].tmp>100) parts[i].tmp = 100;
if (parts[i].tmp<0) parts[i].tmp = 0; if (parts[i].tmp<0) parts[i].tmp = 0;
for (rx=-2; rx<3; rx++) for (rx=-2; rx<3; rx++)
@ -41,7 +43,7 @@ int update_GEL(UPDATE_FUNC_ARGS) {
parts[i].tmp++; parts[i].tmp++;
} }
char gel = 0; gel = 0;
if ((r&0xFF)==PT_GEL) if ((r&0xFF)==PT_GEL)
gel = 1; gel = 1;
@ -58,7 +60,6 @@ int update_GEL(UPDATE_FUNC_ARGS) {
parts[i].tmp--; parts[i].tmp--;
} }
float dx, dy;
dx = parts[i].x - parts[r>>8].x; dx = parts[i].x - parts[r>>8].x;
dy = parts[i].y - parts[r>>8].y; dy = parts[i].y - parts[r>>8].y;

View File

@ -35,7 +35,7 @@ int update_H2(UPDATE_FUNC_ARGS)
} }
if (parts[r>>8].temp > 2273.15)// && pv[y/CELL][x/CELL] > 50.0f) if (parts[r>>8].temp > 2273.15)// && pv[y/CELL][x/CELL] > 50.0f)
continue; continue;
if (parts[i].tmp != 1) if (parts[i].temp < 2273.15)
{ {
if (rt==PT_FIRE) if (rt==PT_FIRE)
{ {
@ -54,20 +54,18 @@ int update_H2(UPDATE_FUNC_ARGS)
} }
if (parts[i].temp > 2273.15 && pv[y/CELL][x/CELL] > 50.0f) if (parts[i].temp > 2273.15 && pv[y/CELL][x/CELL] > 50.0f)
{ {
parts[i].tmp = 1;
if (rand()%5 < 1) if (rand()%5 < 1)
{ {
int j; int j;
float temp = parts[i].temp; float temp = parts[i].temp;
part_change_type(i,x,y,PT_PLSM); part_change_type(i,x,y,PT_PLSM);
parts[i].life = rand()%150+50; parts[i].life = rand()%150+50;
create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = temp;
create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (!(rand()%10)) { j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) parts[j].temp = temp; }
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT); j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT);
if (j != -1) { parts[j].ctype = 0xFFFF00; parts[j].temp = temp; } if (j != -1) { parts[j].ctype = 0xFFFF00; parts[j].temp = temp; }
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NBLE); j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NBLE); if (j != -1) parts[j].temp = temp;
if (j != -1) { parts[j].tmp = 1; parts[j].temp = temp; }
if (rand()%2) if (rand()%2)
{ {
@ -75,7 +73,7 @@ int update_H2(UPDATE_FUNC_ARGS)
if (j != -1) { parts[j].tmp = 1; parts[j].temp = temp; } if (j != -1) { parts[j].tmp = 1; parts[j].temp = temp; }
} }
parts[i].temp += 6000; parts[i].temp += 750+rand()%500;
pv[y/CELL][x/CELL] += 30; pv[y/CELL][x/CELL] += 30;
} }
} }

View File

@ -25,16 +25,16 @@ int update_NBLE(UPDATE_FUNC_ARGS)
float temp = parts[i].temp; float temp = parts[i].temp;
part_change_type(i,x,y,PT_PLSM); part_change_type(i,x,y,PT_PLSM);
parts[i].life = rand()%150+50; parts[i].life = rand()%150+50;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = temp;
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) if (!(rand()%25)) { j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) parts[j].temp = temp; }
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT); j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT);
if (j != -1) { parts[j].ctype = 0xFF0000; parts[j].temp = temp; } if (j != -1) { parts[j].ctype = 0xFF0000; parts[j].temp = temp; }
j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_CO2); j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_CO2);
if (j != -1) parts[j].temp = temp - 1000; if (j != -1) parts[j].temp = temp;
parts[i].temp += 10000; parts[i].temp += 1750+rand()%500;
pv[y/CELL][x/CELL] += 30; pv[y/CELL][x/CELL] += 50;
} }
} }
return 0; return 0;

View File

@ -61,7 +61,7 @@ int update_PYRO(UPDATE_FUNC_ARGS) {
(t!=PT_SPRK || (rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL)) && (t!=PT_SPRK || (rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL)) &&
(t!=PT_PHOT || rt!=PT_INSL) && (t!=PT_PHOT || rt!=PT_INSL) &&
(rt!=PT_SPNG || parts[r>>8].life==0) && (rt!=PT_SPNG || parts[r>>8].life==0) &&
(rt!=PT_H2 || (parts[r>>8].temp < 2273.15 && pv[y/CELL][x/CELL] < 50.0f)) && (rt!=PT_H2 || parts[r>>8].temp < 2273.15) &&
ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ry)/CELL][(x+rx)/CELL]*10.0f))>(rand()%1000)) ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ry)/CELL][(x+rx)/CELL]*10.0f))>(rand()%1000))
{ {
part_change_type(r>>8,x+rx,y+ry,PT_FIRE); part_change_type(r>>8,x+rx,y+ry,PT_FIRE);

View File

@ -59,7 +59,7 @@ int update_SPRK(UPDATE_FUNC_ARGS) {
parts[nearp].ctype = PT_ETRD; parts[nearp].ctype = PT_ETRD;
} }
} }
else if (ct==PT_NBLE&&parts[i].life<=1&&parts[i].tmp!=1) else if (ct==PT_NBLE&&parts[i].life<=1&&parts[i].temp<5273.15)
{ {
parts[i].life = rand()%150+50; parts[i].life = rand()%150+50;
part_change_type(i,x,y,PT_PLSM); part_change_type(i,x,y,PT_PLSM);
@ -194,7 +194,7 @@ int update_SPRK(UPDATE_FUNC_ARGS) {
conduct_sprk = 0; conduct_sprk = 0;
if (rt==PT_INST&&ct!=PT_PSCN) if (rt==PT_INST&&ct!=PT_PSCN)
conduct_sprk = 0; conduct_sprk = 0;
if (rt == PT_NBLE && parts[r>>8].tmp == 1) if (rt == PT_NBLE && parts[r>>8].temp > 5273.15)
conduct_sprk = 0; conduct_sprk = 0;
if (conduct_sprk) { if (conduct_sprk) {

View File

@ -47,6 +47,9 @@
#include <font.h> #include <font.h>
#include <misc.h> #include <misc.h>
#include "hmap.h" #include "hmap.h"
#ifdef LUACONSOLE
#include <luaconsole.h>
#endif
#if defined(LIN32) || defined(LIN64) #if defined(LIN32) || defined(LIN64)
#include "icon.h" #include "icon.h"
@ -1693,7 +1696,7 @@ void draw_other(pixel *vid) // EMP effect
if (emp_decor>0 && !sys_pause) emp_decor-=emp_decor/25+2; if (emp_decor>0 && !sys_pause) emp_decor-=emp_decor/25+2;
if (emp_decor>40) emp_decor=40; if (emp_decor>40) emp_decor=40;
if (emp_decor<0) emp_decor = 0; if (emp_decor<0) emp_decor = 0;
if (!(display_mode & DISPLAY_EFFE)) // no in nothing mode if (!(render_mode & EFFECT)) // not in nothing mode
return; return;
if (emp_decor>0) if (emp_decor>0)
{ {
@ -1854,8 +1857,29 @@ void render_parts(pixel *vid)
} }
else if(!(colour_mode & COLOUR_BASC)) //Don't get special effects for BASIC colour mode else if(!(colour_mode & COLOUR_BASC)) //Don't get special effects for BASIC colour mode
{ {
#ifdef LUACONSOLE
if (lua_gr_func[t])
{
if (luacon_graphics_update(t,i, &pixel_mode, &cola, &colr, &colg, &colb, &firea, &firer, &fireg, &fireb))
{
graphicscache[t].isready = 1;
graphicscache[t].pixel_mode = pixel_mode;
graphicscache[t].cola = cola;
graphicscache[t].colr = colr;
graphicscache[t].colg = colg;
graphicscache[t].colb = colb;
graphicscache[t].firea = firea;
graphicscache[t].firer = firer;
graphicscache[t].fireg = fireg;
graphicscache[t].fireb = fireb;
}
}
else if (ptypes[t].graphics_func)
{
#else
if (ptypes[t].graphics_func) if (ptypes[t].graphics_func)
{ {
#endif
if ((*(ptypes[t].graphics_func))(&(parts[i]), nx, ny, &pixel_mode, &cola, &colr, &colg, &colb, &firea, &firer, &fireg, &fireb)) //That's a lot of args, a struct might be better if ((*(ptypes[t].graphics_func))(&(parts[i]), nx, ny, &pixel_mode, &cola, &colr, &colg, &colb, &firea, &firer, &fireg, &fireb)) //That's a lot of args, a struct might be better
{ {
graphicscache[t].isready = 1; graphicscache[t].isready = 1;
@ -2869,10 +2893,82 @@ void draw_parts_fbo()
} }
#endif #endif
// draw the graphics that appear before update_particles is called
void render_before(pixel *part_vbuf)
{
#ifdef OGLR
if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
clearScreen(0.01f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
else //clear screen every frame
{
clearScreen(1.0f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
}
#else
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
else if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
memcpy(part_vbuf, pers_bg, (XRES+BARSIZE)*YRES*PIXELSIZE);
memset(part_vbuf+((XRES+BARSIZE)*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-((XRES+BARSIZE)*YRES*PIXELSIZE));
}
else //clear screen every frame
{
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
#endif
if(ngrav_enable && drawgrav_enable)
draw_grav(part_vbuf);
draw_walls(part_vbuf);
}
int persist_counter = 0;
// draw the graphics that appear after update_particles is called
void render_after(pixel *part_vbuf, pixel *vid_buf)
{
render_parts(part_vbuf); //draw particles
draw_other(part_vbuf);
//if(su == WL_GRAV+100)
// draw_grav_zones(part_vbuf);
if (vid_buf && (display_mode & DISPLAY_PERS))
{
if (!persist_counter)
{
dim_copy_pers(pers_bg, vid_buf);
}
else
{
memcpy(pers_bg, vid_buf, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
persist_counter = (persist_counter+1) % 3;
}
#ifndef OGLR
if (render_mode & FIREMODE)
render_fire(part_vbuf);
#endif
render_signs(part_vbuf);
#ifndef OGLR
if(vid_buf && ngrav_enable && (display_mode & DISPLAY_WARP))
render_gravlensing(part_vbuf, vid_buf);
#endif
}
void draw_walls(pixel *vid) void draw_walls(pixel *vid)
{ {
int x, y, i, j, cr, cg, cb; int x, y, i, j, cr, cg, cb, nx, ny, t;
unsigned char wt; unsigned char wt;
float lx, ly;
pixel pc; pixel pc;
pixel gc; pixel gc;
for (y=0; y<YRES/CELL; y++) for (y=0; y<YRES/CELL; y++)
@ -3058,6 +3154,30 @@ void draw_walls(pixel *vid)
} }
} }
// draw streamlines
for (y=0; y<YRES/CELL; y++)
for (x=0; x<XRES/CELL; x++)
if (bmap[y][x]==WL_STREAM)
{
lx = x*CELL + CELL*0.5f;
ly = y*CELL + CELL*0.5f;
for (t=0; t<1024; t++)
{
nx = (int)(lx+0.5f);
ny = (int)(ly+0.5f);
if (nx<0 || nx>=XRES || ny<0 || ny>=YRES)
break;
addpixel(vid, nx, ny, 255, 255, 255, 64);
i = nx/CELL;
j = ny/CELL;
lx += vx[j][i]*0.125f;
ly += vy[j][i]*0.125f;
if (bmap[j][i]==WL_STREAM && i!=x && j!=y)
break;
}
drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128);
}
} }
void create_decorations(int x, int y, int rx, int ry, int r, int g, int b, int click, int tool) void create_decorations(int x, int y, int rx, int ry, int r, int g, int b, int click, int tool)

View File

@ -2883,6 +2883,7 @@ int sdl_poll(void)
{ {
SDL_Event event; SDL_Event event;
sdl_key=sdl_rkey=sdl_wheel=sdl_ascii=0; sdl_key=sdl_rkey=sdl_wheel=sdl_ascii=0;
loop_time = SDL_GetTicks();
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event))
{ {
switch (event.type) switch (event.type)
@ -5641,7 +5642,8 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
b = mouse_get_state(&mx, &my); b = mouse_get_state(&mx, &my);
memcpy(vid_buf,old_buf,(XRES+BARSIZE)*(YRES+MENUSIZE)*PIXELSIZE); memcpy(vid_buf,old_buf,(XRES+BARSIZE)*(YRES+MENUSIZE)*PIXELSIZE);
render_parts(vid_buf); render_before(vid_buf);
render_after(vid_buf, NULL);
ui_edit_process(mx, my, b, &box_R); ui_edit_process(mx, my, b, &box_R);
ui_edit_process(mx, my, b, &box_G); ui_edit_process(mx, my, b, &box_G);
ui_edit_process(mx, my, b, &box_B); ui_edit_process(mx, my, b, &box_B);
@ -5923,6 +5925,9 @@ unsigned int decorations_ui(pixel *vid_buf,int *bsx,int *bsy, unsigned int saved
cb = PIXB(tempcolor); cb = PIXB(tempcolor);
if (cr || cg || cb) if (cr || cg || cb)
{ {
if (cr) cr++;
if (cg) cg++;
if (cb) cb++;
currR = cr; currR = cr;
currG = cg; currG = cg;
currB = cb; currB = cb;
@ -6666,10 +6671,10 @@ void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
int render_optionicons[] = {0xE1, 0xDF, 0x9B, 0xC4, 0xBF, 0xDB}; int render_optionicons[] = {0xE1, 0xDF, 0x9B, 0xC4, 0xBF, 0xDB};
char * render_desc[] = {"Effects", "Glow", "Fire", "Blur", "Blob", "Basic"}; char * render_desc[] = {"Effects", "Glow", "Fire", "Blur", "Blob", "Basic"};
int display_optioncount = 7; int display_optioncount = 6;
int display_options[] = {DISPLAY_AIRC, DISPLAY_AIRP, DISPLAY_AIRV, DISPLAY_AIRH, DISPLAY_WARP, DISPLAY_PERS, DISPLAY_EFFE}; int display_options[] = {DISPLAY_AIRC, DISPLAY_AIRP, DISPLAY_AIRV, DISPLAY_AIRH, DISPLAY_WARP, DISPLAY_PERS};
int display_optionicons[] = {0xD4, 0x99, 0x98, 0xBE, 0xDE, 0x9A, -1}; int display_optionicons[] = {0xD4, 0x99, 0x98, 0xBE, 0xDE, 0x9A};
char * display_desc[] = {"Air: Cracker", "Air: Pressure", "Air: Velocity", "Air: Heat", "Warp effect", "Persistent", "Effects"}; char * display_desc[] = {"Air: Cracker", "Air: Pressure", "Air: Velocity", "Air: Heat", "Warp effect", "Persistent"};
int colour_optioncount = 4; int colour_optioncount = 4;
int colour_options[] = {COLOUR_BASC, COLOUR_LIFE, COLOUR_HEAT, COLOUR_GRAD}; int colour_options[] = {COLOUR_BASC, COLOUR_LIFE, COLOUR_HEAT, COLOUR_GRAD};
@ -6758,63 +6763,24 @@ void render_ui(pixel * vid_buf, int xcoord, int ycoord, int orientation)
b = mouse_get_state(&mx, &my); b = mouse_get_state(&mx, &my);
memcpy(vid_buf, o_vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE); memcpy(vid_buf, o_vid_buf, ((YRES+MENUSIZE) * (XRES+BARSIZE)) * PIXELSIZE);
#ifdef OGLR
if(ngrav_enable && display_mode & DISPLAY_WARP) part_vbuf = vid_buf;
#else
if(ngrav_enable && (display_mode & DISPLAY_WARP))
{ {
part_vbuf = part_vbuf_store; part_vbuf = part_vbuf_store;
memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
} else { } else {
part_vbuf = vid_buf; part_vbuf = vid_buf;
} }
#ifdef OGLR
if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
clearScreen(0.01f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
else //clear screen every frame
{
clearScreen(1.0f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
}
#else
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
else if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
memcpy(part_vbuf, pers_bg, (XRES+BARSIZE)*YRES*PIXELSIZE);
memset(part_vbuf+((XRES+BARSIZE)*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-((XRES+BARSIZE)*YRES*PIXELSIZE));
}
else //clear screen every frame
{
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
#endif
if(ngrav_enable && drawgrav_enable)
draw_grav(vid_buf);
draw_walls(part_vbuf);
render_parts(part_vbuf);
draw_other(part_vbuf);
#ifndef OGLR
if (render_mode & FIREMODE)
render_fire(part_vbuf);
#endif
render_signs(part_vbuf);
#ifndef OGLR
if(ngrav_enable && display_mode & DISPLAY_WARP)
render_gravlensing(part_vbuf, vid_buf);
#endif #endif
render_before(part_vbuf);
render_after(part_vbuf, vid_buf);
quickoptions_menu(vid_buf, b, bq, mx, my);
for (i=0; i<SC_TOTAL; i++)//draw all the menu sections
{
draw_menu(vid_buf, i, active_menu);
}
draw_svf_ui(vid_buf, sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)); draw_svf_ui(vid_buf, sdl_mod & (KMOD_LCTRL|KMOD_RCTRL));
clearrect(vid_buf, xcoord-2, ycoord-2, xsize+4, ysize+4); clearrect(vid_buf, xcoord-2, ycoord-2, xsize+4, ysize+4);

View File

@ -96,6 +96,7 @@ void luacon_open(){
{"screenshot",&luatpt_screenshot}, {"screenshot",&luatpt_screenshot},
{"element",&luatpt_getelement}, {"element",&luatpt_getelement},
{"element_func",&luatpt_element_func}, {"element_func",&luatpt_element_func},
{"graphics_func",&luatpt_graphics_func},
{NULL,NULL} {NULL,NULL}
}; };
@ -213,12 +214,15 @@ tpt.partsdata = nil");
} }
lua_setfield(l, tptProperties, "eltransition"); lua_setfield(l, tptProperties, "eltransition");
lua_el_func = calloc(PT_NUM, sizeof(int)); lua_el_func = (int*)calloc(PT_NUM, sizeof(int));
lua_el_mode = calloc(PT_NUM, sizeof(int)); lua_el_mode = (int*)calloc(PT_NUM, sizeof(int));
lua_gr_func = (int*)calloc(PT_NUM, sizeof(int));
for(i = 0; i < PT_NUM; i++) for(i = 0; i < PT_NUM; i++)
{ {
lua_el_mode[i] = 0; lua_el_mode[i] = 0;
lua_gr_func[i] = 0;
} }
lua_sethook(l, &lua_hook, LUA_MASKCOUNT, 4000000);
} }
#ifndef FFI #ifndef FFI
int luacon_partread(lua_State* l){ int luacon_partread(lua_State* l){
@ -248,11 +252,11 @@ int luacon_partread(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
tempinteger = *((int*)(((void*)&parts[i])+offset)); tempinteger = *((int*)(((char*)&parts[i])+offset));
lua_pushnumber(l, tempinteger); lua_pushnumber(l, tempinteger);
break; break;
case 1: case 1:
tempfloat = *((float*)(((void*)&parts[i])+offset)); tempfloat = *((float*)(((char*)&parts[i])+offset));
lua_pushnumber(l, tempfloat); lua_pushnumber(l, tempfloat);
break; break;
} }
@ -280,10 +284,10 @@ int luacon_partwrite(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
*((int*)(((void*)&parts[i])+offset)) = luaL_optinteger(l, 3, 0); *((int*)(((char*)&parts[i])+offset)) = luaL_optinteger(l, 3, 0);
break; break;
case 1: case 1:
*((float*)(((void*)&parts[i])+offset)) = luaL_optnumber(l, 3, 0); *((float*)(((char*)&parts[i])+offset)) = luaL_optnumber(l, 3, 0);
break; break;
} }
return 1; return 1;
@ -410,11 +414,11 @@ int luacon_transitionread(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
tempinteger = *((int*)(((void*)&ptransitions[i])+offset)); tempinteger = *((int*)(((char*)&ptransitions[i])+offset));
lua_pushnumber(l, tempinteger); lua_pushnumber(l, tempinteger);
break; break;
case 1: case 1:
tempfloat = *((float*)(((void*)&ptransitions[i])+offset)); tempfloat = *((float*)(((char*)&ptransitions[i])+offset));
lua_pushnumber(l, tempfloat); lua_pushnumber(l, tempfloat);
break; break;
} }
@ -444,10 +448,10 @@ int luacon_transitionwrite(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
*((int*)(((void*)&ptransitions[i])+offset)) = luaL_optinteger(l, 3, 0); *((int*)(((char*)&ptransitions[i])+offset)) = luaL_optinteger(l, 3, 0);
break; break;
case 1: case 1:
*((float*)(((void*)&ptransitions[i])+offset)) = luaL_optnumber(l, 3, 0); *((float*)(((char*)&ptransitions[i])+offset)) = luaL_optnumber(l, 3, 0);
break; break;
} }
return 0; return 0;
@ -597,19 +601,19 @@ int luacon_elementread(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
tempinteger = *((int*)(((void*)&ptypes[i])+offset)); tempinteger = *((int*)(((char*)&ptypes[i])+offset));
lua_pushnumber(l, tempinteger); lua_pushnumber(l, tempinteger);
break; break;
case 1: case 1:
tempfloat = *((float*)(((void*)&ptypes[i])+offset)); tempfloat = *((float*)(((char*)&ptypes[i])+offset));
lua_pushnumber(l, tempfloat); lua_pushnumber(l, tempfloat);
break; break;
case 2: case 2:
tempstring = *((char**)(((void*)&ptypes[i])+offset)); tempstring = *((char**)(((char*)&ptypes[i])+offset));
lua_pushstring(l, tempstring); lua_pushstring(l, tempstring);
break; break;
case 3: case 3:
tempinteger = *((unsigned char*)(((void*)&ptypes[i])+offset)); tempinteger = *((unsigned char*)(((char*)&ptypes[i])+offset));
lua_pushnumber(l, tempinteger); lua_pushnumber(l, tempinteger);
break; break;
} }
@ -641,10 +645,10 @@ int luacon_elementwrite(lua_State* l){
switch(format) switch(format)
{ {
case 0: case 0:
*((int*)(((void*)&ptypes[i])+offset)) = luaL_optinteger(l, 3, 0); *((int*)(((char*)&ptypes[i])+offset)) = luaL_optinteger(l, 3, 0);
break; break;
case 1: case 1:
*((float*)(((void*)&ptypes[i])+offset)) = luaL_optnumber(l, 3, 0); *((float*)(((char*)&ptypes[i])+offset)) = luaL_optnumber(l, 3, 0);
break; break;
case 2: case 2:
tempstring = mystrdup(luaL_optstring(l, 3, "")); tempstring = mystrdup(luaL_optstring(l, 3, ""));
@ -667,11 +671,11 @@ int luacon_elementwrite(lua_State* l){
return luaL_error(l, "Name in use"); return luaL_error(l, "Name in use");
} }
} }
*((char**)(((void*)&ptypes[i])+offset)) = tempstring; *((char**)(((char*)&ptypes[i])+offset)) = tempstring;
//Need some way of cleaning up previous values //Need some way of cleaning up previous values
break; break;
case 3: case 3:
*((unsigned char*)(((void*)&ptypes[i])+offset)) = luaL_optinteger(l, 3, 0); *((unsigned char*)(((char*)&ptypes[i])+offset)) = luaL_optinteger(l, 3, 0);
break; break;
} }
if (modified_stuff) if (modified_stuff)
@ -733,26 +737,39 @@ int luacon_step(int mx, int my, int selectl, int selectr){
lua_setfield(l, tptProperties, "mousey"); lua_setfield(l, tptProperties, "mousey");
lua_setfield(l, tptProperties, "selectedl"); lua_setfield(l, tptProperties, "selectedl");
lua_setfield(l, tptProperties, "selectedr"); lua_setfield(l, tptProperties, "selectedr");
if(step_functions[0]){ for(i = 0; i<6; i++){
//Set mouse globals if(step_functions[i]){
for(i = 0; i<6; i++){ loop_time = SDL_GetTicks();
if(step_functions[i]){ lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]);
lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]); callret = lua_pcall(l, 0, 0, 0);
callret = lua_pcall(l, 0, 0, 0); if (callret)
if (callret) {
// failed, TODO: better error reporting
printf("%s\n",luacon_geterror());
if (!strcmp(luacon_geterror(),"Error: Infinite loop"))
{ {
// failed, TODO: better error reporting lua_pushcfunction(l,&luatpt_unregister_step);
printf("%s\n",luacon_geterror()); lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]);
lua_pcall(l, 1, 0, 0);
} }
} }
} }
return tempret;
} }
return 0; return 0;
} }
int luacon_eval(char *command){ int luacon_eval(char *command){
loop_time = SDL_GetTicks();
return luaL_dostring (l, command); return luaL_dostring (l, command);
} }
void lua_hook(lua_State *L, lua_Debug *ar)
{
if(ar->event == LUA_HOOKCOUNT && SDL_GetTicks()-loop_time > 3000)
{
if (confirm_ui(vid_buf,"Infinite Loop","The Lua code might have an infinite loop. Press OK to stop it","OK"))
luaL_error(l,"Error: Infinite loop");
loop_time = SDL_GetTicks();
}
}
int luacon_part_update(int t, int i, int x, int y, int surround_space, int nt) int luacon_part_update(int t, int i, int x, int y, int surround_space, int nt)
{ {
int retval = 0; int retval = 0;
@ -771,6 +788,29 @@ int luacon_part_update(int t, int i, int x, int y, int surround_space, int nt)
} }
return retval; return retval;
} }
int luacon_graphics_update(int t, int i, int *pixel_mode, int *cola, int *colr, int *colg, int *colb, int *firea, int *firer, int *fireg, int *fireb)
{
int cache = 0;
lua_rawgeti(l, LUA_REGISTRYINDEX, lua_gr_func[t]);
lua_pushinteger(l, i);
lua_pushinteger(l, *colr);
lua_pushinteger(l, *colg);
lua_pushinteger(l, *colb);
lua_pcall(l, 4, 10, 0);
cache = luaL_optint(l, 2, 0);
*pixel_mode = luaL_optint(l, 3, *pixel_mode);
*cola = luaL_optint(l, 4, *cola);
*colr = luaL_optint(l, 5, *colr);
*colg = luaL_optint(l, 6, *colg);
*colb = luaL_optint(l, 7, *colb);
*firea = luaL_optint(l, 8, *firea);
*firer = luaL_optint(l, 9, *firer);
*fireg = luaL_optint(l, 10, *fireg);
*fireb = luaL_optint(l, 11, *fireb);
lua_pop(l, 10);
return cache;
}
char *luacon_geterror(){ char *luacon_geterror(){
char *error = lua_tostring(l, -1); char *error = lua_tostring(l, -1);
if(error==NULL || !error[0]){ if(error==NULL || !error[0]){
@ -855,6 +895,29 @@ int luatpt_element_func(lua_State *l)
} }
return 0; return 0;
} }
int luatpt_graphics_func(lua_State *l)
{
if(lua_isfunction(l, 1))
{
int element = luaL_optint(l, 2, 0);
int function;
lua_pushvalue(l, 1);
function = luaL_ref(l, LUA_REGISTRYINDEX);
if(element > 0 && element < PT_NUM)
{
lua_gr_func[element] = function;
graphicscache[element].isready = 0;
return 0;
}
else
{
return luaL_error(l, "Invalid element");
}
}
else
return luaL_error(l, "Not a function");
return 0;
}
int luatpt_error(lua_State* l) int luatpt_error(lua_State* l)
{ {
char *error = ""; char *error = "";
@ -1075,8 +1138,13 @@ int luatpt_reset_spark(lua_State* l)
{ {
if (parts[i].type==PT_SPRK) if (parts[i].type==PT_SPRK)
{ {
parts[i].type = parts[i].ctype; if (parts[i].ctype >= 0 && parts[i].ctype < PT_NUM)
parts[i].life = 4; {
parts[i].type = parts[i].ctype;
parts[i].life = 0;
}
else
kill_part(i);
} }
} }
return 0; return 0;
@ -1270,7 +1338,7 @@ int luatpt_set_property(lua_State* l)
} else { } else {
t = luaL_optint(l, 2, 0); t = luaL_optint(l, 2, 0);
} }
if (format == 3 && (t<0 || t>=PT_NUM)) if (format == 3 && (t<0 || t>=PT_NUM || !ptypes[t].enabled))
return luaL_error(l, "Unrecognised element number '%d'", t); return luaL_error(l, "Unrecognised element number '%d'", t);
} else { } else {
name = luaL_optstring(l, 2, "dust"); name = luaL_optstring(l, 2, "dust");
@ -1462,9 +1530,9 @@ int luatpt_drawrect(lua_State* l)
if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
return luaL_error(l, "Screen coordinates out of range (%d,%d)", x, y); return luaL_error(l, "Screen coordinates out of range (%d,%d)", x, y);
if(x+w > XRES+BARSIZE) if(x+w > XRES+BARSIZE)
w = XRES-x; w = XRES+BARSIZE-x;
if(y+h > YRES+MENUSIZE) if(y+h > YRES+MENUSIZE)
h = YRES-y; h = YRES+MENUSIZE-y;
if (r<0) r = 0; if (r<0) r = 0;
if (r>255) r = 255; if (r>255) r = 255;
if (g<0) g = 0; if (g<0) g = 0;
@ -1496,9 +1564,9 @@ int luatpt_fillrect(lua_State* l)
if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
return luaL_error(l, "Screen coordinates out of range (%d,%d)", x, y); return luaL_error(l, "Screen coordinates out of range (%d,%d)", x, y);
if(x+w > XRES+BARSIZE) if(x+w > XRES+BARSIZE)
w = XRES-x; w = XRES+BARSIZE-x;
if(y+h > YRES+MENUSIZE) if(y+h > YRES+MENUSIZE)
h = YRES-y; h = YRES+MENUSIZE-y;
if (r<0) r = 0; if (r<0) r = 0;
if (r>255) r = 255; if (r>255) r = 255;
if (g<0) g = 0; if (g<0) g = 0;
@ -1893,6 +1961,8 @@ int luatpt_setdebug(lua_State* l)
int luatpt_setfpscap(lua_State* l) int luatpt_setfpscap(lua_State* l)
{ {
int fpscap = luaL_optint(l, 1, 0); int fpscap = luaL_optint(l, 1, 0);
if (fpscap < 2)
return luaL_error(l, "fps cap too small");
limitFPS = fpscap; limitFPS = fpscap;
return 0; return 0;
} }

View File

@ -151,7 +151,7 @@ static const char *it_msg =
"\n" "\n"
"Contributors: \bgStanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg),\n" "Contributors: \bgStanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg),\n"
"\bgSimon Robertshaw, Skresanov Savely, cracker64, Catelite, Bryan Hoyle, Nathan Cousins, jacksonmj,\n" "\bgSimon Robertshaw, Skresanov Savely, cracker64, Catelite, Bryan Hoyle, Nathan Cousins, jacksonmj,\n"
"\bgLieuwe Mosch, Anthony Boot, Matthew \"me4502\", MaksProg\n" "\bgLieuwe Mosch, Anthony Boot, Matthew \"me4502\", MaksProg, jacob1\n"
"\n" "\n"
"\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html\n" "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html\n"
"\n" "\n"
@ -221,6 +221,7 @@ int frameidx = 0;
//int CGOL = 0; //int CGOL = 0;
//int GSPEED = 1;//causes my .exe to crash.. //int GSPEED = 1;//causes my .exe to crash..
int sound_enable = 0; int sound_enable = 0;
int loop_time = 0;
int debug_flags = 0; int debug_flags = 0;
int debug_perf_istart = 1; int debug_perf_istart = 1;
@ -755,7 +756,7 @@ int main(int argc, char *argv[])
void *http_ver_check, *http_session_check = NULL; void *http_ver_check, *http_session_check = NULL;
char *ver_data=NULL, *check_data=NULL, *tmp; char *ver_data=NULL, *check_data=NULL, *tmp;
//char console_error[255] = ""; //char console_error[255] = "";
int result, i, j, bq, bc = 0, fire_fc=0, do_check=0, do_s_check=0, old_version=0, http_ret=0,http_s_ret=0, major, minor, buildnum, is_beta = 0, old_ver_len, new_message_len=0; int result, i, j, bq, bc = 0, do_check=0, do_s_check=0, old_version=0, http_ret=0,http_s_ret=0, major, minor, buildnum, is_beta = 0, old_ver_len, new_message_len=0;
#ifdef INTERNAL #ifdef INTERNAL
int vs = 0; int vs = 0;
#endif #endif
@ -770,6 +771,7 @@ int main(int argc, char *argv[])
unsigned int rgbSave = PIXRGB(127,0,0); unsigned int rgbSave = PIXRGB(127,0,0);
SDL_AudioSpec fmt; SDL_AudioSpec fmt;
int username_flash = 0, username_flash_t = 1; int username_flash = 0, username_flash_t = 1;
int saveOpenError = 0;
#ifdef PTW32_STATIC_LIB #ifdef PTW32_STATIC_LIB
pthread_win32_process_attach_np(); pthread_win32_process_attach_np();
pthread_win32_thread_attach_np(); pthread_win32_thread_attach_np();
@ -779,7 +781,6 @@ int main(int argc, char *argv[])
part_vbuf = calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); //Extra video buffer part_vbuf = calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); //Extra video buffer
part_vbuf_store = part_vbuf; part_vbuf_store = part_vbuf;
pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE); pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE);
int saveOpenError = 0;
gravity_init(); gravity_init();
GSPEED = 1; GSPEED = 1;
@ -902,12 +903,12 @@ int main(int argc, char *argv[])
} }
else if (!strncmp(argv[i], "ptsave", 7) && i+1<argc) else if (!strncmp(argv[i], "ptsave", 7) && i+1<argc)
{ {
puts("Got ptsave");
int ci = 0, ns = 0, okay = 0; int ci = 0, ns = 0, okay = 0;
char * tempString = argv[i+1]; char * tempString = argv[i+1];
int tempStringLength = strlen(argv[i+1])-7; int tempStringLength = strlen(argv[i+1])-7;
int tempSaveID = 0; int tempSaveID = 0;
char tempNumberString[32]; char tempNumberString[32];
puts("Got ptsave");
i++; i++;
tempNumberString[31] = 0; tempNumberString[31] = 0;
tempNumberString[0] = 0; tempNumberString[0] = 0;
@ -1002,54 +1003,12 @@ int main(int argc, char *argv[])
update_airh(); update_airh();
} }
#ifdef OGLR
part_vbuf = vid_buf;
#else
if(ngrav_enable && display_mode & DISPLAY_WARP)
{
part_vbuf = part_vbuf_store;
memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
} else {
part_vbuf = vid_buf;
}
#endif
if(gravwl_timeout) if(gravwl_timeout)
{ {
if(gravwl_timeout==1) if(gravwl_timeout==1)
gravity_mask(); gravity_mask();
gravwl_timeout--; gravwl_timeout--;
} }
#ifdef OGLR
if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
clearScreen(0.01f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
else //clear screen every frame
{
clearScreen(1.0f);
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
}
#else
if (display_mode & DISPLAY_AIR)//air only gets drawn in these modes
{
draw_air(part_vbuf);
}
else if (display_mode & DISPLAY_PERS)//save background for persistent, then clear
{
memcpy(part_vbuf, pers_bg, (XRES+BARSIZE)*YRES*PIXELSIZE);
memset(part_vbuf+((XRES+BARSIZE)*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-((XRES+BARSIZE)*YRES*PIXELSIZE));
}
else //clear screen every frame
{
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
#endif
//Can't be too sure (Limit the cursor size) //Can't be too sure (Limit the cursor size)
if (bsx>1180) if (bsx>1180)
@ -1067,10 +1026,19 @@ int main(int argc, char *argv[])
sandcolour_b = sandcolour_r = sandcolour_g = (int)(20.0f*sin((float)sandcolour_frame*(M_PI/180.0f))); sandcolour_b = sandcolour_r = sandcolour_g = (int)(20.0f*sin((float)sandcolour_frame*(M_PI/180.0f)));
sandcolour_frame++; sandcolour_frame++;
sandcolour_frame%=360; sandcolour_frame%=360;
if(ngrav_enable && drawgrav_enable) #ifdef OGLR
draw_grav(vid_buf); part_vbuf = vid_buf;
draw_walls(part_vbuf); #else
if(ngrav_enable && (display_mode & DISPLAY_WARP))
{
part_vbuf = part_vbuf_store;
memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
} else {
part_vbuf = vid_buf;
}
#endif
render_before(part_vbuf);
if(debug_flags & (DEBUG_PERFORMANCE_CALC|DEBUG_PERFORMANCE_FRAME)) if(debug_flags & (DEBUG_PERFORMANCE_CALC|DEBUG_PERFORMANCE_FRAME))
{ {
@ -1099,8 +1067,9 @@ int main(int argc, char *argv[])
#endif #endif
} }
render_parts(part_vbuf); //draw particles render_after(part_vbuf, vid_buf);
draw_other(part_vbuf); if(su == WL_GRAV+100)
draw_grav_zones(part_vbuf);
if(debug_flags & (DEBUG_PERFORMANCE_CALC|DEBUG_PERFORMANCE_FRAME)) if(debug_flags & (DEBUG_PERFORMANCE_CALC|DEBUG_PERFORMANCE_FRAME))
{ {
@ -1118,9 +1087,6 @@ int main(int argc, char *argv[])
debug_perf_istart %= DEBUG_PERF_FRAMECOUNT; debug_perf_istart %= DEBUG_PERF_FRAMECOUNT;
} }
if(sl == WL_GRAV+100 || sr == WL_GRAV+100)
draw_grav_zones(part_vbuf);
gravity_update_async(); //Check for updated velocity maps from gravity thread gravity_update_async(); //Check for updated velocity maps from gravity thread
if (!sys_pause||framerender) //Only update if not paused if (!sys_pause||framerender) //Only update if not paused
memset(gravmap, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); //Clear the old gravmap memset(gravmap, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); //Clear the old gravmap
@ -1130,31 +1096,6 @@ int main(int argc, char *argv[])
sys_pause = 1; sys_pause = 1;
} }
if (display_mode & DISPLAY_PERS)
{
if (!fire_fc)//fire_fc has nothing to do with fire... it is a counter for diminishing persistent view every 3 frames
{
dim_copy_pers(pers_bg, vid_buf);
}
else
{
memcpy(pers_bg, vid_buf, (XRES+BARSIZE)*YRES*PIXELSIZE);
}
fire_fc = (fire_fc+1) % 3;
}
#ifndef OGLR
if (render_mode & FIREMODE)
render_fire(part_vbuf);
#endif
render_signs(part_vbuf);
#ifndef OGLR
if(ngrav_enable && display_mode & DISPLAY_WARP)
render_gravlensing(part_vbuf, vid_buf);
#endif
memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE);//clear menu areas memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE);//clear menu areas
clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES);
@ -1553,9 +1494,8 @@ int main(int argc, char *argv[])
} }
else else
{ {
rgbSave = decorations_ui(vid_buf,&bsx,&bsy,rgbSave);//decoration_mode = !decoration_mode;
decorations_enable = 1; decorations_enable = 1;
sys_pause=1; rgbSave = decorations_ui(vid_buf,&bsx,&bsy,rgbSave);//decoration_mode = !decoration_mode;
} }
} }
if (sdl_key=='g') if (sdl_key=='g')
@ -1590,8 +1530,13 @@ int main(int argc, char *argv[])
for (i=0; i<NPART; i++) for (i=0; i<NPART; i++)
if (parts[i].type==PT_SPRK) if (parts[i].type==PT_SPRK)
{ {
parts[i].type = parts[i].ctype; if (parts[i].ctype >= 0 && parts[i].ctype < PT_NUM)
parts[i].life = 0; {
parts[i].type = parts[i].ctype;
parts[i].life = 0;
}
else
kill_part(i);
} }
} }
else else
@ -2807,8 +2752,6 @@ int main(int argc, char *argv[])
break; break;
} }
free(console); free(console);
if (!console_mode)
hud_enable = 1;
#else #else
char *console; char *console;
sys_pause = 1; sys_pause = 1;
@ -2821,12 +2764,9 @@ int main(int argc, char *argv[])
break; break;
} }
free(console); free(console);
if (!console_mode)
hud_enable = 1;
#endif #endif
} }
//execute python step hook
sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE);
//Setting an element for the stick man //Setting an element for the stick man

View File

@ -176,6 +176,7 @@ void init_can_move()
//whol eats anar //whol eats anar
can_move[PT_ANAR][PT_WHOL] = 1; can_move[PT_ANAR][PT_WHOL] = 1;
can_move[PT_ANAR][PT_NWHL] = 1; can_move[PT_ANAR][PT_NWHL] = 1;
can_move[PT_THDR][PT_THDR] = 2;
} }
/* /*
@ -257,7 +258,7 @@ int try_move(int i, int x, int y, int nx, int ny)
if (!e) //if no movement if (!e) //if no movement
{ {
if (parts[i].type!=PT_NEUT && parts[i].type!=PT_PHOT && parts[i].type!=PT_ELEC) if (!(ptypes[parts[i].type].properties & TYPE_ENERGY))
return 0; return 0;
if (!legacy_enable && parts[i].type==PT_PHOT && r)//PHOT heat conduction if (!legacy_enable && parts[i].type==PT_PHOT && r)//PHOT heat conduction
{ {
@ -271,7 +272,7 @@ int try_move(int i, int x, int y, int nx, int ny)
if (!parts[r>>8].ctype) if (!parts[r>>8].ctype)
parts[r>>8].ctype = parts[i].type; parts[r>>8].ctype = parts[i].type;
} }
if ((r&0xFF)==PT_PRTI && (parts[i].type==PT_PHOT || parts[i].type==PT_NEUT || parts[i].type==PT_ELEC)) if ((r&0xFF)==PT_PRTI && (ptypes[parts[i].type].properties & TYPE_ENERGY))
{ {
int nnx, count; int nnx, count;
for (count=0; count<8; count++) for (count=0; count<8; count++)
@ -343,7 +344,8 @@ int try_move(int i, int x, int y, int nx, int ny)
} }
if ((r&0xFF)==PT_VOID || (r&0xFF)==PT_PVOD) //this is where void eats particles if ((r&0xFF)==PT_VOID || (r&0xFF)==PT_PVOD) //this is where void eats particles
{ {
kill_part(i); if(!parts[r>>8].ctype || (parts[r>>8].ctype==parts[i].type)!=(parts[r>>8].tmp&1))
kill_part(i);
return 0; return 0;
} }
if ((r&0xFF)==PT_BHOL || (r&0xFF)==PT_NBHL) //this is where blackhole eats particles if ((r&0xFF)==PT_BHOL || (r&0xFF)==PT_NBHL) //this is where blackhole eats particles
@ -427,7 +429,7 @@ int do_move(int i, int x, int y, float nxf, float nyf)
kill_part(i); kill_part(i);
return -1; return -1;
} }
if (t==PT_PHOT||t==PT_NEUT||t==PT_ELEC) if (ptypes[t].properties & TYPE_ENERGY)
photons[ny][nx] = t|(i<<8); photons[ny][nx] = t|(i<<8);
else if (t) else if (t)
pmap[ny][nx] = t|(i<<8); pmap[ny][nx] = t|(i<<8);
@ -678,7 +680,7 @@ inline void part_change_type(int i, int x, int y, int t)//changes the type of pa
} }
parts[i].type = t; parts[i].type = t;
if (t==PT_PHOT || t==PT_NEUT || t==PT_ELEC) if (ptypes[t].properties & TYPE_ENERGY)
{ {
photons[y][x] = t|(i<<8); photons[y][x] = t|(i<<8);
if ((pmap[y][x]>>8)==i) if ((pmap[y][x]>>8)==i)
@ -717,23 +719,25 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
{ {
if (t==SPC_HEAT&&parts[pmap[y][x]>>8].temp<MAX_TEMP) if (t==SPC_HEAT&&parts[pmap[y][x]>>8].temp<MAX_TEMP)
{ {
if ((pmap[y][x]&0xFF)==PT_PUMP || (pmap[y][x]&0xFF)==PT_GPMP) { float heatchange;
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 0.1f, MIN_TEMP, MAX_TEMP); int r = pmap[y][x], fast = ((sdl_mod & (KMOD_SHIFT)) && (sdl_mod & (KMOD_CTRL)));
} else if ((sdl_mod & (KMOD_SHIFT)) && (sdl_mod & (KMOD_CTRL))) { if ((r&0xFF)==PT_PUMP || (r&0xFF)==PT_GPMP)
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 50.0f, MIN_TEMP, MAX_TEMP); heatchange = fast?1.0f:.1f;
} else { else
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); heatchange = fast?50.0f:4.0f;
}
parts[r>>8].temp = restrict_flt(parts[r>>8].temp + heatchange, MIN_TEMP, MAX_TEMP);
} }
if (t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) if (t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP)
{ {
if ((pmap[y][x]&0xFF)==PT_PUMP || (pmap[y][x]&0xFF)==PT_GPMP) { float heatchange;
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 0.1f, MIN_TEMP, MAX_TEMP); int r = pmap[y][x], fast = ((sdl_mod & (KMOD_SHIFT)) && (sdl_mod & (KMOD_CTRL)));
} else if ((sdl_mod & (KMOD_SHIFT)) && (sdl_mod & (KMOD_CTRL))) { if ((r&0xFF)==PT_PUMP || (r&0xFF)==PT_GPMP)
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 50.0f, MIN_TEMP, MAX_TEMP); heatchange = fast?1.0f:.1f;
} else { else
parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); heatchange = fast?50.0f:4.0f;
}
parts[r>>8].temp = restrict_flt(parts[r>>8].temp - heatchange, MIN_TEMP, MAX_TEMP);
} }
return pmap[y][x]>>8; return pmap[y][x]>>8;
} }
@ -843,7 +847,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
} }
return -1; return -1;
} }
if (photons[y][x] && (t==PT_PHOT||t==PT_NEUT||t==PT_ELEC)) if (photons[y][x] && (ptypes[t].properties & TYPE_ENERGY))
return -1; return -1;
if (pfree == -1) if (pfree == -1)
return -1; return -1;
@ -963,7 +967,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
parts[i].tmp = 10; parts[i].tmp = 10;
if (t==PT_BRAY) if (t==PT_BRAY)
parts[i].life = 30; parts[i].life = 30;
if (t==PT_PUMP) if (t==PT_PUMP || t==PT_GPMP)
parts[i].life= 10; parts[i].life= 10;
if (t==PT_SING) if (t==PT_SING)
parts[i].life = rand()%50+60; parts[i].life = rand()%50+60;
@ -1104,7 +1108,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
if (t==PT_BIZR||t==PT_BIZRG||t==PT_BIZRS) if (t==PT_BIZR||t==PT_BIZRG||t==PT_BIZRS)
parts[i].ctype = 0x47FFFF; parts[i].ctype = 0x47FFFF;
//and finally set the pmap/photon maps to the newly created particle //and finally set the pmap/photon maps to the newly created particle
if (t==PT_PHOT||t==PT_NEUT||t==PT_ELEC) if (ptypes[t].properties & TYPE_ENERGY)
photons[y][x] = t|(i<<8); photons[y][x] = t|(i<<8);
else if (t!=PT_STKM && t!=PT_STKM2 && t!=PT_FIGH) else if (t!=PT_STKM && t!=PT_STKM2 && t!=PT_FIGH)
pmap[y][x] = t|(i<<8); pmap[y][x] = t|(i<<8);
@ -1440,7 +1444,7 @@ void create_arc(int sx, int sy, int dx, int dy, int midpoints, int variance, int
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, createdsomething; 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, gravtot; float mv, dx, dy, ix, iy, lx, ly, nrx, nry, dp, ctemph, ctempl, gravtot, gel_scale;
int fin_x, fin_y, clear_x, clear_y, stagnant; int fin_x, fin_y, clear_x, clear_y, stagnant;
float fin_xf, fin_yf, clear_xf, clear_yf; float fin_xf, fin_yf, clear_xf, clear_yf;
float nn, ct1, ct2, swappage; float nn, ct1, ct2, swappage;
@ -1878,7 +1882,7 @@ void update_particles_i(pixel *vid, int start, int inc)
} }
} }
float gel_scale = 1.0f; gel_scale = 1.0f;
if (t==PT_GEL) if (t==PT_GEL)
gel_scale = parts[i].tmp*2.55f; gel_scale = parts[i].tmp*2.55f;
@ -2349,7 +2353,7 @@ killed:
stagnant = parts[i].flags & FLAG_STAGNANT; stagnant = parts[i].flags & FLAG_STAGNANT;
parts[i].flags &= ~FLAG_STAGNANT; parts[i].flags &= ~FLAG_STAGNANT;
if ((t==PT_PHOT||t==PT_NEUT||t==PT_ELEC)) { if (ptypes[t].properties & TYPE_ENERGY) {
if (t == PT_PHOT) { if (t == PT_PHOT) {
if (parts[i].flags&FLAG_SKIPMOVE) if (parts[i].flags&FLAG_SKIPMOVE)
{ {
@ -2730,8 +2734,7 @@ movedone:
int parts_lastActiveIndex = NPART-1; int parts_lastActiveIndex = NPART-1;
void update_particles(pixel *vid)//doesn't update the particles themselves, but some other things void update_particles(pixel *vid)//doesn't update the particles themselves, but some other things
{ {
int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; int i, x, y, t;
float lx, ly;
int lastPartUsed = 0; int lastPartUsed = 0;
int lastPartUnused = -1; int lastPartUnused = -1;
#ifdef MT #ifdef MT
@ -2751,7 +2754,7 @@ void update_particles(pixel *vid)//doesn't update the particles themselves, but
y = (int)(parts[i].y+0.5f); y = (int)(parts[i].y+0.5f);
if (x>=0 && y>=0 && x<XRES && y<YRES) if (x>=0 && y>=0 && x<XRES && y<YRES)
{ {
if (t==PT_PHOT||t==PT_NEUT||t==PT_ELEC) if (ptypes[t].properties & TYPE_ENERGY)
photons[y][x] = t|(i<<8); photons[y][x] = t|(i<<8);
else else
pmap[y][x] = t|(i<<8); pmap[y][x] = t|(i<<8);
@ -2792,31 +2795,6 @@ void update_particles(pixel *vid)//doesn't update the particles themselves, but
} }
update_particles_i(vid, 0, 1); update_particles_i(vid, 0, 1);
// this should probably be elsewhere
for (y=0; y<YRES/CELL; y++)
for (x=0; x<XRES/CELL; x++)
if (bmap[y][x]==WL_STREAM)
{
lx = x*CELL + CELL*0.5f;
ly = y*CELL + CELL*0.5f;
for (t=0; t<1024; t++)
{
nx = (int)(lx+0.5f);
ny = (int)(ly+0.5f);
if (nx<0 || nx>=XRES || ny<0 || ny>=YRES)
break;
addpixel(vid, nx, ny, 255, 255, 255, 64);
i = nx/CELL;
j = ny/CELL;
lx += vx[j][i]*0.125f;
ly += vy[j][i]*0.125f;
if (bmap[j][i]==WL_STREAM && i!=x && j!=y)
break;
}
drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128);
}
} }
void clear_area(int area_x, int area_y, int area_w, int area_h) void clear_area(int area_x, int area_y, int area_w, int area_h)