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;
42 uses maps
, drop
, items_store
, items
;
44 furnace_b
: array [0..MAX_FURNACE
] of boolean;
45 furnace_item
, furnace_sum
: array [0..MAX_FURNACE
, 0..MAX_FURNACE_CELLS
] of integer;
46 furnace_fstart
, furnace_ftime
, furnace_prstart
: array [0..MAX_FURNACE
] of integer;
49 maxFuel
, maxRecipe
:integer;
50 fuel_item
, fuel_time
: array [0..0] of integer;
51 recept_in
, recept_out
: array [0..0] of integer;
53 function getTime
:integer;
60 time
:=getRelativeTimeMs
;
63 function startFuelTime(i
:integer):integer;
65 startFuelTime
:=furnace_fstart
[i
];
68 function endFuelTime(i
:integer):integer;
70 endFuelTime
:=furnace_fstart
[i
]+furnace_ftime
[i
];
73 function FuelTime(i
:integer):integer;
75 FuelTime
:=furnace_ftime
[i
];
78 procedure updateFuelTime(fueltime
, i
:integer);
80 furnace_fstart
[i
]:=getTime
;
81 furnace_ftime
[i
]:=fueltime
;
84 function startProgTime(i
:integer):integer;
86 startProgTime
:=furnace_prstart
[i
];
89 function endProgTime(i
:integer):integer;
91 endProgTime
:=furnace_prstart
[i
]+ITEM_IN_FIRE
;
94 function ProgTime(i
:integer):integer;
96 ProgTime
:=ITEM_IN_FIRE
;
99 procedure setMaxFuel(i
:integer;);
106 putstatic field
'furnace', 'fuel_item', '[I';
111 putstatic field
'furnace', 'fuel_time', '[I';
115 procedure setMaxRecipes(i
:integer);
122 putstatic field
'furnace', 'recept_in', '[I';
127 putstatic field
'furnace', 'recept_out', '[I';
131 procedure initFuel(id
, item
, time
:integer);
137 procedure initRecipe(id
, in_item
, out_item
:integer);
139 recept_in
[id
]:=in_item
;
140 recept_out
[id
]:=out_item
;
143 procedure ResetProgress(furid
:integer);
145 furnace_prstart
[furid
]:=getTime
;
148 function GetFurItem(cell
, furid
:integer;):integer;
150 GetFurItem
:=furnace_item
[furid
, cell
];
153 procedure SetFurItem(val
, cell
, furid
:integer;);
155 furnace_item
[furid
, cell
]:=val
;
158 function GetFurSum(cell
, furid
:integer;):integer;
160 GetFurSum
:=furnace_sum
[furid
, cell
];
163 procedure SetFurSum(val
, cell
, furid
:integer;);
165 furnace_sum
[furid
, cell
]:=val
;
168 function FurCellIsNull(cell
, furid
:integer;):boolean;
170 if (GetFurItem(cell
, furid
)<1) or (GetFurSum(cell
, furid
)<1) then
174 procedure fixNull(cell
, furid
:integer;);
176 if FurCellIsNull(cell
, furid
) then
178 SetFurItem(0, cell
, furid
);
179 SetFurSum(0, cell
, furid
);
183 function CreateFurnace(x
, y
:integer;):integer;
187 for i
:=0 to MAX_FURNACE
do
188 if furnace_b
[i
]=false then
191 for j
:=0 to MAX_FURNACE_CELLS
do
193 furnace_item
[i
, j
]:=0;
194 furnace_sum
[i
, j
]:=0;
196 furnace_fstart
[i
]:=getTime
;
198 furnace_prstart
[i
]:=getTime
;
203 CreateFurnace
:=FURNACE_ERROR
;
206 function FindFuel(furid
:integer):integer;
210 if FurCellIsNull(FURNACE_FUEL
, furid
)=false then
211 for i
:=0 to maxFuel
do
212 if GetFurItem(FURNACE_FUEL
, furid
)=fuel_item
[i
] then
217 FindFuel
:=FURNACE_ERROR
;
220 procedure DestroyFurnace(x
, y
:integer);
226 for j
:=0 to MAX_FURNACE_CELLS
do
228 if FurCellIsNull(j
, i
)=false then
229 drop
.create(furnace_item
[i
, j
], furnace_sum
[i
, j
], x
*16+4, y
*16+4)
230 furnace_item
[i
, j
]:=0;
231 furnace_sum
[i
, j
]:=0;
233 furnace_fstart
[i
]:=getTime
;
235 furnace_prstart
[i
]:=getTime
;
238 function GetReceptOut(in_item
:integer;):integer;
242 for i
:=0 to maxRecipe
do
243 if in_item
=recept_in
[i
] then
245 GetReceptOut
:=recept_out
[i
];
248 GetReceptOut
:=FURNACE_ERROR
;
251 function canUpdate(i
:integer):boolean;
253 itemIN
, itemOUT
, sumOUT
, recipeOUT
:integer;
255 fixNull(FURNACE_IN
, i
);
256 fixNull(FURNACE_OUT
, i
);
258 itemIN
:=GetFurItem(FURNACE_IN
, i
);
259 itemOUT
:=GetFurItem(FURNACE_OUT
, i
);
260 sumOUT
:=GetFurSum(FURNACE_OUT
, i
);
261 recipeOUT
:=GetReceptOut(itemIN
);
263 if (itemIN
<>0) and (recipeOUT
<>FURNACE_ERROR
) then
264 if (itemOUT
=0) or ((itemOUT
=recipeOUT
) and (sumOUT
<getItemMax(itemOUT
))) then
268 function furnaceBurn(i
:integer):boolean;
270 if (getTime
>=startFuelTime(i
)) and (getTime
<=endFuelTime(i
)) then
274 function itemBurn(i
:integer):boolean;
276 if FurCellIsNull(FURNACE_IN
, i
)=false then
277 if (getTime
>=startProgTime(i
)) and (getTime
<=endProgTime(i
)) then
281 procedure useFuel(i
:integer;);
283 fuelid
, item
, sum
:integer;
286 item
:=GetFurItem(FURNACE_FUEL
, i
);
287 sum
:=GetFurSum(FURNACE_FUEL
, i
);
289 if getItemDiv(item
) then
301 updateFuelTime(fuel_time
[fuelid
], i
);
303 SetFurItem(item
, FURNACE_FUEL
, i
);
304 SetFurSum(sum
, FURNACE_FUEL
, i
);
307 procedure createOutItem(i
:integer);
309 itemIN
, sumIN
, itemOUT
, sumOUT
, recipeOUT
:integer;
311 itemIN
:=GetFurItem(FURNACE_IN
, i
);
312 sumIN
:=GetFurSum(FURNACE_IN
, i
);
313 itemOUT
:=GetFurItem(FURNACE_OUT
, i
);
314 sumOUT
:=GetFurSum(FURNACE_OUT
, i
);
315 recipeOUT
:=GetReceptOut(itemIN
);
317 if getItemDiv(itemIN
) then
332 SetFurItem(itemIN
, FURNACE_IN
, i
);
333 SetFurSum(sumIN
, FURNACE_IN
, i
);
334 SetFurItem(itemOUT
, FURNACE_OUT
, i
);
335 SetFurSum(sumOUT
, FURNACE_OUT
, i
);
338 procedure UpdateFurnaces
;
342 for i
:=0 to MAX_FURNACE
do
346 if furnaceBurn(i
) then
348 if itemBurn(i
)=false then
357 if fuelid
=FURNACE_ERROR
then