1 #include "simulation/ElementCommon.h"
2
3 static int update(UPDATE_FUNC_ARGS);
4 static int graphics(GRAPHICS_FUNC_ARGS);
5 static void create(ELEMENT_CREATE_FUNC_ARGS);
6
Element_ELEC()7 void Element::Element_ELEC()
8 {
9 Identifier = "DEFAULT_PT_ELEC";
10 Name = "ELEC";
11 Colour = PIXPACK(0xDFEFFF);
12 MenuVisible = 1;
13 MenuSection = SC_NUCLEAR;
14 Enabled = 1;
15
16 Advection = 0.0f;
17 AirDrag = 0.00f * CFDS;
18 AirLoss = 1.00f;
19 Loss = 1.00f;
20 Collision = -0.99f;
21 Gravity = 0.0f;
22 Diffusion = 0.00f;
23 HotAir = 0.000f * CFDS;
24 Falldown = 0;
25
26 Flammable = 0;
27 Explosive = 0;
28 Meltable = 0;
29 Hardness = 0;
30
31 Weight = -1;
32
33 DefaultProperties.temp = R_TEMP + 200.0f + 273.15f;
34 HeatConduct = 251;
35 Description = "Electrons. Sparks electronics, reacts with NEUT and WATR.";
36
37 Properties = TYPE_ENERGY|PROP_LIFE_DEC|PROP_LIFE_KILL_DEC;
38
39 LowPressure = IPL;
40 LowPressureTransition = NT;
41 HighPressure = IPH;
42 HighPressureTransition = NT;
43 LowTemperature = ITL;
44 LowTemperatureTransition = NT;
45 HighTemperature = ITH;
46 HighTemperatureTransition = NT;
47
48 Update = &update;
49 Graphics = &graphics;
50 Create = &create;
51 }
52
update(UPDATE_FUNC_ARGS)53 static int update(UPDATE_FUNC_ARGS)
54 {
55 int r, rt, rx, ry, nb, rrx, rry;
56 for (rx=-2; rx<=2; rx++)
57 for (ry=-2; ry<=2; ry++)
58 if (BOUNDS_CHECK) {
59 r = pmap[y+ry][x+rx];
60 if (!r)
61 r = sim->photons[y+ry][x+rx];
62 if (!r)
63 continue;
64 rt = TYP(r);
65 switch (rt)
66 {
67 case PT_GLAS:
68 for (rrx=-1; rrx<=1; rrx++)
69 for (rry=-1; rry<=1; rry++)
70 if (x+rx+rrx>=0 && y+ry+rry>=0 && x+rx+rrx<XRES && y+ry+rry<YRES) {
71 nb = sim->create_part(-1, x+rx+rrx, y+ry+rry, PT_EMBR);
72 if (nb!=-1) {
73 parts[nb].tmp = 0;
74 parts[nb].life = 50;
75 parts[nb].temp = parts[i].temp*0.8f;
76 parts[nb].vx = RNG::Ref().between(-10, 10);
77 parts[nb].vy = RNG::Ref().between(-10, 10);
78 }
79 }
80 sim->kill_part(i);
81 return 1;
82 case PT_LCRY:
83 parts[ID(r)].tmp2 = RNG::Ref().between(5, 9);
84 break;
85 case PT_WATR:
86 case PT_DSTW:
87 case PT_SLTW:
88 case PT_CBNW:
89 if (RNG::Ref().chance(1, 3))
90 sim->create_part(ID(r), x+rx, y+ry, PT_O2);
91 else
92 sim->create_part(ID(r), x+rx, y+ry, PT_H2);
93 sim->kill_part(i);
94 return 1;
95 case PT_PROT: // this is the correct reaction, not NEUT, but leaving NEUT in anyway
96 if (parts[ID(r)].tmp2 & 0x1)
97 break;
98 case PT_NEUT:
99 sim->part_change_type(ID(r), x+rx, y+ry, PT_H2);
100 parts[ID(r)].life = 0;
101 parts[ID(r)].ctype = 0;
102 sim->kill_part(i);
103 break;
104 case PT_DEUT:
105 if(parts[ID(r)].life < 6000)
106 parts[ID(r)].life += 1;
107 parts[ID(r)].temp = 0;
108 sim->kill_part(i);
109 return 1;
110 case PT_EXOT:
111 parts[ID(r)].tmp2 += 5;
112 parts[ID(r)].life = 1000;
113 break;
114 case PT_NONE: //seems to speed up ELEC even if it isn't used
115 break;
116 default:
117 if ((sim->elements[rt].Properties & PROP_CONDUCTS) && (rt!=PT_NBLE||parts[i].temp<2273.15))
118 {
119 sim->create_part(-1, x+rx, y+ry, PT_SPRK);
120 sim->kill_part(i);
121 return 1;
122 }
123 break;
124 }
125 }
126 return 0;
127 }
128
graphics(GRAPHICS_FUNC_ARGS)129 static int graphics(GRAPHICS_FUNC_ARGS)
130 {
131 *firea = 70;
132 *firer = *colr;
133 *fireg = *colg;
134 *fireb = *colb;
135
136 *pixel_mode |= FIRE_ADD;
137 return 0;
138 }
139
create(ELEMENT_CREATE_FUNC_ARGS)140 static void create(ELEMENT_CREATE_FUNC_ARGS)
141 {
142 float a = RNG::Ref().between(0, 359) * 3.14159f / 180.0f;
143 sim->parts[i].life = 680;
144 sim->parts[i].vx = 2.0f * cosf(a);
145 sim->parts[i].vy = 2.0f * sinf(a);
146 }
147