Achieved by adding a new element property called CarriesTypeIn, whose bits signal to save loading code which properties of particles of the element class in question carry element IDs. The bits in this property are numbered the same way as sim.FIELD_* constants for consistency. One would signal from Lua that a custom element carries element IDs in its tmp like this: elem.property(id, "CarriesTypeIn", 2 ^ sim.FIELD_TMP) "Carrying an element ID in a property" is to be interpreted as follows: the property is treated as a combination of a PMAPBITS-bit (so, currently 9-bit) unsigned integer lower part holding an element ID and a 32-PMAPBITS-bit (so, currently 23-bit) signed integer upper part holding whatever makes sense for the element. CONV, for example, uses this signed integer in its ctype as the extra "v" parameter for particle creation.
124 lines
3.0 KiB
C++
124 lines
3.0 KiB
C++
#include "simulation/ElementCommon.h"
|
|
|
|
void Element_SOAP_detach(Simulation * sim, int i);
|
|
static int update(UPDATE_FUNC_ARGS);
|
|
static int graphics(GRAPHICS_FUNC_ARGS);
|
|
static bool ctypeDraw(CTYPEDRAW_FUNC_ARGS);
|
|
|
|
void Element::Element_STOR()
|
|
{
|
|
Identifier = "DEFAULT_PT_STOR";
|
|
Name = "STOR";
|
|
Colour = PIXPACK(0x50DFDF);
|
|
MenuVisible = 1;
|
|
MenuSection = SC_POWERED;
|
|
Enabled = 1;
|
|
|
|
Advection = 0.0f;
|
|
AirDrag = 0.00f * CFDS;
|
|
AirLoss = 0.90f;
|
|
Loss = 0.00f;
|
|
Collision = 0.0f;
|
|
Gravity = 0.0f;
|
|
Diffusion = 0.00f;
|
|
HotAir = 0.000f * CFDS;
|
|
Falldown = 0;
|
|
|
|
Flammable = 0;
|
|
Explosive = 0;
|
|
Meltable = 0;
|
|
Hardness = 1;
|
|
|
|
Weight = 100;
|
|
|
|
HeatConduct = 0;
|
|
Description = "Storage. Captures and stores a single particle. Releases when charged with PSCN, also passes to PIPE.";
|
|
|
|
Properties = TYPE_SOLID | PROP_NOCTYPEDRAW;
|
|
CarriesTypeIn = (1U << FIELD_CTYPE) | (1U << FIELD_TMP);
|
|
|
|
LowPressure = IPL;
|
|
LowPressureTransition = NT;
|
|
HighPressure = IPH;
|
|
HighPressureTransition = NT;
|
|
LowTemperature = ITL;
|
|
LowTemperatureTransition = NT;
|
|
HighTemperature = ITH;
|
|
HighTemperatureTransition = NT;
|
|
|
|
Update = &update;
|
|
Graphics = &graphics;
|
|
CtypeDraw = &ctypeDraw;
|
|
}
|
|
|
|
static int update(UPDATE_FUNC_ARGS)
|
|
{
|
|
int r, rx, ry, np, rx1, ry1;
|
|
if (!sim->IsElementOrNone(parts[i].tmp))
|
|
parts[i].tmp = 0;
|
|
if(parts[i].life && !parts[i].tmp)
|
|
parts[i].life--;
|
|
for (rx=-2; rx<3; rx++)
|
|
for (ry=-2; ry<3; ry++)
|
|
if (BOUNDS_CHECK && (rx || ry))
|
|
{
|
|
r = pmap[y+ry][x+rx];
|
|
if ((ID(r))>=NPART || !r)
|
|
continue;
|
|
if (!parts[i].tmp && !parts[i].life && TYP(r)!=PT_STOR && !(sim->elements[TYP(r)].Properties&TYPE_SOLID) && (!parts[i].ctype || TYP(r)==parts[i].ctype))
|
|
{
|
|
if (TYP(r) == PT_SOAP)
|
|
Element_SOAP_detach(sim, ID(r));
|
|
parts[i].tmp = parts[ID(r)].type;
|
|
parts[i].temp = parts[ID(r)].temp;
|
|
parts[i].tmp2 = parts[ID(r)].life;
|
|
parts[i].tmp3 = parts[ID(r)].tmp;
|
|
parts[i].tmp4 = parts[ID(r)].ctype;
|
|
sim->kill_part(ID(r));
|
|
}
|
|
if(parts[i].tmp && TYP(r)==PT_SPRK && parts[ID(r)].ctype==PT_PSCN && parts[ID(r)].life>0 && parts[ID(r)].life<4)
|
|
{
|
|
for(ry1 = 1; ry1 >= -1; ry1--){
|
|
for(rx1 = 0; rx1 >= -1 && rx1 <= 1; rx1 = -rx1-rx1+1){ // Oscillate the X starting at 0, 1, -1, 3, -5, etc (Though stop at -1)
|
|
np = sim->create_part(-1,x+rx1,y+ry1,TYP(parts[i].tmp));
|
|
if (np!=-1)
|
|
{
|
|
parts[np].temp = parts[i].temp;
|
|
parts[np].life = parts[i].tmp2;
|
|
parts[np].tmp = parts[i].tmp3;
|
|
parts[np].ctype = parts[i].tmp4;
|
|
parts[i].tmp = 0;
|
|
parts[i].life = 10;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int graphics(GRAPHICS_FUNC_ARGS)
|
|
{
|
|
if(cpart->tmp){
|
|
*pixel_mode |= PMODE_GLOW;
|
|
*colr = 0x50;
|
|
*colg = 0xDF;
|
|
*colb = 0xDF;
|
|
} else {
|
|
*colr = 0x20;
|
|
*colg = 0xAF;
|
|
*colb = 0xAF;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static bool ctypeDraw(CTYPEDRAW_FUNC_ARGS)
|
|
{
|
|
if (sim->elements[t].Properties & TYPE_SOLID)
|
|
{
|
|
return false;
|
|
}
|
|
return Element::basicCtypeDraw(CTYPEDRAW_FUNC_SUBCALL_ARGS);
|
|
}
|