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