1 #include "simulation/ElementCommon.h"
2
3 static int update(UPDATE_FUNC_ARGS);
4 static int graphics(GRAPHICS_FUNC_ARGS);
5
Element_SPNG()6 void Element::Element_SPNG()
7 {
8 Identifier = "DEFAULT_PT_SPNG";
9 Name = "SPNG";
10 Colour = PIXPACK(0xFFBE30);
11 MenuVisible = 1;
12 MenuSection = SC_SOLIDS;
13 Enabled = 1;
14
15 Advection = 0.00f;
16 AirDrag = 0.00f * CFDS;
17 AirLoss = 0.00f;
18 Loss = 0.00f;
19 Collision = 0.00f;
20 Gravity = 0.0f;
21 Diffusion = 0.00f;
22 HotAir = 0.000f * CFDS;
23 Falldown = 0;
24
25 Flammable = 20;
26 Explosive = 0;
27 Meltable = 0;
28 Hardness = 30;
29
30 Weight = 100;
31
32 HeatConduct = 251;
33 Description = "Sponge, absorbs water. Is not a moving solid.";
34
35 Properties = TYPE_SOLID;
36
37 LowPressure = IPL;
38 LowPressureTransition = NT;
39 HighPressure = IPH;
40 HighPressureTransition = NT;
41 LowTemperature = ITL;
42 LowTemperatureTransition = NT;
43 HighTemperature = 2730.0f;
44 HighTemperatureTransition = PT_FIRE;
45
46 Update = &update;
47 Graphics = &graphics;
48 }
49
update(UPDATE_FUNC_ARGS)50 static int update(UPDATE_FUNC_ARGS)
51 {
52 int r, trade, rx, ry, tmp, np;
53 int limit = 50;
54 if (parts[i].life<limit && sim->pv[y/CELL][x/CELL]<=3&&sim->pv[y/CELL][x/CELL]>=-3&&parts[i].temp<=374.0f)
55 {
56 int absorbChanceDenom = parts[i].life*10000/limit + 500;
57 for (rx=-1; rx<2; rx++)
58 for (ry=-1; ry<2; ry++)
59 if (BOUNDS_CHECK && (rx || ry))
60 {
61 r = pmap[y+ry][x+rx];
62 switch TYP(r)
63 {
64 case PT_WATR:
65 case PT_DSTW:
66 case PT_FRZW:
67 if (parts[i].life<limit && RNG::Ref().chance(500, absorbChanceDenom))
68 {
69 parts[i].life++;
70 sim->kill_part(ID(r));
71 }
72 break;
73 case PT_SLTW:
74 if (parts[i].life<limit && RNG::Ref().chance(50, absorbChanceDenom))
75 {
76 parts[i].life++;
77 if (RNG::Ref().chance(3, 4))
78 sim->kill_part(ID(r));
79 else
80 sim->part_change_type(ID(r), x+rx, y+ry, PT_SALT);
81 }
82 break;
83 case PT_CBNW:
84 if (parts[i].life<limit && RNG::Ref().chance(100, absorbChanceDenom))
85 {
86 parts[i].life++;
87 sim->part_change_type(ID(r), x+rx, y+ry, PT_CO2);
88 }
89 break;
90 case PT_PSTE:
91 if (parts[i].life<limit && RNG::Ref().chance(20, absorbChanceDenom))
92 {
93 parts[i].life++;
94 sim->create_part(ID(r), x+rx, y+ry, PT_CLST);
95 }
96 break;
97 default:
98 continue;
99 }
100 }
101 }
102 else
103 for (rx=-1; rx<2; rx++)
104 for (ry=-1; ry<2; ry++)
105 if (BOUNDS_CHECK && (rx || ry))
106 {
107 r = pmap[y+ry][x+rx];
108 if ((!r)&&parts[i].life>=1)//if nothing then create water
109 {
110 np = sim->create_part(-1,x+rx,y+ry,PT_WATR);
111 if (np>-1) parts[i].life--;
112 }
113 }
114 for ( trade = 0; trade<9; trade ++)
115 {
116 rx = RNG::Ref().between(-2, 2);
117 ry = RNG::Ref().between(-2, 2);
118 if (BOUNDS_CHECK && (rx || ry))
119 {
120 r = pmap[y+ry][x+rx];
121 if (!r)
122 continue;
123 if (TYP(r)==PT_SPNG&&(parts[i].life>parts[ID(r)].life)&&parts[i].life>0)//diffusion
124 {
125 tmp = parts[i].life - parts[ID(r)].life;
126 if (tmp ==1)
127 {
128 parts[ID(r)].life ++;
129 parts[i].life --;
130 trade = 9;
131 }
132 else if (tmp>0)
133 {
134 parts[ID(r)].life += tmp/2;
135 parts[i].life -= tmp/2;
136 trade = 9;
137 }
138 }
139 }
140 }
141 tmp = 0;
142 if (parts[i].life>0)
143 {
144 for (rx=-1; rx<2; rx++)
145 for (ry=-1; ry<2; ry++)
146 if (BOUNDS_CHECK && (rx || ry))
147 {
148 r = pmap[y+ry][x+rx];
149 if (!r)
150 continue;
151 if (TYP(r)==PT_FIRE)
152 {
153 tmp++;
154 if (parts[ID(r)].life>60)
155 parts[ID(r)].life -= parts[ID(r)].life/60;
156 else if (parts[ID(r)].life>2)
157 parts[ID(r)].life--;
158 }
159 }
160 }
161 if (tmp && parts[i].life>3)
162 parts[i].life -= parts[i].life/3;
163 if (tmp>1)
164 tmp = tmp/2;
165 if (tmp || parts[i].temp>=374)
166 for (rx=-1; rx<2; rx++)
167 for (ry=-1; ry<2; ry++)
168 if (BOUNDS_CHECK && (rx || ry))
169 {
170 r = pmap[y+ry][x+rx];
171 if ((!r)&&parts[i].life>=1)//if nothing then create steam
172 {
173 np = sim->create_part(-1,x+rx,y+ry,PT_WTRV);
174 if (np>-1)
175 {
176 parts[np].temp = parts[i].temp;
177 tmp--;
178 parts[i].life--;
179 parts[i].temp -= 20.0f;
180 }
181 }
182 }
183 if (tmp>0)
184 {
185 if (parts[i].life>tmp)
186 parts[i].life -= tmp;
187 else
188 parts[i].life = 0;
189 }
190 return 0;
191 }
192
graphics(GRAPHICS_FUNC_ARGS)193 static int graphics(GRAPHICS_FUNC_ARGS)
194 {
195 *colr -= cpart->life*15;
196 *colg -= cpart->life*15;
197 *colb -= cpart->life*15;
198 if (*colr<=50)
199 *colr = 50;
200 if (*colg<=50)
201 *colg = 50;
202 if (*colb<=20)
203 *colb = 20;
204 return 0;
205 }
206