Add element LITH (#726)
Co-authored-by: Tamás Bálint Misius <lbphacker@gmail.com>
This commit is contained in:
parent
62af7504b2
commit
a3f5731a43
@ -89,7 +89,16 @@ static int update(UPDATE_FUNC_ARGS)
|
|||||||
}
|
}
|
||||||
parts[i].temp += newtemp;
|
parts[i].temp += newtemp;
|
||||||
parts[i].life--;
|
parts[i].life--;
|
||||||
|
switch (rt)
|
||||||
|
{
|
||||||
|
case PT_LITH:
|
||||||
|
sim->part_change_type(ID(r), x + rx, y + ry, PT_H2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
sim->kill_part(ID(r));
|
sim->kill_part(ID(r));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (parts[i].life<=50)
|
else if (parts[i].life<=50)
|
||||||
|
253
src/simulation/elements/LITH.cpp
Normal file
253
src/simulation/elements/LITH.cpp
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
#include "simulation/ElementCommon.h"
|
||||||
|
|
||||||
|
static int update(UPDATE_FUNC_ARGS);
|
||||||
|
static int graphics(GRAPHICS_FUNC_ARGS);
|
||||||
|
|
||||||
|
void Element::Element_LITH()
|
||||||
|
{
|
||||||
|
Identifier = "DEFAULT_PT_LITH";
|
||||||
|
Name = "LITH";
|
||||||
|
Colour = PIXPACK(0xC0C0C0);
|
||||||
|
MenuVisible = 1;
|
||||||
|
MenuSection = SC_EXPLOSIVE;
|
||||||
|
Enabled = 1;
|
||||||
|
|
||||||
|
Advection = 0.2f;
|
||||||
|
AirDrag = 0.01f * CFDS;
|
||||||
|
AirLoss = 0.96f;
|
||||||
|
Loss = 0.95f;
|
||||||
|
Collision = -0.1f;
|
||||||
|
Gravity = 0.2f;
|
||||||
|
Diffusion = 0.00f;
|
||||||
|
HotAir = 0.000f * CFDS;
|
||||||
|
Falldown = 1;
|
||||||
|
|
||||||
|
Flammable = 0;
|
||||||
|
Explosive = 0;
|
||||||
|
Meltable = 0;
|
||||||
|
Hardness = 15;
|
||||||
|
|
||||||
|
Weight = 17;
|
||||||
|
|
||||||
|
HeatConduct = 70;
|
||||||
|
Description = "Lithium. Reactive element that explodes on contact with water.";
|
||||||
|
|
||||||
|
Properties = TYPE_PART | PROP_LIFE_DEC;
|
||||||
|
|
||||||
|
LowPressure = IPL;
|
||||||
|
LowPressureTransition = NT;
|
||||||
|
HighPressure = IPH;
|
||||||
|
HighPressureTransition = NT;
|
||||||
|
LowTemperature = ITL;
|
||||||
|
LowTemperatureTransition = NT;
|
||||||
|
HighTemperature = 453.65f;
|
||||||
|
HighTemperatureTransition = PT_LAVA;
|
||||||
|
|
||||||
|
Update = &update;
|
||||||
|
Graphics = &graphics;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
tmp2: carbonation factor
|
||||||
|
life: burn timer above 1000, spark cooldown timer otherwise
|
||||||
|
tmp: hydrogenation factor
|
||||||
|
ctype: absorbed energy
|
||||||
|
|
||||||
|
For game reasons, baseline LITH has the reactions of both its pure form and
|
||||||
|
its hydroxide, and also has basic li-ion battery-like behavior.
|
||||||
|
It absorbs CO2 like its hydroxide form, but can only be converted into GLAS
|
||||||
|
after having absorbed CO2.
|
||||||
|
|
||||||
|
If LITH comes in contact with water, it will consume 1 WATR, increment tmp,
|
||||||
|
and heat itself up by 400K. At 1000K it bursts into flames and sets tmp to 10
|
||||||
|
if still in contact with WATR, setting its life to 24 and insta-boiling
|
||||||
|
water in its immediate vincity.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int update(UPDATE_FUNC_ARGS)
|
||||||
|
{
|
||||||
|
Particle &self = parts[i];
|
||||||
|
|
||||||
|
int &hydrogenationFactor = self.tmp;
|
||||||
|
int &burnTimer = self.life;
|
||||||
|
int &carbonationFactor = self.tmp2;
|
||||||
|
int &storedEnergy = self.ctype;
|
||||||
|
if (storedEnergy < 0)
|
||||||
|
{
|
||||||
|
storedEnergy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool charged = false;
|
||||||
|
bool discharged = false;
|
||||||
|
for (int rx = -2; rx <= 2; ++rx)
|
||||||
|
{
|
||||||
|
for (int ry = -2; ry <= 2; ++ry)
|
||||||
|
{
|
||||||
|
if (BOUNDS_CHECK && (rx || ry))
|
||||||
|
{
|
||||||
|
int neighborData = pmap[y + ry][x + rx];
|
||||||
|
if (!neighborData)
|
||||||
|
{
|
||||||
|
if (burnTimer > 1012 && RNG::Ref().chance(1, 10))
|
||||||
|
{
|
||||||
|
sim->create_part(-1, x + rx, y + ry, PT_FIRE);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Particle &neighbor = parts[ID(neighborData)];
|
||||||
|
|
||||||
|
switch (TYP(neighborData))
|
||||||
|
{
|
||||||
|
case PT_SLTW:
|
||||||
|
case PT_WTRV:
|
||||||
|
case PT_WATR:
|
||||||
|
case PT_DSTW:
|
||||||
|
case PT_CBNW:
|
||||||
|
if (burnTimer > 1016)
|
||||||
|
{
|
||||||
|
sim->part_change_type(ID(neighborData), x + rx, y + ry, PT_WTRV);
|
||||||
|
neighbor.temp = 440.f;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (hydrogenationFactor + carbonationFactor >= 10)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (self.temp > 440.f)
|
||||||
|
{
|
||||||
|
burnTimer = 1024 + (storedEnergy > 24 ? 24 : storedEnergy);
|
||||||
|
sim->part_change_type(ID(neighborData), x + rx, y + ry, PT_H2);
|
||||||
|
hydrogenationFactor = 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.temp = restrict_flt(self.temp + 20.365f + storedEnergy * storedEnergy * 1.5f, MIN_TEMP, MAX_TEMP);
|
||||||
|
sim->part_change_type(ID(neighborData), x + rx, y + ry, PT_H2);
|
||||||
|
hydrogenationFactor += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT_CO2:
|
||||||
|
if (hydrogenationFactor + carbonationFactor >= 10)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sim->kill_part(ID(neighborData));
|
||||||
|
carbonationFactor += 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT_SPRK:
|
||||||
|
if (hydrogenationFactor + carbonationFactor >= 5)
|
||||||
|
{
|
||||||
|
continue; // too impure to do battery things.
|
||||||
|
}
|
||||||
|
if (neighbor.ctype == PT_PSCN && neighbor.life == 3 && !charged && !burnTimer)
|
||||||
|
{
|
||||||
|
charged = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT_NSCN:
|
||||||
|
if (neighbor.life == 0 && storedEnergy > 0 && !burnTimer)
|
||||||
|
{
|
||||||
|
sim->part_change_type(ID(neighborData), x + rx, y + ry, PT_SPRK);
|
||||||
|
neighbor.life = 4;
|
||||||
|
neighbor.ctype = PT_NSCN;
|
||||||
|
discharged = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT_FIRE:
|
||||||
|
if (self.temp > 440.f && RNG::Ref().chance(1, 40) && hydrogenationFactor < 6)
|
||||||
|
{
|
||||||
|
burnTimer = 1013;
|
||||||
|
hydrogenationFactor += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PT_O2:
|
||||||
|
if (burnTimer > 1000 && RNG::Ref().chance(1, 10))
|
||||||
|
{
|
||||||
|
sim->part_change_type(i, x, y, PT_PLSM);
|
||||||
|
sim->part_change_type(ID(neighborData), x + rx, y + ry, PT_PLSM);
|
||||||
|
sim->pv[y / CELL][x / CELL] += 4.0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (charged)
|
||||||
|
{
|
||||||
|
storedEnergy += 1;
|
||||||
|
burnTimer = 8;
|
||||||
|
}
|
||||||
|
if (discharged)
|
||||||
|
{
|
||||||
|
storedEnergy -= 1;
|
||||||
|
burnTimer = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int trade = 0; trade < 9; ++trade)
|
||||||
|
{
|
||||||
|
int rx = RNG::Ref().between(-3, 3);
|
||||||
|
int ry = RNG::Ref().between(-3, 3);
|
||||||
|
if (BOUNDS_CHECK && (rx || ry))
|
||||||
|
{
|
||||||
|
int neighborData = pmap[y + ry][x + rx];
|
||||||
|
if (TYP(neighborData) != PT_LITH)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Particle &neighbor = parts[ID(neighborData)];
|
||||||
|
|
||||||
|
int &neighborStoredEnergy = neighbor.ctype;
|
||||||
|
if (storedEnergy > neighborStoredEnergy)
|
||||||
|
{
|
||||||
|
int transfer = storedEnergy - neighborStoredEnergy;
|
||||||
|
transfer -= transfer / 2;
|
||||||
|
neighborStoredEnergy += transfer;
|
||||||
|
storedEnergy -= transfer;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self.temp > 440.f && burnTimer == 1000)
|
||||||
|
{
|
||||||
|
sim->part_change_type(i, x, y, PT_LAVA);
|
||||||
|
if (carbonationFactor < 3)
|
||||||
|
{
|
||||||
|
self.temp = 500.f;
|
||||||
|
self.ctype = PT_LITH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.temp = 2000.f;
|
||||||
|
self.ctype = PT_GLAS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int graphics(GRAPHICS_FUNC_ARGS)
|
||||||
|
{
|
||||||
|
if (cpart->life >= 1000)
|
||||||
|
{
|
||||||
|
int colour = 0xFFA040;
|
||||||
|
*colr = PIXR(colour);
|
||||||
|
*colg = PIXG(colour);
|
||||||
|
*colb = PIXB(colour);
|
||||||
|
*pixel_mode |= PMODE_FLARE | PMODE_GLOW;
|
||||||
|
}
|
||||||
|
else if (cpart->ctype && RNG::Ref().chance(cpart->ctype, 100))
|
||||||
|
{
|
||||||
|
int colour = 0x50A0FF;
|
||||||
|
*colr = PIXR(colour);
|
||||||
|
*colg = PIXG(colour);
|
||||||
|
*colb = PIXB(colour);
|
||||||
|
*pixel_mode |= PMODE_FLARE | PMODE_GLOW;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
@ -190,6 +190,7 @@ simulation_elem_ids = [
|
|||||||
[ 'PTNM', 188 ],
|
[ 'PTNM', 188 ],
|
||||||
[ 'VSNS', 189 ],
|
[ 'VSNS', 189 ],
|
||||||
[ 'ROCK', 190 ],
|
[ 'ROCK', 190 ],
|
||||||
|
[ 'LITH', 191 ],
|
||||||
]
|
]
|
||||||
|
|
||||||
simulation_elem_src = []
|
simulation_elem_src = []
|
||||||
|
Loading…
Reference in New Issue
Block a user