summaryrefslogtreecommitdiff
path: root/src/simulation/elements/VIRS.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/simulation/elements/VIRS.cpp')
-rw-r--r--src/simulation/elements/VIRS.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/simulation/elements/VIRS.cpp b/src/simulation/elements/VIRS.cpp
new file mode 100644
index 0000000..a4a8800
--- /dev/null
+++ b/src/simulation/elements/VIRS.cpp
@@ -0,0 +1,145 @@
+#include "simulation/Elements.h"
+//#TPT-Directive ElementClass Element_VIRS PT_VIRS 174
+Element_VIRS::Element_VIRS()
+{
+ Identifier = "DEFAULT_PT_VIRS";
+ Name = "VIRS";
+ Colour = PIXPACK(0xFE11F6);
+ MenuVisible = 1;
+ MenuSection = SC_LIQUID;
+ Enabled = 1;
+
+ Advection = 0.6f;
+ AirDrag = 0.01f * CFDS;
+ AirLoss = 0.98f;
+ Loss = 0.95f;
+ Collision = 0.0f;
+ Gravity = 0.1f;
+ Diffusion = 0.00f;
+ HotAir = 0.000f * CFDS;
+ Falldown = 2;
+
+ Flammable = 100;
+ Explosive = 0;
+ Meltable = 0;
+ Hardness = 20;
+
+ Weight = 31;
+
+ Temperature = 72.0f + 273.15f;
+ HeatConduct = 251;
+ Description = "Virus. Turns everything it touches into virus.";
+
+ State = ST_LIQUID;
+ Properties = TYPE_LIQUID|PROP_DEADLY;
+
+ LowPressure = IPL;
+ LowPressureTransition = NT;
+ HighPressure = IPH;
+ HighPressureTransition = NT;
+ LowTemperature = 305.0f;
+ LowTemperatureTransition = PT_VRSS;
+ HighTemperature = 673.0f;
+ HighTemperatureTransition = PT_VRSG;
+
+ Update = &Element_VIRS::update;
+
+}
+
+//#TPT-Directive ElementHeader Element_VIRS static int update(UPDATE_FUNC_ARGS)
+int Element_VIRS::update(UPDATE_FUNC_ARGS)
+{
+ //pavg[0] measures how many frames until it is cured (0 if still actively spreading and not being cured)
+ //pavg[1] measures how many frames until it dies
+ int r, rx, ry, rndstore = rand();
+ if (parts[i].pavg[0])
+ {
+ parts[i].pavg[0] -= (rndstore&0x1) ? 0:1;
+ //has been cured, so change back into the original element
+ if (!parts[i].pavg[0])
+ {
+ sim->part_change_type(i,x,y,parts[i].tmp2);
+ parts[i].tmp2 = 0;
+ parts[i].pavg[0] = 0;
+ parts[i].pavg[1] = 0;
+ return 0;
+ }
+ }
+ //decrease pavg[1] so it slowly dies
+ if (parts[i].pavg[1] > 0)
+ {
+ if (((rndstore>>1)&0xD) < 1)
+ {
+ parts[i].pavg[1]--;
+ //if pavg[1] is now 0 and it's not in the process of being cured, kill it
+ if (!parts[i].pavg[1] && !parts[i].pavg[0])
+ {
+ sim->kill_part(i);
+ return 1;
+ }
+ }
+ }
+
+ //none of the things in the below loop happen while virus is being cured
+ if (parts[i].pavg[0])
+ return 0;
+
+ for (rx=-1; rx<2; rx++)
+ {
+ //reset rndstore, one random can last through 3 locations and reduce rand() calling by up to 6x as much
+ rndstore = rand();
+ for (ry=-1; ry<2; ry++)
+ {
+ if (BOUNDS_CHECK && (rx || ry))
+ {
+ r = pmap[y+ry][x+rx];
+ if (!r)
+ continue;
+
+ //spread "being cured" state
+ if (((r&0xFF) == PT_VIRS || (r&0xFF) == PT_VRSS || (r&0xFF) == PT_VRSG) && parts[r>>8].pavg[0])
+ {
+ parts[i].pavg[0] = parts[r>>8].pavg[0] + (((rndstore&0x7)>>1) ? 2:1);
+ rndstore = rndstore >> 3;
+ return 0;
+ }
+ //soap cures virus
+ else if ((r&0xFF) == PT_SOAP)
+ {
+ parts[i].pavg[0] += 10;
+ if (!((rndstore&0x7)>>1))
+ sim->kill_part(r>>8);
+ return 0;
+ }
+ //transforms things into virus here
+ else if ((r&0xFF) != PT_VIRS && (r&0xFF) != PT_VRSS && (r&0xFF) != PT_VRSG && (r&0xFF) != PT_DMND)
+ {
+ if (!((rndstore&0xF)>>1))
+ {
+ parts[r>>8].tmp2 = (r&0xFF);
+ parts[r>>8].pavg[0] = 0;
+ if (parts[i].pavg[1])
+ parts[r>>8].pavg[1] = parts[i].pavg[1] + ((rndstore>>4) ? 1:0);
+ else
+ parts[r>>8].pavg[1] = 0;
+ if (parts[r>>8].temp < 305.0f)
+ sim->part_change_type(r>>8,x,y,PT_VRSS);
+ else if (parts[r>>8].temp > 673.0f)
+ sim->part_change_type(r>>8,x,y,PT_VRSG);
+ else
+ sim->part_change_type(r>>8,x,y,PT_VIRS);
+ }
+ rndstore = rndstore >> 5;
+ }
+ //protons make VIRS last forever
+ else if ((sim->photons[y+ry][x+rx]&0xFF) == PT_PROT)
+ {
+ parts[i].pavg[1] = 0;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+Element_VIRS::~Element_VIRS() {}