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