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