1 #include "simulation/ElementCommon.h"
2 
3 static int update(UPDATE_FUNC_ARGS);
4 
Element_O2()5 void Element::Element_O2()
6 {
7 	Identifier = "DEFAULT_PT_O2";
8 	Name = "OXYG";
9 	Colour = PIXPACK(0x80A0FF);
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.1f;
19 	Gravity = 0.0f;
20 	Diffusion = 3.0f;
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 = 70;
32 	Description = "Oxygen gas. Ignites easily.";
33 
34 	Properties = TYPE_GAS;
35 
36 	LowPressure = IPL;
37 	LowPressureTransition = NT;
38 	HighPressure = IPH;
39 	HighPressureTransition = NT;
40 	LowTemperature = 90.0f;
41 	LowTemperatureTransition = PT_LO2;
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;
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 
59 				if (TYP(r)==PT_FIRE)
60 				{
61 					parts[ID(r)].temp += RNG::Ref().between(0, 99);
62 					if (parts[ID(r)].tmp & 0x01)
63 						parts[ID(r)].temp = 3473;
64 					parts[ID(r)].tmp |= 2;
65 
66 					sim->create_part(i,x,y,PT_FIRE);
67 					parts[i].temp += RNG::Ref().between(0, 99);
68 					parts[i].tmp |= 2;
69 				}
70 				else if (TYP(r)==PT_PLSM && !(parts[ID(r)].tmp&4))
71 				{
72 					sim->create_part(i,x,y,PT_FIRE);
73 					parts[i].temp += RNG::Ref().between(0, 99);
74 					parts[i].tmp |= 2;
75 				}
76 			}
77 	if (parts[i].temp > 9973.15 && sim->pv[y/CELL][x/CELL] > 250.0f)
78 	{
79 		int gravPos = ((y/CELL)*(XRES/CELL))+(x/CELL);
80 		float gravx = sim->gravx[gravPos];
81 		float gravy = sim->gravy[gravPos];
82 		if (gravx*gravx + gravy*gravy > 400)
83 		{
84 			if (RNG::Ref().chance(1, 5))
85 			{
86 				int j;
87 				sim->create_part(i,x,y,PT_BRMT);
88 
89 				j = sim->create_part(-3,x,y,PT_NEUT);
90 				if (j != -1)
91 					parts[j].temp = MAX_TEMP;
92 				j = sim->create_part(-3,x,y,PT_PHOT);
93 				if (j != -1)
94 				{
95 					parts[j].temp = MAX_TEMP;
96 					parts[j].tmp = 0x1;
97 				}
98 				rx = x + RNG::Ref().between(-1, 1), ry = y + RNG::Ref().between(-1, 1), r = TYP(pmap[ry][rx]);
99 				if (sim->can_move[PT_PLSM][r] || r == PT_O2)
100 				{
101 					j = sim->create_part(-3,rx,ry,PT_PLSM);
102 					if (j > -1)
103 					{
104 						parts[j].temp = MAX_TEMP;
105 						parts[j].tmp |= 4;
106 					}
107 				}
108 				j = sim->create_part(-3,x,y,PT_GRVT);
109 				if (j != -1)
110 					parts[j].temp = MAX_TEMP;
111 				parts[i].temp = MAX_TEMP;
112 				sim->pv[y/CELL][x/CELL] = 256;
113 			}
114 		}
115 	}
116 	return 0;
117 }
118