summaryrefslogtreecommitdiff
path: root/src/elements/tron.cpp
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-04-18 20:31:22 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-04-18 20:31:22 (GMT)
commit44d70ec6b8497454873f5cb9b088a530e0d17003 (patch)
treecc15b1c9ced2c6dd9e0c9bd422a95d2c0c318e05 /src/elements/tron.cpp
parente4d1c7141fdc362629c239ff31f97df37a3b92f9 (diff)
downloadpowder-44d70ec6b8497454873f5cb9b088a530e0d17003.zip
powder-44d70ec6b8497454873f5cb9b088a530e0d17003.tar.gz
TPT: Alterations to TRON and fancy effects ffa5ccb666
Diffstat (limited to 'src/elements/tron.cpp')
-rw-r--r--src/elements/tron.cpp68
1 files changed, 55 insertions, 13 deletions
diff --git a/src/elements/tron.cpp b/src/elements/tron.cpp
index 6830dab..804b4b7 100644
--- a/src/elements/tron.cpp
+++ b/src/elements/tron.cpp
@@ -1,4 +1,4 @@
-#include "simulation\Element.h"
+#include <element.h>
/* TRON element is meant to resemble a tron bike (or worm) moving around and trying to avoid obstacles itself.
* It has four direction each turn to choose from, 0 (left) 1 (up) 2 (right) 3 (down).
@@ -12,14 +12,16 @@
* - +<----+---->+ - -
* - - - - H - - - - -
* Where H is the head with tail length 4, it checks the + area to see if it can hit any of the edges, then it is called safe, or picks the biggest area if none safe.
- * .tmp bit values: 0 tail , 1 head , 2 no tail growth , 4-8 is direction , 16 is wait flag
+ * .tmp bit values: 1st head, 2nd no tail growth, 3rd wait flag, 4th Nodie, 5th Dying, 6th & 7th is direction, 8th - 16th hue
* .tmp2 is tail length (gets longer every few hundred frames)
* .life is the timer that kills the end of the tail (the head uses life for how often it grows longer)
+ * .ctype Contains the colour, lost on save, regenerated using hue tmp (bits 7 - 16)
*/
#define TRON_HEAD 1
#define TRON_NOGROW 2
-#define TRON_WAIT 16 //it was just created, so WAIT a frame
-#define TRON_NODIE 32
+#define TRON_WAIT 4 //it was just created, so WAIT a frame
+#define TRON_NODIE 8
+#define TRON_DEATH 16 //Crashed, now dying
int tron_rx[4] = {-1, 0, 1, 0};
int tron_ry[4] = { 0,-1, 0, 1};
int new_tronhead(Simulation * sim, int x, int y, int i, int direction)
@@ -33,13 +35,13 @@ int new_tronhead(Simulation * sim, int x, int y, int i, int direction)
sim->parts[i].life = 5;
}
//give new head our properties
- sim->parts[np].tmp = 1 | direction<<2 | sim->parts[i].tmp&(TRON_NOGROW|TRON_NODIE);
+ sim->parts[np].tmp = 1 | direction<<5 | sim->parts[i].tmp&(TRON_NOGROW|TRON_NODIE) | (sim->parts[i].tmp&0xF800);
if (np > i)
sim->parts[np].tmp |= TRON_WAIT;
+ sim->parts[np].ctype = sim->parts[i].ctype;
sim->parts[np].tmp2 = sim->parts[i].tmp2;
sim->parts[np].life = sim->parts[i].life + 2;
- sim->parts[np].dcolour = sim->parts[i].dcolour;
return 1;
}
int trymovetron(Simulation * sim, int x, int y, int dir, int i, int len)
@@ -59,7 +61,7 @@ int trymovetron(Simulation * sim, int x, int y, int dir, int i, int len)
for (tx = rx - tron_ry[dir] , ty = ry - tron_rx[dir], j=1; abs(tx-rx) < (len-k) && abs(ty-ry) < (len-k); tx-=tron_ry[dir],ty-=tron_rx[dir],j++)
{
r = sim->pmap[ty][tx];
- if (!r && !sim->bmap[(ty)/CELL][(tx)/CELL] && ry > CELL && rx > CELL && ry < YRES-CELL && rx < XRES-CELL)
+ if (!r && !sim->bmap[(ty)/CELL][(tx)/CELL] && ty > CELL && tx > CELL && ty < YRES-CELL && tx < XRES-CELL)
{
if (j == (len-k))//there is a safe path, so we can break out
return len+1;
@@ -71,7 +73,7 @@ int trymovetron(Simulation * sim, int x, int y, int dir, int i, int len)
for (tx = rx + tron_ry[dir] , ty = ry + tron_rx[dir], j=1; abs(tx-rx) < (len-k) && abs(ty-ry) < (len-k); tx+=tron_ry[dir],ty+=tron_rx[dir],j++)
{
r = sim->pmap[ty][tx];
- if (!r && !sim->bmap[(ty)/CELL][(tx)/CELL] && ry > CELL && rx > CELL && ry < YRES-CELL && rx < XRES-CELL)
+ if (!r && !sim->bmap[(ty)/CELL][(tx)/CELL] && ty > CELL && tx > CELL && ty < YRES-CELL && tx < XRES-CELL)
{
if (j == (len-k))
return len+1;
@@ -88,15 +90,23 @@ int trymovetron(Simulation * sim, int x, int y, int dir, int i, int len)
}
int update_TRON(UPDATE_FUNC_ARGS) {
int r, rx, ry, np;
+ if(!parts[i].ctype)
+ {
+ int r, g, b;
+ int hue = (parts[i].tmp&0xF800)>>7;
+ HSV_to_RGB(hue,255,255,&r,&g,&b);
+ parts[i].ctype = r<<16 | g<<8 | b;
+ //Use photon-like wavelength?
+ }
if (parts[i].tmp&TRON_WAIT)
{
- parts[i].tmp -= TRON_WAIT;
+ parts[i].tmp &= ~TRON_WAIT;
return 0;
}
if (parts[i].tmp&TRON_HEAD)
{
int firstdircheck = 0,seconddir,seconddircheck = 0,lastdir,lastdircheck = 0;
- int direction = (parts[i].tmp>>2 & 0x3);
+ int direction = (parts[i].tmp>>5 & 0x3);
int originaldir = direction;
//random turn
@@ -133,20 +143,52 @@ int update_TRON(UPDATE_FUNC_ARGS) {
//now try making new head, even if it fails
if (new_tronhead(sim,x + tron_rx[direction],y + tron_ry[direction],i,direction) == -1)
{
- //ohgod crash, <sparkle effect start here>
+ //ohgod crash
+ parts[i].tmp |= TRON_DEATH;
//trigger tail death for TRON_NODIE, or is that mode even needed? just set a high tail length(but it still won't start dying when it crashes)
}
//set own life and clear .tmp (it dies if it can't move anyway)
parts[i].life = parts[i].tmp2;
- parts[i].tmp = 0;
+ parts[i].tmp &= parts[i].tmp&0xF810;
}
else // fade tail deco, or prevent tail from dieing
{
if (parts[i].tmp&TRON_NODIE)
parts[i].life++;
- parts[i].dcolour = clamp_flt((float)parts[i].life/(float)parts[i].tmp2,0,1.0f) << 24 | parts[i].dcolour&0x00FFFFFF;
+ //parts[i].dcolour = clamp_flt((float)parts[i].life/(float)parts[i].tmp2,0,1.0f) << 24 | parts[i].dcolour&0x00FFFFFF;
}
+ return 0;
+}
+int graphics_TRON(GRAPHICS_FUNC_ARGS) {
+ if(cpart->tmp & TRON_HEAD)
+ *pixel_mode |= PMODE_GLOW;
+ if(cpart->ctype)
+ {
+ *colr = (cpart->ctype & 0xFF0000)>>16;
+ *colg = (cpart->ctype & 0x00FF00)>>8;
+ *colb = (cpart->ctype & 0x0000FF);
+ }
+ else
+ {
+ *colr = 255;
+ *colg = 255;
+ *colb = 255;
+ }
+ if(cpart->tmp & TRON_DEATH)
+ {
+ *pixel_mode |= FIRE_ADD | PMODE_FLARE;
+ *firer = *colr;
+ *fireg = *colg;
+ *fireb = *colb;
+ *firea = 255;
+ }
+ if(cpart->life < cpart->tmp2 && !(cpart->tmp & TRON_HEAD))
+ {
+ *pixel_mode |= PMODE_BLEND;
+ *pixel_mode &= ~PMODE_FLAT;
+ *cola = (int)((((float)cpart->life)/((float)cpart->tmp2))*255.0f);
+ }
return 0;
}