From 44d70ec6b8497454873f5cb9b088a530e0d17003 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Wed, 18 Apr 2012 21:31:22 +0100 Subject: [PATCH] TPT: Alterations to TRON and fancy effects ffa5ccb666 --- src/elements/tron.cpp | 70 ++++++++++++++++++++++++++++------- src/simulation/Simulation.cpp | 5 +-- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/elements/tron.cpp b/src/elements/tron.cpp index 6830dab53..804b4b747 100644 --- a/src/elements/tron.cpp +++ b/src/elements/tron.cpp @@ -1,4 +1,4 @@ -#include "simulation\Element.h" +#include /* 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, + //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; } diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index e8c9d75a4..d5b4f6b9e 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -2029,12 +2029,9 @@ int Simulation::create_part(int p, int x, int y, int tv)//the function for creat } if (t==PT_TRON) { - int rr,rg,rb; int randhue = rand()%360; int randomdir = rand()%4; - HSV_to_RGB(randhue,255,255,&rr,&rg,&rb); - parts[i].dcolour = 255<<24 | rr<<16 | rg<<8 | rb; - parts[i].tmp = 1|(randomdir<<2);//set as a head and a direction + parts[i].tmp = 1|(randomdir<<5)|(randhue<<7);//set as a head and a direction parts[i].tmp2 = 4;//tail parts[i].life = 5; }