diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-07-25 16:12:15 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-07-25 16:12:15 (GMT) |
| commit | 6585a4640b9d1d24d821fb2147fe6182a709f088 (patch) | |
| tree | 4ccbd35c1776955c2933991af5181babe2332f9a /src/simulation/elements/FIRW.cpp | |
| parent | 0afecb5b77442d770f5ebb149f574d87859ebde7 (diff) | |
| download | powder-6585a4640b9d1d24d821fb2147fe6182a709f088.zip powder-6585a4640b9d1d24d821fb2147fe6182a709f088.tar.gz | |
TPT: Replace all explosion sparks with new element (EMBR) 1d5b081942
Diffstat (limited to 'src/simulation/elements/FIRW.cpp')
| -rw-r--r-- | src/simulation/elements/FIRW.cpp | 97 |
1 files changed, 33 insertions, 64 deletions
diff --git a/src/simulation/elements/FIRW.cpp b/src/simulation/elements/FIRW.cpp index a23d013..9be26dd 100644 --- a/src/simulation/elements/FIRW.cpp +++ b/src/simulation/elements/FIRW.cpp @@ -1,4 +1,8 @@ #include "simulation/Elements.h" +extern "C" +{ + #include "hmap.h" +} //#TPT-Directive ElementClass Element_FIRW PT_FIRW 69 Element_FIRW::Element_FIRW() { @@ -50,7 +54,7 @@ Element_FIRW::Element_FIRW() int Element_FIRW::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt, np; - if (parts[i].tmp==0) { + if (parts[i].tmp<=0) { for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) @@ -62,52 +66,43 @@ int Element_FIRW::update(UPDATE_FUNC_ARGS) if (rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) { parts[i].tmp = 1; - parts[i].life = rand()%50+60; + parts[i].life = rand()%40+60; } } } else if (parts[i].tmp==1) { - if (parts[i].life==0) { + if (parts[i].life<=0) { parts[i].tmp=2; } else { - float newVel = parts[i].life/25; - parts[i].flags &= ~FLAG_STAGNANT; - /* TODO: - if ((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE && ly-newVel>0) { - parts[i].vy = -newVel; - ly-=newVel; - iy-=newVel; - }*/ - parts[i].vy = -newVel; + // TODO: different gravity modes + Newtonian gravity + parts[i].vy = -parts[i].life*0.04f - 0.1f; } } - else if (parts[i].tmp==2) { - int col = rand()%200+4; - int tmul; - for (rx=-2; rx<3; rx++) - for (ry=-2; ry<3; ry++) - if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) - { - tmul = rand()%7; - np = sim->create_part(-1, x+rx, y+ry, PT_FIRW); - if (np>-1) - { - parts[np].vx = (rand()%3-1)*tmul; - parts[np].vy = (rand()%3-1)*tmul; - parts[np].tmp = col; - parts[np].life = rand()%100+100; - parts[np].temp = 6000.0f; - parts[np].dcolour = parts[i].dcolour; - } - } - sim->pv[y/CELL][x/CELL] += 20; + else if (parts[i].tmp>=2) + { + float angle, magnitude; + int caddress = (rand()%200)*3; + int n; + unsigned col = (((unsigned char)(firw_data[caddress]))<<16) | (((unsigned char)(firw_data[caddress+1]))<<8) | ((unsigned char)(firw_data[caddress+2])); + for (n=0; n<40; n++) + { + np = sim->create_part(-3, x, y, PT_EMBR); + if (np>-1) + { + magnitude = ((rand()%60)+40)*0.05f; + angle = (rand()%6284)*0.001f;//(in radians, between 0 and 2*pi) + parts[np].vx = parts[i].vx + cosf(angle)*magnitude; + parts[np].vy = parts[i].vy + sinf(angle)*magnitude - 2.5f; + parts[np].ctype = col; + parts[np].tmp = 1; + parts[np].life = rand()%40+70; + parts[np].temp = (rand()%500)+5750.0f; + parts[np].dcolour = parts[i].dcolour; + } + } + sim->pv[y/CELL][x/CELL] += 8.0f; sim->kill_part(i); return 1; - } else if (parts[i].tmp>=3) { - if (parts[i].life<=0) { - sim->kill_part(i); - return 1; - } } return 0; } @@ -117,33 +112,7 @@ int Element_FIRW::update(UPDATE_FUNC_ARGS) int Element_FIRW::graphics(GRAPHICS_FUNC_ARGS) { - if(cpart->tmp>=3) - { - int caddress = restrict_flt(restrict_flt((float)(cpart->tmp-4), 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - *colr = 0;//(unsigned char)firw_data[caddress]; - *colg = 0;//(unsigned char)firw_data[caddress+1]; - *colb = 0;//(unsigned char)firw_data[caddress+2]; - - if (ren->decorations_enable && cpart->dcolour) - { - int a = (cpart->dcolour>>24)&0xFF; - *colr = (a*((cpart->dcolour>>16)&0xFF) + (255-a)**colr) >> 8; - *colg = (a*((cpart->dcolour>>8)&0xFF) + (255-a)**colg) >> 8; - *colb = (a*((cpart->dcolour)&0xFF) + (255-a)**colb) >> 8; - } - - *firea = cpart->life*4; - if(*firea > 240) - *firea = 240; - *firer = *colr; - *fireg = *colg; - *fireb = *colb; - - *pixel_mode = PMODE_NONE; //Clear default, don't draw pixel - *pixel_mode |= FIRE_ADD; - //Returning 0 means dynamic, do not cache - } - else if(cpart->tmp > 0) + if(cpart->tmp > 0) { *pixel_mode |= PMODE_GLOW; } |
