8 ITEM_IN_FIRE
=9950; // <== Костыль "исправляющий" тайминги. Должно быть 10000.
16 procedure setMaxFuel(i
:integer);
17 procedure setMaxRecipes(i
:integer);
18 procedure initFuel(id
, item
, time
:integer);
19 procedure initRecipe(id
, in_item
, out_item
:integer);
21 function getTime
:integer;
22 function startFuelTime(furid
:integer):integer;
23 function endFuelTime(furid
:integer):integer;
24 function startProgTime(furid
:integer):integer;
25 function endProgTime(furid
:integer):integer;
26 function FuelTime(i
:integer):integer;
27 function ProgTime(i
:integer):integer;
29 function GetFurItem(cell
, furid
:integer;):integer;
30 procedure SetFurItem(val
, cell
, furid
:integer;);
31 function GetFurSum(cell
, furid
:integer;):integer;
32 procedure SetFurSum(val
, cell
, furid
:integer;);
34 function CreateFurnace(x
, y
:integer;):integer;
35 procedure DestroyFurnace(x
, y
:integer);
36 procedure UpdateFurnaces
;
38 function furnaceBurn(i
:integer):boolean;
39 function itemBurn(i
:integer):boolean;
46 uses maps
, drop
, items_store
, items
, jsr75i
, func
;
49 furnace_b
: array [0..MAX_FURNACE
] of boolean;
50 furnace_item
, furnace_sum
: array [0..MAX_FURNACE
, 0..MAX_FURNACE_CELLS
] of integer;
51 furnace_fstart
, furnace_ftime
, furnace_prstart
: array [0..MAX_FURNACE
] of integer;
54 maxFuel
, maxRecipe
:integer;
55 fuel_item
, fuel_time
: array [0..0] of integer;
56 recept_in
, recept_out
: array [0..0] of integer;
58 function getTime
:integer;
65 time
:=getRelativeTimeMs
;
68 function startFuelTime(i
:integer):integer;
70 startFuelTime
:=furnace_fstart
[i
];
73 function endFuelTime(i
:integer):integer;
75 endFuelTime
:=furnace_fstart
[i
]+furnace_ftime
[i
];
78 function FuelTime(i
:integer):integer;
80 FuelTime
:=furnace_ftime
[i
];
83 procedure updateFuelTime(fueltime
, i
:integer);
85 furnace_fstart
[i
]:=getTime
;
86 furnace_ftime
[i
]:=fueltime
;
89 function startProgTime(i
:integer):integer;
91 startProgTime
:=furnace_prstart
[i
];
94 function endProgTime(i
:integer):integer;
96 endProgTime
:=furnace_prstart
[i
]+ITEM_IN_FIRE
;
99 function ProgTime(i
:integer):integer;
101 ProgTime
:=ITEM_IN_FIRE
;
104 procedure setMaxFuel(i
:integer;);
111 putstatic field
'furnace', 'fuel_item', '[I';
116 putstatic field
'furnace', 'fuel_time', '[I';
120 procedure setMaxRecipes(i
:integer);
127 putstatic field
'furnace', 'recept_in', '[I';
132 putstatic field
'furnace', 'recept_out', '[I';
136 procedure initFuel(id
, item
, time
:integer);
142 procedure initRecipe(id
, in_item
, out_item
:integer);
144 recept_in
[id
]:=in_item
;
145 recept_out
[id
]:=out_item
;
148 procedure ResetProgress(furid
:integer);
150 furnace_prstart
[furid
]:=getTime
;
153 function GetFurItem(cell
, furid
:integer;):integer;
155 GetFurItem
:=furnace_item
[furid
, cell
];
158 procedure SetFurItem(val
, cell
, furid
:integer;);
160 furnace_item
[furid
, cell
]:=val
;
163 function GetFurSum(cell
, furid
:integer;):integer;
165 GetFurSum
:=furnace_sum
[furid
, cell
];
168 procedure SetFurSum(val
, cell
, furid
:integer;);
170 furnace_sum
[furid
, cell
]:=val
;
173 function FurCellIsNull(cell
, furid
:integer;):boolean;
175 if (GetFurItem(cell
, furid
)<1) or (GetFurSum(cell
, furid
)<1) then
179 procedure fixNull(cell
, furid
:integer;);
181 if FurCellIsNull(cell
, furid
) then
183 SetFurItem(0, cell
, furid
);
184 SetFurSum(0, cell
, furid
);
188 function CreateFurnace(x
, y
:integer;):integer;
192 for i
:=0 to MAX_FURNACE
do
193 if furnace_b
[i
]=false then
196 for j
:=0 to MAX_FURNACE_CELLS
do
198 furnace_item
[i
, j
]:=0;
199 furnace_sum
[i
, j
]:=0;
201 furnace_fstart
[i
]:=getTime
;
203 furnace_prstart
[i
]:=getTime
;
208 CreateFurnace
:=FURNACE_ERROR
;
211 function FindFuel(furid
:integer):integer;
215 if FurCellIsNull(FURNACE_FUEL
, furid
)=false then
216 for i
:=0 to maxFuel
do
217 if GetFurItem(FURNACE_FUEL
, furid
)=fuel_item
[i
] then
222 FindFuel
:=FURNACE_ERROR
;
225 procedure DestroyFurnace(x
, y
:integer);
231 for j
:=0 to MAX_FURNACE_CELLS
do
233 if FurCellIsNull(j
, i
)=false then
234 drop
.create(furnace_item
[i
, j
], furnace_sum
[i
, j
], x
*16+4, y
*16+4)
235 furnace_item
[i
, j
]:=0;
236 furnace_sum
[i
, j
]:=0;
238 furnace_fstart
[i
]:=getTime
;
240 furnace_prstart
[i
]:=getTime
;
243 function GetReceptOut(in_item
:integer;):integer;
247 for i
:=0 to maxRecipe
do
248 if in_item
=recept_in
[i
] then
250 GetReceptOut
:=recept_out
[i
];
253 GetReceptOut
:=FURNACE_ERROR
;
256 function canUpdate(i
:integer):boolean;
258 itemIN
, itemOUT
, sumOUT
, recipeOUT
:integer;
260 fixNull(FURNACE_IN
, i
);
261 fixNull(FURNACE_OUT
, i
);
263 itemIN
:=GetFurItem(FURNACE_IN
, i
);
264 itemOUT
:=GetFurItem(FURNACE_OUT
, i
);
265 sumOUT
:=GetFurSum(FURNACE_OUT
, i
);
266 recipeOUT
:=GetReceptOut(itemIN
);
268 if (itemIN
<>0) and (recipeOUT
<>FURNACE_ERROR
) then
269 if (itemOUT
=0) or ((itemOUT
=recipeOUT
) and (sumOUT
<getItemMax(itemOUT
))) then
273 function furnaceBurn(i
:integer):boolean;
275 if (getTime
>=startFuelTime(i
)) and (getTime
<=endFuelTime(i
)) then
279 function itemBurn(i
:integer):boolean;
281 if FurCellIsNull(FURNACE_IN
, i
)=false then
282 if (getTime
>=startProgTime(i
)) and (getTime
<=endProgTime(i
)) then
286 procedure useFuel(i
:integer;);
288 fuelid
, item
, sum
:integer;
291 item
:=GetFurItem(FURNACE_FUEL
, i
);
292 sum
:=GetFurSum(FURNACE_FUEL
, i
);
294 if getItemDiv(item
) then
306 updateFuelTime(fuel_time
[fuelid
], i
);
308 SetFurItem(item
, FURNACE_FUEL
, i
);
309 SetFurSum(sum
, FURNACE_FUEL
, i
);
312 procedure createOutItem(i
:integer);
314 itemIN
, sumIN
, itemOUT
, sumOUT
, recipeOUT
:integer;
316 itemIN
:=GetFurItem(FURNACE_IN
, i
);
317 sumIN
:=GetFurSum(FURNACE_IN
, i
);
318 itemOUT
:=GetFurItem(FURNACE_OUT
, i
);
319 sumOUT
:=GetFurSum(FURNACE_OUT
, i
);
320 recipeOUT
:=GetReceptOut(itemIN
);
322 if getItemDiv(itemIN
) then
337 SetFurItem(itemIN
, FURNACE_IN
, i
);
338 SetFurSum(sumIN
, FURNACE_IN
, i
);
339 SetFurItem(itemOUT
, FURNACE_OUT
, i
);
340 SetFurSum(sumOUT
, FURNACE_OUT
, i
);
343 procedure UpdateFurnaces
;
347 for i
:=0 to MAX_FURNACE
do
351 if furnaceBurn(i
) then
353 if itemBurn(i
)=false then
362 if fuelid
=FURNACE_ERROR
then
378 for i
:= 0 to MAX_FURNACE
do
380 writebool(furnace_b
[i
]);
381 for j
:= 0 to MAX_FURNACE_CELLS
do
383 write_byte(furnace_item
[i
, j
]);
384 writeint(furnace_sum
[i
, j
]);
386 writeint(furnace_fstart
[i
]);
387 writeint(furnace_ftime
[i
]);
388 writeint(furnace_prstart
[i
]);
396 for i
:= 0 to MAX_FURNACE
do
398 furnace_b
[i
] := readbool
;
399 for j
:= 0 to MAX_FURNACE_CELLS
do
401 furnace_item
[i
, j
] := read_byte
;
402 furnace_sum
[i
, j
] := readint
;
404 furnace_fstart
[i
] := readint
;
405 furnace_ftime
[i
] := readint
;
406 furnace_prstart
[i
] := readint
;
414 for i
:= 0 to MAX_FURNACE
do
416 furnace_b
[i
] := false;
417 for j
:= 0 to MAX_FURNACE_CELLS
do
419 furnace_item
[i
, j
] := 0;
420 furnace_sum
[i
, j
] := 0;
422 furnace_fstart
[i
] := 0;
423 furnace_ftime
[i
] := 0;
424 furnace_prstart
[i
] := 0;