1 #include "simulation/ElementCommon.h"
2 
3 static int update(UPDATE_FUNC_ARGS);
4 
Element_H2()5 void Element::Element_H2()
6 {
7 	Identifier = "DEFAULT_PT_H2";
8 	Name = "HYGN";
9 	Colour = PIXPACK(0x5070FF);
10 	MenuVisible = 1;
11 	MenuSection = SC_GAS;
12 	Enabled = 1;
13 
14 	Advection = 2.0f;
15 	AirDrag = 0.00f * CFDS;
16 	AirLoss = 0.99f;
17 	Loss = 0.30f;
18 	Collision = -0.10f;
19 	Gravity = 0.00f;
20 	Diffusion = 3.00f;
21 	HotAir = 0.000f	* CFDS;
22 	Falldown = 0;
23 
24 	Flammable = 0;
25 	Explosive = 0;
26 	Meltable = 0;
27 	Hardness = 0;
28 
29 	Weight = 1;
30 
31 	HeatConduct = 251;
32 	Description = "Hydrogen. Combusts with OXYG to make WATR. Undergoes fusion at high temperature and pressure.";
33 
34 	Properties = TYPE_GAS;
35 
36 	LowPressure = IPL;
37 	LowPressureTransition = NT;
38 	HighPressure = IPH;
39 	HighPressureTransition = NT;
40 	LowTemperature = ITL;
41 	LowTemperatureTransition = NT;
42 	HighTemperature = ITH;
43 	HighTemperatureTransition = NT;
44 
45 	Update = &update;
46 }
47 
update(UPDATE_FUNC_ARGS)48 static int update(UPDATE_FUNC_ARGS)
49 {
50 	int r,rx,ry,rt;
51 	for (rx=-2; rx<3; rx++)
52 		for (ry=-2; ry<3; ry++)
53 			if (BOUNDS_CHECK && (rx || ry))
54 			{
55 				r = pmap[y+ry][x+rx];
56 				if (!r)
57 					continue;
58 				rt = TYP(r);
59 				if (sim->pv[y/CELL][x/CELL] > 8.0f && rt == PT_DESL) // This will not work. DESL turns to fire above 5.0 pressure
60 				{
61 					sim->part_change_type(ID(r),x+rx,y+ry,PT_WATR);
62 					sim->part_change_type(i,x,y,PT_OIL);
63 					return 1;
64 				}
65 				if (sim->pv[y/CELL][x/CELL] > 45.0f)
66 				{
67 					if (parts[ID(r)].temp > 2273.15)
68 						continue;
69 				}
70 				else
71 				{
72 					if (rt==PT_FIRE)
73 					{
74 						if(parts[ID(r)].tmp&0x02)
75 							parts[ID(r)].temp=3473.0f;
76 						else
77 							parts[ID(r)].temp=2473.15f;
78 						parts[ID(r)].tmp |= 1;
79 						sim->create_part(i,x,y,PT_FIRE);
80 						parts[i].temp += RNG::Ref().between(0, 99);
81 						parts[i].tmp |= 1;
82 						return 1;
83 					}
84 					else if ((rt==PT_PLSM && !(parts[ID(r)].tmp&4)) || (rt==PT_LAVA && parts[ID(r)].ctype != PT_BMTL))
85 					{
86 						sim->create_part(i,x,y,PT_FIRE);
87 						parts[i].temp += RNG::Ref().between(0, 99);
88 						parts[i].tmp |= 1;
89 						return 1;
90 					}
91 				}
92 			}
93 	if (parts[i].temp > 2273.15 && sim->pv[y/CELL][x/CELL] > 50.0f)
94 	{
95 		if (RNG::Ref().chance(1, 5))
96 		{
97 			int j;
98 			float temp = parts[i].temp;
99 			sim->create_part(i,x,y,PT_NBLE);
100 			parts[i].tmp = 0x1;
101 
102 			j = sim->create_part(-3,x,y,PT_NEUT);
103 			if (j>-1)
104 				parts[j].temp = temp;
105 			if (RNG::Ref().chance(1, 10))
106 			{
107 				j = sim->create_part(-3,x,y,PT_ELEC);
108 				if (j>-1)
109 					parts[j].temp = temp;
110 			}
111 			j = sim->create_part(-3,x,y,PT_PHOT);
112 			if (j>-1)
113 			{
114 				parts[j].ctype = 0x7C0000;
115 				parts[j].temp = temp;
116 				parts[j].tmp = 0x1;
117 			}
118 			rx = x + RNG::Ref().between(-1, 1), ry = y + RNG::Ref().between(-1, 1), rt = TYP(pmap[ry][rx]);
119 			if (sim->can_move[PT_PLSM][rt] || rt == PT_H2)
120 			{
121 				j = sim->create_part(-3,rx,ry,PT_PLSM);
122 				if (j>-1)
123 				{
124 					parts[j].temp = temp;
125 					parts[j].tmp |= 4;
126 				}
127 			}
128 			parts[i].temp = temp + RNG::Ref().between(750, 1249);
129 			sim->pv[y/CELL][x/CELL] += 30;
130 			return 1;
131 		}
132 	}
133 	return 0;
134 }
135