DEADSOFTWARE

Rewrited module for particles
[cavecraft.git] / src / cellui.mpsrc
1 unit cellui;
3 interface
4 const
5 CONST_MAX_LAYERS=1;
6 CONST_MAX_CELLS=63;
7 CONST_MAX_OFFSETS=1;
8 CONST_MAX_CURS=1;
9 CONST_MAX_INFO=2;
11 CELL_TYPE_NULL=0;
12 CELL_TYPE_PLAYER_INV=1;
13 CELL_TYPE_CREWATIVE_INV=2;
14 CELL_TYPE_CHEST=3;
15 CELL_TYPE_FASTCRAFT=4;
16 CELL_TYPE_FURNACE=5;
18 CELL_FLAG_OFFSET=$F;
19 CELL_FLAG_INDICATOR=$10;
21 CUR_SELECT1=0;
22 CUR_SELECT2=1;
24 WINDOW_NULL=0;
26 FIND_CELL_UP=0;
27 FIND_CELL_DOWN=1;
28 FIND_CELL_LEFT=2;
29 FIND_CELL_RIGHT=3;
31 CELL_W=16;
32 CELL_H=16;
34 procedure ClearLayer(n:integer);
35 procedure LoadCurImg(img:image; i:integer;);
37 procedure NewLayer;
38 procedure DelLayer;
39 function CellLayer:integer;
40 procedure setCellLayer(n:integer);
42 procedure initCell(cell_type, id, offset, data, x, y:integer; indicator:boolean;);
43 function getCellID(i:integer):integer;
44 function getCellData(i:integer):integer;
45 function getCellX(i:integer):integer;
46 function getCellY(i:integer):integer;
47 procedure setOffset(newOffset, i:integer;);//i - номер смещения
48 function getOffset(i:integer):integer;//i - номер смещения
49 function getCellOffset(i:integer):integer;
51 function getItem(i:integer):integer;
52 procedure setItem(val, i:integer);
53 function getSum(i:integer):integer;
54 procedure setSum(val, i:integer);
55 procedure fixNullCell(i:integer;);
57 procedure DrawCellLayer(i, x, y:integer);
59 procedure SetWindowInfo(n, i:integer);
60 function GetWindowInfo(i:integer):integer;
61 procedure SetCur(i:integer);
62 function GetCur:integer;
64 procedure SetCurIndex(n, i:integer);
65 function GetCurIndex(i:integer):integer;
66 procedure SetCurActive(n:boolean; i:integer);
67 function GetCurActive(i:integer):boolean;
68 procedure SetWindowType(wtype:integer);
69 function GetWindowType:integer;
71 procedure DrawCursors(n, x, y:integer);
73 procedure ShiftCurrentCur(find:integer;);
75 function FindCurrentWindowsType:boolean;
77 implementation
78 uses vars, Canvas, items, console, furnace, chest, inv, func, items_store;
79 var
80 layer:integer;
81 last_cell: array [0..CONST_MAX_LAYERS] of integer;
82 inv_type: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;//Name of virtual massive
83 inv_id: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;//ID of real item massive
84 inv_x, inv_y: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;
85 inv_data: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;
86 inv_flags: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;
88 inv_offset: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_OFFSETS] of integer;//Offset of real item id in inventory
90 WindowType: array [0..CONST_MAX_LAYERS] of integer;
91 WindowInfo: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_INFO] of integer;
93 WindowCurCurrent: array [0..CONST_MAX_LAYERS] of integer;
94 WindowCurImg: array [0..CONST_MAX_CURS] of image;
95 WindowCurIndex: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CURS] of integer;
96 WindowCurActive: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CURS] of boolean;
98 {=====[Inventory interface functions]=====}
99 procedure ClearLayer(n:integer);
100 var
101 i:integer;
102 begin
103 for i:=0 to CONST_MAX_CELLS do
104 begin
105 last_cell[n]:=0;
106 inv_type[n, i]:=CELL_TYPE_NULL;
107 inv_id[n, i]:=0;
108 inv_x[n, i]:=0;
109 inv_y[n, i]:=0;
110 inv_data[n, i]:=0;
111 inv_flags[n, i]:=0;
112 end;
114 for i:=0 to CONST_MAX_OFFSETS do
115 inv_offset[n, i]:=0;
117 WindowType[n]:=WINDOW_NULL;
118 WindowCurCurrent[n]:=0;
119 for i:=0 to CONST_MAX_INFO do
120 WindowInfo[n, i]:=0;
121 for i:=0 to CONST_MAX_CURS do
122 begin
123 WindowCurIndex[n, i]:=0;
124 WindowCurActive[n, i]:=false;
125 end;
126 end;
128 procedure LoadCurImg(img:image; i:integer;);
129 begin
130 WindowCurImg[i]:=img;
131 end;
133 procedure NewLayer;
134 begin
135 layer:=layer+1;
136 end;
138 procedure DelLayer;
139 begin
140 ClearLayer(layer);
141 layer:=layer-1;
142 end;
144 function CellLayer:integer;
145 begin
146 CellLayer:=layer;
147 end;
149 procedure setCellLayer(n:integer);
150 begin
151 layer:=n;
152 end;
154 procedure initCell(cell_type, id, offset, data, x, y:integer; indicator:boolean;);
155 var
156 i:integer;
157 begin
158 i:=last_cell[layer];
159 last_cell[layer]:=last_cell[layer]+1;
161 inv_type[layer, i]:=cell_type;
162 inv_id[layer, i]:=id;
163 inv_x[layer, i]:=x;
164 inv_y[layer, i]:=y;
165 inv_data[layer, i]:=data;
167 inv_flags[layer, i]:=(offset and CELL_FLAG_OFFSET);
169 if indicator then
170 inv_flags[layer, i]:=inv_flags[layer, i] or CELL_FLAG_INDICATOR;
171 end;
173 function getCellType(i:integer):integer;
174 begin
175 getCellType:=inv_type[layer, i];
176 end;
178 function getCellX(i:integer):integer;
179 begin
180 getCellX:=inv_x[layer, i];
181 end;
183 function getCellY(i:integer):integer;
184 begin
185 getCellY:=inv_y[layer, i];
186 end;
188 function getCellID(i:integer):integer;
189 begin
190 getCellID:=inv_id[layer, i];
191 end;
193 function getCellData(i:integer):integer;
194 begin
195 getCellData:=inv_data[layer, i];
196 end;
198 function getCellFlagIndicator(i, j:integer):boolean;
199 begin
200 getCellFlagIndicator:=(inv_flags[i, j] and CELL_FLAG_INDICATOR)>0;
201 end;
203 procedure setOffset(newOffset, i:integer;);
204 begin
205 inv_offset[layer, i]:=newOffset;
206 end;
208 function getOffset(i:integer):integer;
209 begin
210 getOffset:=inv_offset[layer, i];
211 end;
213 function getCellOffset(i:integer):integer;
214 begin
215 getCellOffset:=inv_flags[layer, i] and CELL_FLAG_OFFSET;
216 end;
218 function getItemIdx(i, n:integer):integer;
219 var
220 id, data, _type:integer;
221 begin
222 id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET];
223 _type:=inv_type[n, i];
224 data:=inv_data[n, i];
226 if _type=CELL_TYPE_PLAYER_INV then
227 getItemIdx:=inv.getItem(id);
228 else
229 if _type=CELL_TYPE_CREWATIVE_INV then
230 getItemIdx:=getItemList(id);
231 else
232 if _type=CELL_TYPE_CHEST then
233 getItemIdx:=chest.getItem(id, data);
234 else
235 if _type=CELL_TYPE_FASTCRAFT then
236 getItemIdx:=getCraftOutItem(id);
237 else
238 if _type=CELL_TYPE_FURNACE then
239 getItemIdx:=GetFurItem(id, data);
240 end;
242 procedure setItemIdx(val, i, n:integer);
243 var
244 id, data, _type:integer;
245 begin
246 id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET];
247 _type:=inv_type[n, i];
248 data:=inv_data[n, i];
250 if _type=CELL_TYPE_PLAYER_INV then
251 inv.setItem(val, id);
252 else
253 if _type=CELL_TYPE_CHEST then
254 chest.setItem(val, id, data);
255 else
256 if _type=CELL_TYPE_FURNACE then
257 SetFurItem(val, id, data);
258 end;
260 function getSumIdx(i, n:integer):integer;
261 var
262 id, data, _type:integer;
263 begin
264 id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET];
265 _type:=inv_type[n, i];
266 data:=inv_data[n, i];
268 if _type=CELL_TYPE_PLAYER_INV then
269 getSumIdx:=inv.getSum(id);
270 else
271 if _type=CELL_TYPE_CREWATIVE_INV then
272 getSumIdx:=getItemMax(getItemList(id));
273 else
274 if _type=CELL_TYPE_CHEST then
275 getSumIdx:=chest.getSum(id, data);
276 else
277 if _type=CELL_TYPE_FASTCRAFT then
278 getSumIdx:=getCraftOutSum(id);
279 else
280 if _type=CELL_TYPE_FURNACE then
281 getSumIdx:=GetFurSum(id, data);
282 end;
284 procedure setSumIdx(val, i, n:integer);
285 var
286 id, data, _type:integer;
287 begin
288 id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET];
289 _type:=inv_type[n, i];
290 data:=inv_data[n, i];
292 if _type=CELL_TYPE_PLAYER_INV then
293 inv.setSum(val, id);
294 else
295 if _type=CELL_TYPE_CHEST then
296 chest.setSum(val, id, data);
297 else
298 if _type=CELL_TYPE_FURNACE then
299 SetFurSum(val, id, data);
300 end;
302 //i - индекс в таблице ячеек
303 function getItem(i:integer):integer;
304 begin
305 getItem:=getItemIdx(i, CellLayer);
306 end;
308 procedure setItem(val, i:integer);
309 begin
310 setItemIdx(val, i, CellLayer);
311 end;
313 function getSum(i:integer):integer;
314 begin
315 getSum:=getSumIdx(i, CellLayer);
316 end;
318 procedure setSum(val, i:integer);
319 begin
320 setSumIdx(val, i, CellLayer);
321 end;
323 procedure fixNullCell(i:integer);
324 begin
325 if (getItem(i)<1) or (getSum(i)<1) then
326 begin
327 setItem(0, i);
328 setSum(0, i);
329 end;
330 end;
332 procedure DrawCellLayer(i, x, y:integer);
333 var
334 j:integer;
335 begin
336 for j:=0 to CONST_MAX_CELLS do
337 if inv_type[i, j]<>CELL_TYPE_NULL then
338 begin
339 drawItem(getItemIdx(j, i), getSumIdx(j, i), x+inv_x[i, j], y+inv_y[i, j], getCellFlagIndicator(i, j));
340 end;
341 end;
343 {======[]======}
345 procedure SetWindowInfo(n, i:integer);
346 begin
347 WindowInfo[CellLayer, i]:=n;
348 end;
350 function GetWindowInfo(i:integer):integer;
351 begin
352 GetWindowInfo:=WindowInfo[CellLayer, i];
353 end;
355 procedure SetCur(i:integer);
356 begin
357 WindowCurCurrent[CellLayer]:=i;
358 end;
360 function GetCur:integer;
361 begin
362 GetCur:=WindowCurCurrent[CellLayer];
363 end;
365 procedure SetCurIndex(n, i:integer);
366 begin
367 WindowCurIndex[CellLayer, i]:=n;
368 end;
370 function GetCurIndex(i:integer):integer;
371 begin
372 GetCurIndex:=WindowCurIndex[CellLayer, i];
373 end;
375 procedure SetCurActive(n:boolean; i:integer);
376 begin
377 WindowCurActive[CellLayer, i]:=n;
378 end;
380 function GetCurActive(i:integer):boolean;
381 begin
382 GetCurActive:=WindowCurActive[CellLayer, i];
383 end;
385 procedure SetWindowType(wtype:integer);
386 begin
387 WindowType[CellLayer]:=wtype;
388 end;
390 function GetWindowType:integer;
391 var
392 tmp:integer;
393 begin
394 tmp:=CellLayer;
395 if CellLayer<0 then
396 GetWindowType:=WINDOW_NULL;
397 else
398 GetWindowType:=WindowType[CellLayer];
399 end;
401 function FindCurrentWindowsType:boolean;
402 var
403 crrwt, i:integer;
404 begin
405 crrwt:=GetWindowType;
406 for i:=0 to CONST_MAX_LAYERS do
407 if (WindowType[i]=crrwt) and (i<>CellLayer) then
408 begin
409 FindCurrentWindowsType:=true;
410 exit;
411 end;
412 end;
414 procedure DrawCursors(n, x, y:integer);
415 var
416 i, idx:integer;
417 begin
418 for i:=0 to CONST_MAX_CURS do
419 if WindowCurActive[n, i] then
420 begin
421 idx:=WindowCurIndex[n, i];
422 DrawImage(WindowCurImg[i], x+inv_x[n, idx], y+inv_y[n, idx]);
423 end;
424 end;
426 procedure ShiftCurrentCur(find:integer;);
427 var
428 find_i, find_x, find_y:integer;
429 res_i, res_x, res_y:integer;
430 i, tmp_x, tmp_y:integer;
431 begin
432 find_i:=GetCurIndex(GetCur);
433 find_x:=getCellX(find_i);
434 find_y:=getCellY(find_i);
435 res_i:=find_i;
436 if find=FIND_CELL_UP then
437 res_y:=-2147483647;
438 if find=FIND_CELL_DOWN then
439 res_y:=2147483647;
440 if find=FIND_CELL_LEFT then
441 res_x:=-2147483647;
442 if find=FIND_CELL_RIGHT then
443 res_x:=2147483647;
445 for i:=0 to CONST_MAX_CELLS do
446 if (getCellType(i)<>CELL_TYPE_NULL) and (i<>find_i) then
447 begin
448 tmp_x:=getCellX(i);
449 tmp_y:=getCellY(i);
450 //debug('['+i+']: tmp_y='+tmp_y+'; res_y='+res_y+';');
451 if find=FIND_CELL_UP then
452 begin
453 if (tmp_y<find_y) and (tmp_y>res_y) and (tmp_x>=find_x-CELL_W/2) and (tmp_x<=find_x+CELL_W+CELL_W/2) then
454 res_i:=i;
455 end;
457 if find=FIND_CELL_DOWN then
458 begin
459 if ((tmp_y>find_y) and (tmp_y<res_y)) and (tmp_x>=find_x-CELL_W/2) and (tmp_x<=find_x+CELL_W+CELL_W/2) then
460 res_i:=i;
461 end;
463 if find=FIND_CELL_LEFT then
464 begin
465 //debug('LEFT ['+i+']: tmp_x='+tmp_x+'; find_x='+find_x+'; res_x='+res_x+';');
466 if (tmp_x<find_x) and (tmp_x>res_x) and (tmp_y>=find_y-CELL_H/2) and (tmp_y<=find_y+CELL_H+CELL_H/2) then
467 res_i:=i;
468 end;
470 if find=FIND_CELL_RIGHT then
471 begin
472 //debug('RIGHT ['+i+']: tmp_x='+tmp_x+'; find_x='+find_x+'; res_x='+res_x+';');
473 if (tmp_x>find_x) and (tmp_x<res_x) and (tmp_y>=find_y-CELL_H/2) and (tmp_y<=find_y+CELL_H+CELL_H/2) then
474 res_i:=i;
475 end;
478 if res_i<>find_i then
479 begin
480 res_x:=getCellX(res_i);
481 res_y:=getCellY(res_i);
482 end;
483 end;
484 SetCurIndex(res_i, GetCur);
485 end;
487 initialization
488 layer:=-1;
489 WindowCurImg[0]:=loadimage('/terrain/sun.png');
490 WindowCurImg[1]:=loadimage('/terrain/moon_phases/moon_phase_0.png');
491 end.