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