merge merge merge merge

This commit is contained in:
Alex 2010-08-16 16:36:13 -04:00
commit a7acf80787
2 changed files with 11012 additions and 74 deletions

63
powder.c Executable file → Normal file
View File

@ -5,6 +5,7 @@
* Copyright (c) 2010 Simon Robertshaw * Copyright (c) 2010 Simon Robertshaw
* Copyright (c) 2010 Skresanov Savely * Copyright (c) 2010 Skresanov Savely
* Copyright (c) 2010 Bryan Hoyle * Copyright (c) 2010 Bryan Hoyle
* Copyright (c) 2010 Nathan Cousins
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -113,6 +114,7 @@ char *it_msg =
"Shift+drag will create straight lines of particles.\n" "Shift+drag will create straight lines of particles.\n"
"Ctrl+drag will result in filled rectangles.\n" "Ctrl+drag will result in filled rectangles.\n"
"Ctrl+Shift+click will flood-fill a closed area.\n" "Ctrl+Shift+click will flood-fill a closed area.\n"
"Ctrl+Z will act as Undo.\n"
"Middle click or Alt+Click to \"sample\" the particles.\n" "Middle click or Alt+Click to \"sample\" the particles.\n"
"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n"
"Use 'S' to save parts of the window as 'stamps'.\n" "Use 'S' to save parts of the window as 'stamps'.\n"
@ -128,6 +130,7 @@ char *it_msg =
"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n"
"\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n"
"\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n"
"\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n"
"\n" "\n"
"\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n"
"\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html"
@ -169,11 +172,20 @@ struct sign
unsigned char bmap[YRES/CELL][XRES/CELL]; unsigned char bmap[YRES/CELL][XRES/CELL];
unsigned char emap[YRES/CELL][XRES/CELL]; unsigned char emap[YRES/CELL][XRES/CELL];
unsigned char cb_bmap[YRES/CELL][XRES/CELL];
unsigned char cb_emap[YRES/CELL][XRES/CELL];
unsigned cmode = 3; unsigned cmode = 3;
float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL];
float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL];
float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL];
float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL];
float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL];
float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL];
float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL];
#define TSTEPP 0.3f #define TSTEPP 0.3f
#define TSTEPV 0.4f #define TSTEPV 0.4f
@ -797,7 +809,10 @@ typedef struct
float pavg[2]; float pavg[2];
int flags; int flags;
} particle; } particle;
particle *parts; particle *parts;
particle *cb_parts;
float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index
int isplayer = 0; //It shows is player spawned or not int isplayer = 0; //It shows is player spawned or not
int mousex, mousey = 0; //They contain mouse position int mousex, mousey = 0; //They contain mouse position
@ -817,6 +832,7 @@ void menu_count(void)
int pfree; int pfree;
unsigned pmap[YRES][XRES]; unsigned pmap[YRES][XRES];
unsigned cb_pmap[YRES][XRES];
int try_move(int i, int x, int y, int nx, int ny) int try_move(int i, int x, int y, int nx, int ny)
{ {
@ -1272,7 +1288,7 @@ void set_emap(int x, int y)
set_emap(x, y+1); set_emap(x, y+1);
} }
} }
inline int parts_avg(int ci, int ni) inline int parts_avg(int ci, int ni)
{ {
int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)];
if((pmr>>8) < NPART && (pmr>>8) >= 0) if((pmr>>8) < NPART && (pmr>>8) >= 0)
@ -3215,6 +3231,7 @@ justdraw:
blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
} }
} else if(t==PT_PLSM) } else if(t==PT_PLSM)
{ {
float ttemp = parts[i].life; float ttemp = parts[i].life;
@ -4283,7 +4300,7 @@ void *build_thumb(int *size, int bzip2)
return d; return d;
} }
inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a);
int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl)
{ {
unsigned char *d,*c=thumb; unsigned char *d,*c=thumb;
@ -9684,6 +9701,7 @@ int main(int argc, char *argv[])
#endif #endif
menu_count(); menu_count();
parts = calloc(sizeof(particle), NPART); parts = calloc(sizeof(particle), NPART);
cb_parts = calloc(sizeof(particle), NPART);
for(i=0; i<NPART-1; i++) for(i=0; i<NPART-1; i++)
parts[i].life = i+1; parts[i].life = i+1;
parts[NPART-1].life = -1; parts[NPART-1].life = -1;
@ -9966,6 +9984,27 @@ int main(int argc, char *argv[])
if(it > 50) if(it > 50)
it = 50; it = 50;
} }
if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo
{
int cbx, cby, cbi;
for(cbi=0; cbi<NPART; cbi++)
parts[cbi] = cb_parts[cbi];
for(cby = 0; cby<YRES; cby++)
for(cbx = 0; cbx<XRES; cbx++)
pmap[cby][cbx] = cb_pmap[cby][cbx];
for(cby = 0; cby<(YRES/CELL); cby++)
for(cbx = 0; cbx<(XRES/CELL); cbx++)
{
vx[cby][cbx] = cb_vx[cby][cbx];
vy[cby][cbx] = cb_vy[cby][cbx];
pv[cby][cbx] = cb_pv[cby][cbx];
bmap[cby][cbx] = cb_bmap[cby][cbx];
emap[cby][cbx] = cb_emap[cby][cbx];
}
}
#ifdef INTERNAL #ifdef INTERNAL
if(sdl_key=='v') if(sdl_key=='v')
vs = !vs; vs = !vs;
@ -10488,6 +10527,26 @@ int main(int argc, char *argv[])
} }
else else
{ {
//Copy state before drawing any particles (for undo)
int cbx, cby, cbi;
for(cbi=0; cbi<NPART; cbi++)
cb_parts[cbi] = parts[cbi];
for(cby = 0; cby<YRES; cby++)
for(cbx = 0; cbx<XRES; cbx++)
cb_pmap[cby][cbx] = pmap[cby][cbx];
for(cby = 0; cby<(YRES/CELL); cby++)
for(cbx = 0; cbx<(XRES/CELL); cbx++)
{
cb_vx[cby][cbx] = vx[cby][cbx];
cb_vy[cby][cbx] = vy[cby][cbx];
cb_pv[cby][cbx] = pv[cby][cbx];
cb_bmap[cby][cbx] = bmap[cby][cbx];
cb_emap[cby][cbx] = emap[cby][cbx];
}
create_parts(x, y, bs, c); create_parts(x, y, bs, c);
lx = x; lx = x;
ly = y; ly = y;

10879
powder.c.orig Executable file

File diff suppressed because it is too large Load Diff