39 keymode
,updx
,updy
:integer;
40 seed
,nextseed
:integer;
43 light
:array [0..15] of image
;
44 bg
:array[0..1] of image
;
45 osad
:array [0..1,0..7] of image
;
46 back
:array [0..8] of image
;
47 gui
:array [0..34] of image
;
48 tue
:array [0..9] of image
;
55 toolus
,toolind
:integer;
62 msg
:array [0..4] of string;
63 msg_time
:array[0..4] of integer;
64 last_sleep_x
,last_sleep_y
:integer;
77 if nextseed
=0 then seed
:=getrelativetimems
; else seed
:=nextseed
;
80 if world_typ
=0 then genworld
;
82 if world_typ
=1 then genflat
;
84 player
.setX(get_spawn_x
*16+4);
85 player
.setY(get_spawn_y
*16);
89 procedure drwrect(x
,y
,w
,h
,t
:integer);
94 drawrect(x
+i
,y
+i
,w
-i
*2,h
-i
*2);
99 dt
:=GetRelativeTimeMs
- time
;
100 time
:=GetRelativeTimeMs
;
106 if fps
<s_max_fps
then if del
>0 then del
:=del
-1;
107 if fps
>s_max_fps
then if del
<200 then del
:=del
+1;
111 procedure cleartextures
;
120 for ix
:=0 to 7 do clock
[ix
]:=no
;
122 {for ix:=0 to maxBlockTex do
127 for ix:=0 to maxItemTex do
132 for ix
:=0 to 8 do back
[ix
]:=no
;
139 for ix
:=0 to 9 do tue
[ix
]:=no
;
141 for ix
:=0 to 7 do osad
[0,ix
]:=no
;
142 for ix
:=0 to 7 do osad
[1,ix
]:=no
;
144 for ix
:=0 to 15 do light
[ix
]:=no
;
168 for ix
:=0 to CONST_MAX_CURS
do
171 //resetVirtualKeyboard(-1);
174 procedure create_msg(s
:string);
181 msg_time
[i
]:=msg_time
[i
-1];
184 msg_time
[0]:=getrelativetimems
;
188 procedure loadtexture(path
:string);
194 im
:=ld_tex('background.png',path
,'title/');
196 bg
[ix
]:=rotate_image_from_image(im
,ix
*16,0,16,16,0);
197 float
:=ld_tex('float.png',path
,'gui/');
198 compas
:=ld_tex('compass.png',path
,'gui/');
199 im
:=ld_tex('clock.png',path
,'gui/');
201 clock
[ix
]:=rotate_image_from_image(im
,ix
*16,0,16,16,0);
202 if load_back_tex
then
204 im
:=ld_tex('back.png',path
,'');
205 for ix
:=0 to 8 do back
[ix
]:=rotate_image_from_image(im
,ix
*16,0,16,16,0);
208 player
.loadSkin('char_ani.png', path
);
211 im
:=ld_tex('gui.png',path
,'gui/');
212 gui
[0]:=rotate_image_from_image(im
,0,0,16,16,0);
213 LoadCurImg(gui
[0], CUR_SELECT1
);
214 gui
[1]:=rotate_image_from_image(im
,0,16,168,21,0);
215 gui
[3]:=rotate_image_from_image(im
,16,0,16,16,0);
216 LoadCurImg(gui
[3], CUR_SELECT2
);
217 gui
[6]:=rotate_image_from_image(im
,0,56,120,12,0);
218 gui
[7]:=rotate_image_from_image(im
,0,68,120,12,0);
219 gui
[8]:=rotate_image_from_image(im
,0,80,120,12,0);
220 gui
[13]:=rotate_image_from_image(im
,1,93,9,9,0);//hp
221 gui
[14]:=rotate_image_from_image(im
,12,93,9,9,0);//hp
222 gui
[15]:=rotate_image_from_image(im
,23,93,9,9,0);//hp
223 gui
[17]:=rotate_image_from_image(im
,120,56,18,18,0);
225 gui
[26]:=rotate_image_from_image(im
,89,93,9,9,0);//hunger
226 gui
[27]:=rotate_image_from_image(im
,100,93,9,9,0);//hunger
227 gui
[28]:=rotate_image_from_image(im
,111,93,9,9,0);//hunger
229 gui
[29]:=rotate_image_from_image(im
,67,93,9,9,0);//air
230 gui
[30]:=rotate_image_from_image(im
,78,93,9,9,0);//air
232 gui
[31]:=rotate_image_from_image(im
,122,93,9,9,0);//hp hardcore
233 gui
[32]:=rotate_image_from_image(im
,133,93,9,9,0);//hp hardcore
234 gui
[33]:=rotate_image_from_image(im
,144,93,9,9,0);//hp hardcore
236 gui
[20]:=rotate_image_from_image(im
,121,75,9,13,0);
237 gui
[21]:=rotate_image_from_image(im
,130,75,9,13,0);
238 gui
[22]:=rotate_image_from_image(im
,0,103,120,12,0);
240 if load_minimap_tex
then gui
[16]:=ld_tex('mapbg.png',path
,'gui/');
242 for ix
:=0 to 9 do tue
[ix
]:=rotate_image_from_image(im
,16*ix
,40,16,16,0);
244 if load_weather_tex
then
246 im
:=ld_tex('rain.png',path
,'terrain/');
247 for ix
:=0 to 7 do osad
[0,ix
]:=rotate_image_from_image(im
,16*ix
,0,16,16,0);
248 im
:=ld_tex('snow.png',path
,'terrain/');
249 for ix
:=0 to 7 do osad
[1,ix
]:=rotate_image_from_image(im
,16*ix
,0,16,16,0);
252 if load_light_tex
then
254 im
:=ld_tex('light.png',path
,'terrain/');
255 for ix
:=0 to 15 do light
[ix
]:=rotate_image_from_image(im
,16*ix
,0,16,16,0);
258 if load_particles_tex
then
260 im
:=ld_tex('particles.png',path
,'terrain/');
263 pr_1
[ix
]:=rotate_image_from_image(im
,8*ix
,0,8,8,0);
264 pr_2
[ix
]:=rotate_image_from_image(im
,8*ix
,8,8,8,0);
265 pr_3
[ix
]:=rotate_image_from_image(im
,8*ix
,16,8,8,0);
266 pr_4
[ix
]:=rotate_image_from_image(im
,8*ix
,24,8,8,0);
267 pr_5
[ix
]:=rotate_image_from_image(im
,8*ix
,32,8,8,0);
269 bubble
:=rotate_image_from_image(im
,0,40,8,8,0);
270 im
:=ld_tex('explosion.png',path
,'terrain/');
272 pr_boom
[ix
]:=rotate_image_from_image(im
,32*ix
,0,32,32,0);
275 im
:=ld_tex('partition.png',path
,'gui/');
276 gui
[18]:=rotate_image_from_image(im
,0,0,84,42,0);
277 gui
[19]:=rotate_image_from_image(im
,0,42,4,4,0);
279 if load_sky_siz
<=0 then
280 sky
:=ld_tex('sky.png',path
,'terrain/');
282 sky
:=resize_image(ld_tex('sky.png',path
,'terrain/'),load_sky_siz
,2);
286 sun
:=ld_tex('sun.png',path
,'terrain/');
287 moon
:=ld_tex('moon_phase_0.png',path
,'terrain/moon_phases/');
291 sun
:=resize_image(ld_tex('sun.png',path
,'terrain/'),(getWidth
+getHeight
)/5,(getWidth
+getHeight
)/5);
292 moon
:=resize_image(ld_tex('moon_phase_0.png',path
,'terrain/moon_phases/'),(getWidth
+getHeight
)/5,(getWidth
+getHeight
)/5);
295 //load_virt_tex(ld_tex('touch.png',path,'gui/'));
344 b_furnace[ix]:=false;
347 furnace[ix,iy].item_i:=0;
348 furnace[ix,iy].sum_i:=0;
349 furnace_gg[ix].f_gor:=15;
350 furnace_gg[ix].fire_time:=0;
351 furnace_gg[ix].f_got:=0;
352 furnace_gg[ix].got_time:=0;
361 reset_particles(max_particles
+1);
371 setmaplight(0,ix
,iy
);
381 for ix
:=0 to CONST_MAX_LAYERS
do
385 procedure drw_load_line(s
:string;percent
:integer);
389 for ix
:=0 to getWidth
/16 do
390 for iy
:=0 to getHeight
/16 do
391 drawimage(bg
[0],ix
*16,iy
*16);
392 drawfonttext(s
,(getWidth
/2)-(length(s
)*8/2),(getHeight
/2)-8);
393 setcolor(128,128,128);
394 fillrect(getwidth
/2-50,getheight
/2+6,100,3);
395 setcolor(128,255,128);
396 fillrect(getwidth
/2-50,getheight
/2+6,percent
,3);
397 drawfonttext(integertostring(percent
)+'%',getwidth
/2-(length(integertostring(percent
)+'%')*8)/2,getheight
/2+12);
401 function getFlatMap(i
:integer):integer;
407 getFlatMap
:=getmap(ix
,iy
);
410 procedure setFlatMap(n
, i
:integer);
419 function getFlatMapInfo(i
:integer):integer;
425 getFlatMapInfo
:=getmapinfo(ix
,iy
);
428 procedure setFlatMapInfo(n
, i
:integer);
437 procedure SaveMapRLE
;
445 if (id
<>getFlatMap(i
+s
)) or (i
+s
>32767) then
455 procedure SaveMapInfoRLE
;
461 id
:=getFlatMapInfo(i
);
463 if (id
<>getFlatMapInfo(i
+s
)) or (i
+s
>32767) then
473 procedure LoadMapRLE
;
488 procedure LoadMapInfoRLE
;
497 setFlatMapInfo(id
, i
+j
);
503 procedure saveworld(path
:string);
508 if pl_world
=0 then world_name
:='world.sav';
510 if pl_world
=1 then world_name
:='nether.sav';
511 if file_exists(path
)<>1 then if create_folder(path
)=1 then debug('Folder created!');
512 if file_exists(path
+world_name
)>0 then delete_file(path
+world_name
);
513 if file_exists(path
+world_name
)<>1 then file_create(path
+world_name
);
514 if open_file(path
+world_name
)=1 then
516 writeint(player
.getX
);
517 writeint(player
.getY
);
521 drw_load_line('Background',50);
522 //Background and biomes
525 write_byte(getBackMap(ix
));
526 write_byte(getBiomMap(ix
));
528 drw_load_line('Chests',55);
531 drw_load_line('Furnaces',60);
533 /* for ix
:=0 to 15 do
535 writebool(b_furnace
[ix
]);
536 writeint(furnace_gg
[ix
].f_gor
);
537 writeint(furnace_gg
[ix
].f_got
);
540 write_byte(furnace
[ix
,iy
].item_i
);
541 writeint(furnace
[ix
,iy
].sum_i
);
544 drw_load_line('Mobs',70);
547 drw_load_line('Drop',80);
550 drw_load_line('Particles',85);
552 writeint(max_particles
);
553 write_byte(gb_up_pa
);
554 for ix
:=0 to max_particles
do
556 write_byte(get_particle_type(ix
));
557 write_byte(get_particle_ani(ix
));
558 writeint(get_particle_x(ix
));
559 writeint(get_particle_y(ix
));
561 drw_load_line('Other',90);
566 write_byte(osadki_ani
);
567 write_byte(global_light
);
570 write_byte(clock_stage
);
573 writebool(b_sign
[ix
]);
574 writestr(t_sign
[ix
]);
577 drw_load_line('Ready',100);
578 if close_file(path
+world_name
)=1 then debug('World Saved!');
582 procedure savegame(path
:string);
586 drw_load_line('Basic',0);
587 if file_exists(path
+'player.dat')=1 then delete_file(path
+'player.dat');
588 if file_exists(path
)<>1 then if create_folder(path
)=1 then debug('Folder created!');
589 if file_exists(path
+'player.dat')<>1 then file_create(path
+'player.dat');
590 if open_file(path
+'player.dat')=1 then
593 write_byte(version_map
);
594 write_byte(gamemode
);
597 write_byte(pl_world
);
599 writeint(last_sleep_x
);
600 writeint(last_sleep_y
);
607 write_byte(moon_phase
);
610 if close_file(path
+'player.dat')=1 then debug('Saved!');
611 drw_load_line('Matrix',10);
617 function version_err(ver
:integer):boolean;
621 for ix
:=0 to getWidth
/16 do
622 for iy
:=0 to getHeight
/16 do
624 drawimage(bg
[0],ix
*16,iy
*16);
626 if version_map
=ver
then version_err
:=true; else
627 if version_map
>ver
then
629 drawfonttext('Old save format!',(getWidth
/2)-60,(getHeight
/2)-4);
634 if version_map
<ver
then
636 drawfonttext('New save format!',(getWidth
/2)-60,(getHeight
/2)-4);
644 function loadworld(path
:string):boolean;
649 if pl_world
=0 then world_name
:='world.sav';
651 if pl_world
=1 then world_name
:='nether.sav';
652 if file_exists(path
)=1 then
654 if file_exists(path
+world_name
)=1 then
656 if open_file(path
+world_name
)=1 then
658 player
.setX(readint
);
659 player
.setY(readint
);
663 drw_load_line('Background',50);
664 //Background and biomes
667 setBackMap(read_byte
, ix
);
668 setBiomMap(read_byte
, ix
);
670 drw_load_line('Chests',55);
673 drw_load_line('Furnaces',60);
675 /* for ix
:=0 to 15 do
677 b_furnace
[ix
]:=readbool
;
678 furnace_gg
[ix
].f_gor
:=readint
;
679 furnace_gg
[ix
].f_got
:=readint
;
682 furnace
[ix
,iy
].item_i
:=read_byte
;
683 furnace
[ix
,iy
].sum_i
:=readint
;
686 drw_load_line('Mobs',70);
689 drw_load_line('Drop',80);
692 drw_load_line('Particles',85);
694 max_particles
:=readint
;
695 reset_particles(max_particles
+1);
697 for ix
:=0 to max_particles
do
699 set_particle_type(ix
,read_byte
);
700 set_particle_ani(ix
,read_byte
);
701 set_particle_x(ix
,readint
);
702 set_particle_y(ix
,readint
);
704 drw_load_line('Other',90);
709 osadki_ani
:=read_byte
;
710 global_light
:=read_byte
;
713 clock_stage
:=read_byte
;
716 b_sign
[ix
]:=readbool
;
719 drw_load_line('Ready',100);
720 ///////////////////////
721 if close_file(path
+world_name
)=1 then begin loadworld
:=true; debug('World loaded!'); end;
722 end; else begin loadworld
:=false; debug('File not opened!'); end;
723 end; else begin loadworld
:=false; debug('File not exists!'); end;
724 end; else begin loadworld
:=false; debug('Folder not exists!'); end;
727 function loadgame(path
:string):boolean;
731 drw_load_line('Basic',0);
732 if file_exists(path
)=1 then
734 if file_exists(path
+'player.dat')=1 then
736 if open_file(path
+'player.dat')=1 then
740 if version_err(ver
)=false then
742 if close_file(path
+'player.dat')=1 then loadgame
:=false;
750 last_sleep_x
:=readint
;
751 last_sleep_y
:=readint
;
758 moon_phase
:=read_byte
;
761 drw_load_line('Matrix',10);
762 if close_file(path
+'player.dat')=1 then loadgame
:=loadworld(path
);
763 end; else loadgame
:=false;
764 end; else loadgame
:=false;
765 end; else loadgame
:=false;
768 procedure drawdeadlogo
;
773 fillrect(0,0,getWidth
,getHeight
);
774 dead
:=loadimage('/dl');
775 drawimage(dead
,(getWidth
/2)-(getimagewidth(dead
)/2),(getHeight
/2)-(getimageheight(dead
)/2));
776 drawfonttext(#119+#119+#119+#46+#100+#101+#97+#100+#115+#111+#102+#116+#119+#97+#114+#101+#46+#114+#117,getWidth
/2-80,(getHeight
/2)+(getimageheight(dead
)/2));
777 drawfonttext('Loading...',(getWidth
/2)-(40),getHeight
-8);
786 for ix
:=0 to getWidth
/16 do
787 for iy
:=0 to getHeight
/16 do
789 drawimage(bg
[0],ix
*16,iy
*16);
791 drawfonttext('Generation World...',(getWidth
/2)-(76),(getHeight
/2)-4);
797 //if s_spawn_mob then begin if pl_world=0 then begin megaspawn; end; else begin netherspawn; end; end;
798 if gamemode
=1 then fly
:=true else fly
:=false;
802 function gettext(text,text_f
:string; max
,typ
:integer;):string;
804 textField_id
:integer;
808 exitCmd
:=createCommand('Ok',CM_OK
,1);
811 textField_id
:=formAddTextField(text,text_f
,max
,typ
);
815 cli
:=getClickedCommand
;
817 gettext
:=formGetText(textField_id
);
821 procedure drw_btn(text:string; cur
,ccur
,h
,ty
:integer);
825 m_x
:=(getWidth
/2)-(120/2);
826 m_y
:=h
+((getHeight
/2))-((getimageheight(gui
[7])-2*cur
)/2)+((getimageheight(gui
[7])+2)*cur
);
829 if ccur
=cur
then drawimage(gui
[22],m_x
+i
*4,m_y
); else drawimage(gui
[6],m_x
+i
*8,m_y
);
833 if ccur
=cur
then drawimage(gui
[8],m_x
+i
*8,m_y
); else drawimage(gui
[7],m_x
+i
*8,m_y
);
835 setclip(0,0,getwidth
,getheight
);
836 m_x
:=(getWidth
/2)-(length(text)*8/2);
837 m_y
:=h
+((getHeight
/2))-((getimageheight(gui
[7])-2*cur
)/2)+((getimageheight(gui
[7])+2)*cur
)+((getimageheight(gui
[7])-8)/2);
838 drawfonttext(text,m_x
,m_y
);
841 procedure drw_txt(str
:string; xx
,n
,t
:integer);
845 m_x
:=(getWidth
/2)-(length(str
)*8/2);
847 if t
=0 then drawfonttext(str
,0,m_y
); else
848 if t
=1 then drawfonttext(str
,m_x
,m_y
);
851 function pos_end(s
:string; c
:char):integer;
855 for i
:=length(s
)-1 downto 0 do
857 if getchar(s
,i
)=c
then
866 function getroot(cancel_b
:boolean):string;
868 m_cur
,max_r
,pars
,ix
,iy
:integer;
871 roots
:array [0..15] of string;
873 im
:=rotate_image_from_image(ld_tex('background.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','title/'),16,0,16,16,0);
875 if cancel_b
then roots
[0]:='<CANCEL>';
876 if cancel_b
then max_r
:=1; else max_r
:=0;
877 while pos(rr
,'|')<>-1 do
880 roots
[max_r
]:=copy(rr
,0,pars
-1);
881 rr
:=copy(rr
,pars
+1,length(rr
));
887 if clickedKey(KEY_FM_UP
) then begin m_cur
:=m_cur
-1; if m_cur
<0 then m_cur
:=max_r
; end;
888 if clickedKey(KEY_FM_DOWN
) then begin m_cur
:=m_cur
+1; if m_cur
>max_r
then m_cur
:=0; end;
889 if clickedKey(KEY_FM_SELECT
) then
891 if (m_cur
=0) and (cancel_b
) then
898 getroot
:=roots
[m_cur
];
903 for ix
:=0 to getWidth
/16 do
904 for iy
:=0 to getHeight
/16 do
905 drawimage(im
,ix
*16,iy
*16);
908 fillrect(0,m_cur
*8,getWidth
-1,8);
909 for ix
:=0 to max_r
do
911 drawfonttext(roots
[ix
],0,ix
*8);
913 setcolor(255,255,255);
914 drawrect(0,m_cur
*8,getWidth
-1,8);
921 function filemanager(cancel_b
:boolean):string;
923 m_cur
,ix
,iy
,max_r
,pars
:integer;
925 last
,rr
,root
,path
:string;
926 names
:array [0..255] of string;
928 im
:=rotate_image_from_image(ld_tex('background.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','title/'),16,0,16,16,0);
931 root
:=getroot(cancel_b
);
938 if cancel_b
then names
[2]:='<CANCEL>';
940 if cancel_b
then max_r
:=3; else max_r
:=2;
941 while pos(rr
,'|')<>-1 do
944 names
[max_r
]:=copy(rr
,0,pars
-1);
945 rr
:=copy(rr
,pars
+1,length(rr
));
952 if clickedKey(KEY_FM_UP
) then begin m_cur
:=m_cur
-1; if m_cur
<0 then m_cur
:=max_r
; end;
953 if clickedKey(KEY_FM_DOWN
) then begin m_cur
:=m_cur
+1; if m_cur
>max_r
then m_cur
:=0; end;
954 if clickedKey(KEY_FM_SELECT
) then
959 debug('lol:'+pos_end(path
,'/'));
960 if (path
=root
) or (path
=root
+'/') then
962 root
:=getroot(cancel_b
);
972 path
:=copy(path
,0,pos_end(path
,'/'));
973 if cancel_b
then names
[2]:='<CANCEL>';
975 if cancel_b
then max_r
:=3; else max_r
:=2;
976 while pos(rr
,'|')<>-1 do
979 names
[max_r
]:=copy(rr
,0,pars
-1);
980 rr
:=copy(rr
,pars
+1,length(rr
));
992 if (m_cur
=2) and (cancel_b
) then
999 path
:=path
+'/'+names
[m_cur
];
1001 if cancel_b
then names
[2]:='<CANCEL>';
1003 if cancel_b
then max_r
:=3; else max_r
:=2;
1004 while pos(rr
,'|')<>-1 do
1007 names
[max_r
]:=copy(rr
,0,pars
-1);
1008 rr
:=copy(rr
,pars
+1,length(rr
));
1013 debug('path:'+path
);
1017 for ix
:=0 to getWidth
/16 do
1018 for iy
:=0 to getHeight
/16 do
1019 drawimage(im
,ix
*16,iy
*16);
1022 fillrect(0,m_cur
*8,getWidth
-1,8);
1023 for ix
:=0 to max_r
do
1025 drawfonttext(names
[ix
],0,ix
*8);
1027 setcolor(255,255,255);
1028 drawrect(0,m_cur
*8,getWidth
-1,8);
1036 procedure setsd(cancel_b
:boolean);
1042 s
:=filemanager(cancel_b
);
1046 if file_exists('/'+sd
+'/cavecraft')<>1 then
1047 if create_folder('/'+sd
+'/cavecraft')=1 then debug('/cavecraft created!');
1049 if file_exists('/'+sd
+'/cavecraft/saves')<>1 then
1050 if create_folder('/'+sd
+'/cavecraft/saves')=1 then debug('/saves created!');
1052 if file_exists('/'+sd
+'/cavecraft/screenshots')<>1 then
1053 if create_folder('/'+sd
+'/cavecraft/screenshots')=1 then debug('/screenshots created!');
1055 if file_exists('/'+sd
+'/cavecraft/texturepacks')<>1 then
1056 if create_folder('/'+sd
+'/cavecraft/texturepacks')=1 then debug('/texturepacks created!');
1058 deleteRecordStore('SD');
1059 rs
:=openRecordStore('SD');
1060 t
:=addRecordStoreEntry(rs
,sd
);
1061 closeRecordStore(rs
);
1072 rs
:=openRecordStore('SD');
1073 sd
:=readRecordStoreEntry(rs
,1);
1074 closeRecordStore(rs
);
1075 console
.exec('autoexec.cfg', 'AUTO', true);
1083 //load_virt_tex(loadimage('/gui/touch.png'));
1087 if file_exists('/'+sd
+'/cavecraft')<>1 then
1088 if create_folder('/'+sd
+'/cavecraft')=1 then debug('/cavecraft created!');
1090 if file_exists('/'+sd
+'/cavecraft/saves')<>1 then
1091 if create_folder('/'+sd
+'/cavecraft/saves')=1 then debug('/saves created!');
1093 if file_exists('/'+sd
+'/cavecraft/screenshots')<>1 then
1094 if create_folder('/'+sd
+'/cavecraft/screenshots')=1 then debug('/screenshots created!');
1096 if file_exists('/'+sd
+'/cavecraft/texturepacks')<>1 then
1097 if create_folder('/'+sd
+'/cavecraft/texturepacks')=1 then debug('/texturepacks created!');
1099 rs
:=openRecordStore('TX');
1100 ss
:=readRecordStoreEntry(rs
,1);
1101 closeRecordStore(rs
);
1106 LoadDrawFont('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/');
1107 loadtexture('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/');
1116 function question(text:string):boolean;
1118 ix
,iy
,m_cur
:integer;
1122 if clickedKey(KEY_MENU_UP
) then begin m_cur
:=m_cur
-1; if m_cur
<0 then m_cur
:=1; end;
1123 if clickedKey(KEY_MENU_DOWN
) then begin m_cur
:=m_cur
+1; if m_cur
>1 then m_cur
:=0; end;
1124 if clickedKey(KEY_MENU_SELECT
) then begin if m_cur
=0 then question
:=true; else question
:=false; exit
; end;
1125 for ix
:=0 to getwidth
/16 do for iy
:=0 to getheight
/16 do drawimage(bg
[0],ix
*16,iy
*16);
1126 drawfonttext(text,getwidth
/2-(length(text)*8)/2,getheight
/2-16);
1127 drw_btn('Yes',0,m_cur
,0,1);
1128 drw_btn('No',1,m_cur
,0,1);
1134 function menu_game_new
:boolean;
1136 m_cur
,tmp_gm
,ix
,iy
,lol
:integer;
1137 tmp_cheats
,tmp_bon_chest
:boolean;
1138 newgametxt
:array[0..4] of string;
1142 newgametxt
[0]:='Survival';
1143 newgametxt
[1]:='Creative';
1144 newgametxt
[2]:='Hardcore';
1145 newgametxt
[3]:='Normal';
1146 newgametxt
[4]:='Flat';
1150 if clickedKey(KEY_MENU_UP
) then begin m_cur
:=m_cur
-1; if m_cur
<-2 then m_cur
:=5; end;
1151 if clickedKey(KEY_MENU_DOWN
) then begin m_cur
:=m_cur
+1; if m_cur
>5 then m_cur
:=-2; end;
1152 if clickedKey(KEY_MENU_SELECT
) then
1156 name
:=gettext('Name:',name
,10,TF_ANY
);
1160 tmp_gm
:=tmp_gm
+1; if tmp_gm
>2 then tmp_gm
:=0;
1161 if tmp_gm
=0 then tmp_cheats
:=false;
1162 if tmp_gm
=1 then tmp_cheats
:=true;
1163 if tmp_gm
=2 then begin tmp_cheats
:=false; tmp_bon_chest
:=false; end;
1167 nextseed
:=stringtointeger(gettext('Seed:',''+nextseed
,10,TF_NUMERIC
));
1171 world_typ
:=world_typ
+1;
1172 if world_typ
>1 then world_typ
:=0;
1176 if tmp_gm
<2 then tmp_cheats
:= not tmp_cheats
;
1180 if tmp_gm
<2 then tmp_bon_chest
:= not tmp_bon_chest
;
1186 bon_chest
:=tmp_bon_chest
;
1188 while file_exists('/'+sd
+'/cavecraft/saves/'+name
)=1 do
1195 menu_game_new
:=true;
1203 for ix
:=0 to getWidth
/16 do
1204 for iy
:=0 to getHeight
/16 do
1205 drawimage(bg
[0],ix
*16,iy
*16);
1207 drw_btn('Name:'+name
,-2,m_cur
,0,1);
1208 drw_btn('Mode:'+newgametxt
[tmp_gm
],-1,m_cur
,0,1);
1209 drw_btn('Seed:'+nextseed
,0,m_cur
,0,1);
1210 drw_btn('Type:'+newgametxt
[world_typ
+3],1,m_cur
,0,1);
1212 drw_btn('Cheats:'+tmp_cheats
,2,m_cur
,0,1);
1214 drw_btn('Cheats:'+tmp_cheats
,2,m_cur
,0,0);
1216 drw_btn('Chest:'+tmp_bon_chest
,3,m_cur
,0,1);
1218 drw_btn('Chest:'+tmp_bon_chest
,3,m_cur
,0,0);
1219 drw_btn('Create',4,m_cur
,0,1);
1220 drw_btn('Cancel',5,m_cur
,0,1);
1227 procedure deleteworld(path
:string);
1229 if file_exists(path
+'player.dat')=1 then delete_file(path
+'player.dat');
1230 if file_exists(path
+'world.sav')=1 then delete_file(path
+'world.sav');
1231 if file_exists(path
+'nether.sav')=1 then delete_file(path
+'nether.sav');
1232 if file_exists(path
+'pic.png')=1 then delete_file(path
+'pic.png');
1233 if file_exists(path
)=1 then delete_file(path
);
1234 if file_exists(path
)=0 then debug('World deleted!');
1237 function menu_game
:boolean;
1239 ix
,iy
,pars
,max_r
,cur_name
,m_cur
:integer;
1243 names
:array[0..255] of string;
1245 rr
:=get_dirs('/'+sd
+'/cavecraft/saves/');
1246 while pos(rr
,'|')<>-1 do
1249 names
[max_r
]:=copy(rr
,0,pars
-1);
1250 rr
:=copy(rr
,pars
+1,length(rr
));
1251 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[max_r
]+'/player.dat')=1 then max_r
:=max_r
+1;
1254 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png')=1 then
1255 im_game
:=safely_load_image_fs('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png');
1256 else im_game
:=ld_tex('maps.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','');
1258 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/player.dat')=1 then
1259 mm_t_b
:=true; else mm_t_b
:=false;
1263 if clickedKey(KEY_MENU_UP
) then
1266 if m_cur
<0 then m_cur
:=3;
1268 if clickedKey(KEY_MENU_DOWN
) then
1271 if m_cur
>3 then m_cur
:=0;
1274 if clickedKey(KEY_MENU_LEFT
) then
1276 cur_name
:=cur_name
-1;
1277 if cur_name
<0 then cur_name
:=0;
1278 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png')=1 then
1279 im_game
:=safely_load_image_fs('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png');
1280 else im_game
:=ld_tex('maps.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','');
1282 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/player.dat')=1 then
1284 if clickedKey(KEY_MENU_RIGHT
) then
1286 cur_name
:=cur_name
+1;
1287 if cur_name
>max_r
then cur_name
:=max_r
;
1288 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png')=1 then
1289 im_game
:=safely_load_image_fs('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png');
1290 else im_game
:=ld_tex('maps.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','');
1292 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/player.dat')=1 then
1294 if clickedKey(KEY_MENU_SELECT
) then
1299 if loadgame('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/') then
1301 sav_fl
:=names
[cur_name
];
1308 if menu_game_new
then begin menu_game
:=true; break
; end;
1312 debug('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/');
1314 if question('Are you sure?')=true then deleteworld('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/');
1317 rr
:=get_dirs('/'+sd
+'/cavecraft/saves/');
1318 while pos(rr
,'|')<>-1 do
1321 names
[max_r
]:=copy(rr
,0,pars
-1);
1322 rr
:=copy(rr
,pars
+1,length(rr
));
1326 if file_exists('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png')=1 then
1327 im_game
:=safely_load_image_fs('/'+sd
+'/cavecraft/saves/'+names
[cur_name
]+'/pic.png');
1328 else im_game
:=ld_tex('maps.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','');
1336 for ix
:=0 to getWidth
/16 do
1338 drawimage(bg
[1],ix
*16,iy
*16);
1339 for ix
:=0 to getWidth
/16 do
1340 drawimage(bg
[0],ix
*16,0);
1341 for ix
:=0 to getWidth
/16 do
1342 for iy
:=8 to getHeight
/16 do
1343 drawimage(bg
[0],ix
*16,iy
*16);
1348 fillrect(32,24,getWidth
-64,96);
1349 setclip(32,24,getWidth
-64,96);
1350 drawimage(im_game
,(getWidth
/2)-(32),32);
1351 drawfonttext(names
[cur_name
],(getWidth
/2)-(length(names
[cur_name
])*8/2),104);
1352 setclip(0,0,getWidth
,getHeight
);
1353 setcolor(128,128,128);
1354 drawrect(32,24,getWidth
-64,96);
1355 if cur_name
>0 then drawimage(gui
[20],0,58);
1356 if cur_name
<max_r
then drawimage(gui
[21],getWidth
-9,58);
1361 fillrect(32,24,getWidth
-64,96);
1362 setclip(32,24,getWidth
-64,96);
1363 drawfonttext('No saves!',(getWidth
/2)-(length('No saves!')*8/2),104);
1364 setclip(0,0,getWidth
,getHeight
);
1365 setcolor(128,128,128);
1366 drawrect(32,24,getWidth
-64,96);
1369 if mm_t_b
then drw_btn('Play',0,m_cur
,32,1); else drw_btn('Play',0,m_cur
,32,0);
1370 drw_btn('Create new',1,m_cur
,32,1);
1371 if mm_t_b
then drw_btn('Delete',2,m_cur
,32,1); else drw_btn('Delete',2,m_cur
,32,0);
1372 drw_btn('Back',3,m_cur
,32,1);
1373 if not mm_t_b
then cur_name
:=cur_name
+1;
1382 ix
,iy
,pars
,max_r
,cur_name
,m_cur
,t
:integer;
1385 names
:array[0..255] of string;
1388 rr
:=get_dirs('/'+sd
+'/cavecraft/texturepacks/');
1389 names
[0]:='Default';
1391 while pos(rr
,'|')<>-1 do
1394 names
[max_r
]:=copy(rr
,0,pars
-1);
1395 rr
:=copy(rr
,pars
+1,length(rr
));
1399 im_game
:=loadimage('/pack.png');
1403 if clickedKey(KEY_MENU_UP
) then
1406 if m_cur
<0 then m_cur
:=1;
1408 if clickedKey(KEY_MENU_DOWN
) then
1411 if m_cur
>1 then m_cur
:=0;
1414 if clickedKey(KEY_MENU_LEFT
) then
1416 cur_name
:=cur_name
-1;
1417 if cur_name
<0 then cur_name
:=0;
1418 im_game
:=ld_tex('pack.png','/'+sd
+'/cavecraft/texturepacks/'+names
[cur_name
]+'/','');
1420 if clickedKey(KEY_MENU_RIGHT
) then
1422 cur_name
:=cur_name
+1;
1423 if cur_name
>max_r
then cur_name
:=max_r
;
1424 im_game
:=ld_tex('pack.png','/'+sd
+'/cavecraft/texturepacks/'+names
[cur_name
]+'/','');
1426 if clickedKey(KEY_MENU_SELECT
) then
1428 if m_cur
=0 then begin
1431 tex_pack
:=names
[cur_name
];
1432 LoadDrawFont('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/');
1433 loadtexture('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/');
1434 deleteRecordStore('TX');
1435 rs
:=openRecordStore('TX');
1436 t
:=addRecordStoreEntry(rs
,tex_pack
);
1437 closeRecordStore(rs
);
1443 deleteRecordStore('TX');
1444 rs
:=openRecordStore('TX');
1445 t
:=addRecordStoreEntry(rs
,'');
1446 closeRecordStore(rs
);
1449 if m_cur
=1 then break
;
1453 for ix
:=0 to getWidth
/16 do
1455 drawimage(bg
[1],ix
*16,iy
*16);
1456 for ix
:=0 to getWidth
/16 do
1457 drawimage(bg
[0],ix
*16,0);
1458 for ix
:=0 to getWidth
/16 do
1459 for iy
:=8 to getHeight
/16 do
1460 drawimage(bg
[0],ix
*16,iy
*16);
1465 fillrect(32,24,getWidth
-64,96);
1466 setclip(32,24,getWidth
-64,96);
1467 drawimage(im_game
,(getWidth
/2)-(32),32);
1468 drawfonttext(names
[cur_name
],(getWidth
/2)-(length(names
[cur_name
])*8/2),104);
1469 setclip(0,0,getWidth
,getHeight
);
1470 setcolor(128,128,128);
1471 drawrect(32,24,getWidth
-64,96);
1472 if cur_name
>0 then drawimage(gui
[20],0,58);
1473 if cur_name
<max_r
then drawimage(gui
[21],getWidth
-9,58);
1476 drw_btn('Done',0,m_cur
,32,1);
1477 drw_btn('Back',1,m_cur
,32,1);
1484 procedure menu_sett
;
1486 ix
,iy
,m_cur
:integer;
1491 if clickedKey(KEY_MENU_UP
) then
1494 if m_cur
<-3 then m_cur
:=5;
1496 if clickedKey(KEY_MENU_DOWN
) then
1499 if m_cur
>5 then m_cur
:=-3;
1501 if clickedKey(KEY_MENU_SELECT
) then
1505 light_type
:=light_type
+1;
1506 if light_type
>2 then light_type
:=0;
1514 s_particles
:=not s_particles
;
1518 drawgui
:=not drawgui
;
1522 if question('Are you sure?')=true then
1524 if load_key_tex
=0 then
1528 //load_virt_tex(ld_tex('touch.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'));
1531 if load_key_tex
=1 then
1534 resetVirtualKeyboard(-1);
1540 s_jpeg_quality
:=stringtointeger(gettext('JPEG quality:',''+s_jpeg_quality
,3,TF_NUMERIC
));
1541 if s_jpeg_quality
>100 then s_jpeg_quality
:=100; else
1542 if s_jpeg_quality
<0 then s_jpeg_quality
:=0;
1550 deleteRecordStore('S');
1551 deleteRecordStore('SD');
1552 deleteRecordStore('TX');
1562 for ix
:=0 to getWidth
/16 do
1563 for iy
:=0 to getHeight
/16 do
1564 drawimage(bg
[0],ix
*16,iy
*16);
1566 drw_btn('Light:'+light_type
,-3,m_cur
,0,1);
1567 drw_btn('Weather:'+ifosad
,-2,m_cur
,0,1);
1568 drw_btn('Particles:'+s_particles
,-1,m_cur
,0,1);
1569 drw_btn('Hide GUI:'+not drawgui
,0,m_cur
,0,1);
1570 drw_btn('Touch:'+(load_key_tex
>0),1,m_cur
,0,1);
1571 drw_btn('JPEG:'+s_jpeg_quality
,2,m_cur
,0,1);
1572 drw_btn('Set Root',3,m_cur
,0,1);
1573 drw_btn('Reset',4,m_cur
,0,1);
1574 drw_btn('Back',5,m_cur
,0,1);
1581 procedure menu_help
;
1587 if clickedKey(KEY_MENU_SELECT
) then break
;
1588 if pressedKey(KEY_MENU_UP
) then cur
:=cur
+1;
1589 if pressedKey(KEY_MENU_DOWN
) then cur
:=cur
-1;
1591 for ix
:=0 to getWidth
/16 do
1592 for iy
:=2 to (getHeight
/16)-2 do
1593 drawimage(bg
[1],ix
*16,iy
*16);
1595 for ix
:=0 to getWidth
/16 do
1597 drawimage(bg
[0],ix
*16,iy
*16);
1599 for ix
:=0 to getWidth
/16 do
1600 for iy
:=(getHeight
/16)-2 to getHeight
/16 do
1601 drawimage(bg
[0],ix
*16,iy
*16);
1603 setclip(0,32,getWidth
,(getHeight
/16-4)*16);
1605 drw_txt('Controls:',cur
,0,1);
1606 drw_txt('Left - Move left',cur
,1,0);
1607 drw_txt('Right - Move right',cur
,2,0);
1608 drw_txt('Up - Jump',cur
,3,0);
1609 drw_txt('Down - Put a block under you',cur
,4,0);
1610 drw_txt('1 - Inventory',cur
,5,0);
1611 drw_txt('Duble 1 - Craft',cur
,6,0);
1612 drw_txt('3 - Use block',cur
,7,0);
1613 drw_txt('7 - Debug info',cur
,8,0);
1614 drw_txt('Hold 7 - Console',cur
,9,0);
1615 drw_txt('9 - Pause',cur
,10,0);
1616 drw_txt('*, # - Browse inventory',cur
,11,0);
1617 drw_txt('0 - Edit mode',cur
,12,0);
1619 drw_txt('In inventory/chest:',cur
,14,1);
1620 drw_txt('3 - Enject object',cur
,15,0);
1621 drw_txt('Hold 3 - Enject stack',cur
,16,0);
1622 drw_txt('5 - Move the stack',cur
,17,0);
1623 drw_txt('Hold 5 - Divide stack',cur
,18,0);
1625 setclip(0,0,getWidth
,getHeight
);
1627 drw_btn('Back',0,0,getHeight
-getHeight
/2-16-6,1);
1634 procedure menu_about
;
1640 if clickedKey(KEY_MENU_SELECT
) then break
;
1641 if pressedKey(KEY_MENU_UP
) then cur
:=cur
+1;
1642 if pressedKey(KEY_MENU_DOWN
) then cur
:=cur
-1;
1644 for ix
:=0 to getWidth
/16 do
1645 for iy
:=2 to (getHeight
/16)-2 do
1646 drawimage(bg
[1],ix
*16,iy
*16);
1648 for ix
:=0 to getWidth
/16 do
1650 drawimage(bg
[0],ix
*16,iy
*16);
1652 for ix
:=0 to getWidth
/16 do
1653 for iy
:=(getHeight
/16)-2 to getHeight
/16 do
1654 drawimage(bg
[0],ix
*16,iy
*16);
1656 setclip(0,32,getWidth
,(getHeight
/16-4)*16);
1658 drw_txt('Developers:',cur
,0,1);
1659 drw_txt(#68+#101+#97+#68+#68+#111+#111+#77+#69+#82+' - Programmer',cur
,1,0);//dead
1660 drw_txt(#102+#114+#101+#100+#45+#98+#111+#121+' - Programmer',cur
,2,0);//fred-boy
1661 drw_txt(#65+#110+#100+#114+#101+#121+#53+#57+' - Programmer',cur
,3,0);//andrey59
1662 drw_txt(#89+#117+#82+#97+#78+#110+#78+#122+#90+#90+' - Artist',cur
,4,0);//yura
1663 drw_txt(#83+#97+#115+#104+#97+#71+' - Artist and idea generator',cur
,5,0);//sasha
1664 drw_txt(#66+#97+#74+#108+#101+#72+#84+#105+#72+' - Artist and tester',cur
,6,0);//valentin
1665 drw_txt(#65+#103+#114+#101+#115+#115+#111+#82+' - Tester',cur
,7,0);//agressor
1666 drw_txt(#118+#111+#108+#121+#97+#95+#110+#97+#115+#116+#97+#110+#101+' - Tester',cur
,8,0);//volya
1667 drw_txt(#97+#98+#97+#100+#111+#110+' - Tester',cur
,9,0);//abadon
1668 drw_txt(#77+#111+#110+#111+#103+#114+#111+#109+' - Tester',cur
,10,0);//monogrom
1669 drw_txt(#75+#97+#108+#116+#101+#114+' - Tester',cur
,11,0);//kalter
1671 drw_txt('Thanks:',cur
,12,1);
1672 drw_txt('Piligrim and 0vZ - Lib_jsr75i',cur
,13,0);
1673 drw_txt('Piligrim - Lib_effects',cur
,14,0);
1674 drw_txt('Kurdt - Lib_canvas',cur
,15,0);
1675 drw_txt('ViNT - Lib_png and Lib_bmp',cur
,16,0);
1676 drw_txt('aleshka - Lib_jpeg',cur
,17,0);
1677 drw_txt('Roman_V - Lib_safeload',cur
,18,0);
1679 drw_txt('Site: '+#104+#116+#116+#112+#58+#47+#47+#100+#101+#97+#100+#115+#111+#102+#116+#119+#97+#114+#101+#46+#114+#117,cur
,21,0);
1680 drw_txt(#68+#101+#97+#68+#83+#111+#102+#116+#87+#97+#114+#101+' 2012-'+getyear(getcurrenttime
),cur
,22,0);
1682 drw_txt('Hello! :D',cur
,100,1);
1684 setclip(0,0,getWidth
,getHeight
);
1686 drw_btn('Back',0,0,getHeight
-getHeight
/2-16-6,1);
1693 function sm_siz
:integer;
1695 sm_siz
:=(getWidth
+getHeight
)/5;
1698 function sm_siz4
:integer;
1703 procedure draw_menu_back
;
1707 for ix
:=0 to getWidth
/16 do
1708 for iy
:=0 to getHeight
/16 do
1709 drawimage(bg
[0],ix
*16,iy
*16);
1714 m_cur
,ix
,iy
,iz
:integer;
1720 spl_y
,spl_del
:integer;
1723 cavelogo
:=ld_tex('cavelogo.png','/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/','title/');
1725 spl_y
:=getimageheight(cavelogo
);
1727 spl_del
:=getrelativetimems
;
1728 res
:=openResource('/title/splashes.txt');
1729 if ResourceAvailable(res
) then
1731 spl_i
:=stringtointeger(readline(res
));
1732 iy
:=random(spl_i
-1)+1;
1733 debug('SPLASH #'+iy
);
1735 splash
:=readline(res
);
1738 time
:=getcurrenttime
;
1739 if (getmonth(time
)=5) and (getday(time
)=7) then splash
:='Happy birthday, DeaDDooMER!';
1740 if ((getmonth(time
)=0) and (getday(time
)<3)) or ((getmonth(time
)=11) and (getday(time
)>29)) then splash
:='Happy New Year!';
1744 if clickedKey(KEY_MENU_UP
) then
1747 if m_cur
<0 then m_cur
:=5;
1749 if clickedKey(KEY_MENU_DOWN
) then
1752 if m_cur
>5 then m_cur
:=0;
1754 if clickedKey(KEY_MENU_SELECT
) then
1756 if m_cur
=0 then begin if menu_game
then break
; end;
1758 if m_cur
=1 then menu_tex
;
1760 if m_cur
=2 then menu_sett
;
1762 if m_cur
=3 then menu_help
;
1764 if m_cur
=4 then menu_about
;
1766 if m_cur
=5 then begin save_settings
; halt
; end;
1771 drawimage(cavelogo
,(getWidth
/2)-(getimagewidth(cavelogo
)/2),0);
1772 setcolor(255,255,0);
1774 DrawFontTextSpec(splash
, (getWidth
/2)-(length(splash
)*FONT_SYM_SIZE
/2), spl_y
, FONT_YELLOW_COLOR
, true);
1776 if spl_y_b
then begin if getrelativetimems
-spl_del
>64 then begin spl_y
:=spl_y
+1; spl_del
:=getrelativetimems
; end; if spl_y
>getimageheight(cavelogo
)+2 then spl_y_b
:=false; end;
1777 if not spl_y_b
then begin if getrelativetimems
-spl_del
>64 then begin spl_y
:=spl_y
-1; spl_del
:=getrelativetimems
; end; if spl_y
<getimageheight(cavelogo
)+1 then spl_y_b
:=true; end;
1778 drawfonttext(version
,0,getHeight
-8);
1780 drw_btn('Singleplayer',0,m_cur
,0,1);
1781 drw_btn('Texture Packs',1,m_cur
,0,1);
1782 drw_btn('Options',2,m_cur
,0,1);
1783 drw_btn('Help',3,m_cur
,0,1);
1784 drw_btn('About',4,m_cur
,0,1);
1785 drw_btn('Quit Game',5,m_cur
,0,1);
1792 function setBlock(invcur
, x
, y
:integer):boolean;
1794 item
, sum
, block
, sblock
:integer;
1796 item
:=inv
.getItem(invcur
);
1797 sum
:=inv
.getSum(invcur
);
1798 block
:=getMap(x
, y
);
1799 sblock
:=getItemInfo(item
);
1801 if getItemType(item
)=ITEM_TYPE_BLOCK
then
1802 if inv
.isNull(invcur
)=false then
1803 if getBlockSet(block
)=true then
1804 // if (coll_xy(x, y)=false) or (getBlockColl(item)=0) then
1806 if set_block_code(sblock
, x
, y
)=false then
1809 setmap(sblock
, x
, y
);
1812 inv
.setSum(inv
.getSum(invcur
)-1, invcur
);
1813 inv
.fixNull(invcur
);
1827 if (getrelativetimems
-fish_time
>5000) and (getmap(fx
,fy
)=50) then
1829 if (random(3)=2) and (getmap(fx
,fy
)=50) then
1831 drop
.create(210,1,x
,y
);
1834 inv
.setSum(inv
.getSum(invslot
)-1, invslot
);
1835 inv
.fixNull(invslot
);
1838 if (getrelativetimems
-fish_time
<5000) and (getmap(fx
,fy
)=50) and (fish
=true) then
1840 if getmap(fx
,fy
-1)=50 then fy
:=fy
-1;
1844 procedure drawminimap
;
1846 ix
,iy
,tmp_gx
,tmp_gy
,minx
,miny
,maxx
,maxy
,loc_camx
,loc_camy
,x
,y
:integer;
1850 if load_minimap_tex
then
1852 tmp_gx
:=(getWidth
/2)-(getimagewidth(gui
[16])/2);
1853 tmp_gy
:=(getHeight
/2)-(getimageheight(gui
[16])/2);
1857 tmp_gx
:=(getWidth
/2)-(64/2);
1858 tmp_gy
:=(getHeight
/2)-(64/2);
1861 loc_camx
:=(x
+4)-(864/2);
1862 loc_camy
:=(y
+4)-(864/2);
1863 if loc_camx
<0 then loc_camx
:=0;
1864 if loc_camx
>4096-864 then loc_camx
:=4096-864;
1865 if loc_camy
<0 then loc_camy
:=0;
1866 if loc_camy
>2048-864 then loc_camy
:=2048-864;
1869 maxx
:=(loc_camx
+864)/16;
1870 maxy
:=(loc_camy
+864)/16;
1871 if minx
<0 then minx
:=0;
1872 if miny
<0 then miny
:=0;
1873 if maxx
>255 then maxx
:=255;
1874 if maxy
>127 then maxy
:=127;
1876 if load_minimap_tex
then
1877 drawimage(gui
[16],tmp_gx
,tmp_gy
);
1880 setcolor(214,190,150);
1881 fillrect(tmp_gx
,tmp_gy
,64,64);
1884 for ix
:=minx
to maxx
do
1885 for iy
:=miny
to maxy
do
1887 if (getmap(ix
,iy
)=1) or (getmap(ix
,iy
)=2) or (getmap(ix
,iy
)=74) then setcolor(121,85,58); else
1888 if (getmap(ix
,iy
)=4) or (getmap(ix
,iy
)=9) or (getmap(ix
,iy
)=11) or (getmap(ix
,iy
)=28) or (getmap(ix
,iy
)=29) or ((getmap(ix
,iy
)>=77) and (getmap(ix
,iy
)<=86)) or ((getmap(ix
,iy
)>=88) and (getmap(ix
,iy
)<=101)) then setcolor(188,152,98); else
1889 if (getmap(ix
,iy
)=50) or (getmap(ix
,iy
)=62) then setcolor(38,92,255); else
1890 if getmap(ix
,iy
)=51 then setcolor(255,0,0); else
1891 if (getmap(ix
,iy
)=61) or (getmap(ix
,iy
)=32) then setcolor(255,255,255); else
1892 setcolor(127,127,127);
1894 if (getmap(ix
,iy
)<>0) then plot(tmp_gx
+4+ix
-minx
,tmp_gy
+4+iy
-miny
);
1899 procedure draw_sign
;
1902 str
:array[0..3] of string;
1903 i
,j
,tmp_gx
,tmp_gy
:integer;
1905 if load_gui_tex
then
1907 tmp_gx
:=(getWidth
/2)-(getimagewidth(sign_im
)/2);
1908 tmp_gy
:=(getHeight
/2)-(getimageheight(sign_im
)/2);
1912 tmp_gx
:=(getWidth
/2)-(120/2);
1913 tmp_gy
:=(getHeight
/2)-(60/2);
1916 tmp
:=t_sign
[getmapinfo(curx
,cury
)];
1917 while pos(tmp
,#13)<>-1 do
1920 str
[j
]:=copy(tmp
,0,i
);
1921 tmp
:=copy(tmp
,i
+1,length(tmp
));
1925 if load_gui_tex
then
1926 drawimage(sign_im
,tmp_gx
,tmp_gy
);
1929 setcolor(159,132,77);
1930 fillrect(tmp_gx
,tmp_gy
,120,60);
1933 drawfonttext(str
[0],tmp_gx
+(120/2)-(length(str
[0])*8/2),tmp_gy
+(60/4/2)+4);
1934 drawfonttext(str
[1],tmp_gx
+(120/2)-(length(str
[1])*8/2),tmp_gy
+(60/4/2)+8+4);
1935 drawfonttext(str
[2],tmp_gx
+(120/2)-(length(str
[2])*8/2),tmp_gy
+(60/4/2)+16+4);
1936 drawfonttext(str
[3],tmp_gx
+(120/2)-(length(str
[3])*8/2),tmp_gy
+(60/4/2)+24+4);
1939 procedure draw_back(ix
,iy
:integer);
1941 if getBiomMap(ix
)=0 then
1943 if (getBackMap(ix
)=iy
) then drawimage(back
[0],(ix
*16)-camx
,(iy
*16)-camy
); else
1944 if (getBackMap(ix
)+1=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1945 if (getBackMap(ix
)+2=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1946 if (getBackMap(ix
)+3=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1947 if (getBackMap(ix
)<iy
) then drawimage(back
[2],(ix
*16)-camx
,(iy
*16)-camy
);
1949 if getBiomMap(ix
)=1 then
1951 if (getBackMap(ix
)=iy
) then drawimage(back
[4],(ix
*16)-camx
,(iy
*16)-camy
); else
1952 if (getBackMap(ix
)+1=iy
) then drawimage(back
[4],(ix
*16)-camx
,(iy
*16)-camy
); else
1953 if (getBackMap(ix
)+2=iy
) then drawimage(back
[6],(ix
*16)-camx
,(iy
*16)-camy
); else
1954 if (getBackMap(ix
)+3=iy
) then drawimage(back
[6],(ix
*16)-camx
,(iy
*16)-camy
); else
1955 if (getBackMap(ix
)<iy
) then drawimage(back
[2],(ix
*16)-camx
,(iy
*16)-camy
);
1957 if getBiomMap(ix
)=2 then
1959 if (getBackMap(ix
)=iy
) then drawimage(back
[5],(ix
*16)-camx
,(iy
*16)-camy
); else
1960 if (getBackMap(ix
)+1=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1961 if (getBackMap(ix
)+2=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1962 if (getBackMap(ix
)+3=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1963 if (getBackMap(ix
)<iy
) then drawimage(back
[2],(ix
*16)-camx
,(iy
*16)-camy
);
1965 if getBiomMap(ix
)=3 then
1967 if (getBackMap(ix
)=iy
) then drawimage(back
[7],(ix
*16)-camx
,(iy
*16)-camy
); else
1968 if (getBackMap(ix
)+1=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1969 if (getBackMap(ix
)+2=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1970 if (getBackMap(ix
)+3=iy
) then drawimage(back
[1],(ix
*16)-camx
,(iy
*16)-camy
); else
1971 if (getBackMap(ix
)<iy
) then drawimage(back
[2],(ix
*16)-camx
,(iy
*16)-camy
);
1973 if getBiomMap(ix
)=4 then
1975 drawimage(back
[8],(ix
*16)-camx
,(iy
*16)-camy
);
1981 ix
,iy
,iz
,minx
,miny
,maxx
,maxy
,tmp_ax
,tim
,smy
,pa_xo
, x
, y
:integer;
1985 {===================[sky]===================}
1986 tim
:=10000*getimagewidth(sky
)/600000*game_time
/10000;
1987 setcolor(effects
.get(sky
,tim
,0,1),effects
.get(sky
,tim
,0,2),effects
.get(sky
,tim
,0,3));
1988 fillrect(0,0,getWidth
,getHeight
);
1992 setcolor(effects
.get(sky
,tim
,2,1),effects
.get(sky
,tim
,2,2),effects
.get(sky
,tim
,2,3));
1993 smy
:=10000*getWidth
*2/600000*game_time
/10000;
1994 for iz
:=1 to getWidth
do
1996 ix
:=rnd(getWidth
*2)-getWidth
+smy
;
1997 if ix
>getWidth
then ix
:=ix
-getWidth
*2;
1999 if (ix
>-1) and (ix
<getWidth
) then plot(ix
,iy
);
2007 smy
:=10000*(getWidth
+getimagewidth(sun
))/300000*game_time
/10000;
2008 drawimage(sun
,smy
-getimagewidth(sun
),getHeight
/2-getimageheight(sun
)/2);
2012 setcolor(255,213,74);
2013 smy
:=10000*(getWidth
+sm_siz
)/300000*game_time
/10000;
2014 fillrect(smy
-sm_siz
+sm_siz4
,getHeight
/2-sm_siz
/2+sm_siz4
,sm_siz
-sm_siz4
,sm_siz
-sm_siz4
);
2019 smy
:=10000*(getWidth
+getimagewidth(moon
))/300000*(game_time
-300000)/10000;
2020 drawimage(moon
,smy
-getimagewidth(moon
),getHeight
/2-getimageheight(moon
)/2);
2024 setcolor(175,184,204);
2025 smy
:=10000*(getWidth
+sm_siz
)/300000*(game_time
-300000)/10000;
2026 fillrect(smy
-sm_siz
+sm_siz4
,getHeight
/2-sm_siz
/2+sm_siz4
,sm_siz
-sm_siz4
,sm_siz
-sm_siz4
);
2029 {===================[camera]===================}
2030 camx
:=(x
+4)-(getWidth
/2);
2031 camy
:=(y
+4)-(getHeight
/2);
2032 if camx
<0 then camx
:=0;
2033 if camx
>4096-getWidth
then camx
:=4096-getWidth
;
2034 if camy
>2048-getHeight
then camy
:=2048-getHeight
;
2035 {===================[max_draw]===================}
2038 maxx
:=(camx
+getWidth
)/16;
2039 maxy
:=(camy
+getHeight
)/16;
2040 if minx
<0 then minx
:=0;
2041 if miny
<0 then miny
:=0;
2042 if maxx
>255 then maxx
:=255;
2043 if maxy
>127 then maxy
:=127;
2044 {===================[draw_back]===================}
2045 for ix
:=minx
to maxx
do
2046 for iy
:=miny
to maxy
do
2048 if ifosad
then if (getBackMap(ix
)>=iy
) and (osadki
=true) and getBlockTrans(getmap(ix
,iy
)) then
2050 if getBiomMap(ix
)=0 then drawimage(osad
[0,osadki_ani
],(ix
*16)-camx
,(iy
*16)-camy
);
2052 if getBiomMap(ix
)=2 then drawimage(osad
[1,osadki_ani
],(ix
*16)-camx
,(iy
*16)-camy
);
2054 if getBiomMap(ix
)=3 then drawimage(osad
[0,osadki_ani
],(ix
*16)-camx
,(iy
*16)-camy
);
2057 if getBlockTrans(getmap(ix
,iy
)) then
2060 if getBlockFore(getmap(ix
,iy
))=false then
2063 {===================[drop]===================}
2064 drop
.draw(camx
, camy
);
2065 {===================[particles]===================}
2066 if s_particles
then draw_particle
;
2067 {===================[player]===================}
2070 player
.draw(camx
, camy
);
2073 {===================[mobs]===================}
2074 mob
.draw(camx
, camy
);
2075 {===================[draw_blocks]===================}
2076 for ix
:=minx
to maxx
do
2077 for iy
:=miny
to maxy
do
2079 if getBlockFore(getmap(ix
,iy
))=true then
2083 if (light_type
=1) then begin if getmaplight(ix
,iy
)=0 then fillrect((ix
*16)-camx
,(iy
*16)-camy
,16,16); end;
2085 if light_type
=2 then begin if getmaplight(ix
,iy
)<15 then begin if (ix
*16-camx
<getWidth
) and (ix
*16-camx
>0-16) and (iy
*16-camy
<getHeight
) and (iy
*16-camy
>0-16) then drawimage(light
[getmaplight(ix
,iy
)],(ix
*16)-camx
,(iy
*16)-camy
); end; end;
2087 if (toolus
>0) and (toolind
<10) and (getmap(curx
,cury
)>0) then begin if toolind
>9 then toolind
:=9; drawimage(tue
[toolind
],curx
*16-camx
,cury
*16-camy
); end;
2088 {===================[gui]===================}
2091 tmp_ax
:=(getWidth
/2)-(getImageWidth(gui
[1])/2);
2094 drawimage(gui
[0],curx
*16-camx
,cury
*16-camy
);
2099 DrawPlayerInventory
;
2102 if keymode
=3 then drawcraft
; else
2103 if keymode
=4 then drawchest
; else
2104 if keymode
=5 then draw_sign
; else
2105 if keymode
=6 then drawfurnace
; else
2106 if ifminimap
then drawminimap
;*/
2108 drawimage(gui
[1],tmp_ax
,0);
2111 drawItem(inv
.getItem(ix
), inv
.getSum(ix
), (ix
*16)+tmp_ax
+ix
*2+4, 1, true);
2113 drawimage(gui
[17],(invslot
*16)+tmp_ax
+invslot
*2+2,0);
2119 for ix
:=0 to (hp
div 2)-1 do drawimage(gui
[13],ix
*9,getHeight
-9);
2120 if (hp
mod 2)<>0 then begin drawimage(gui
[14],ix
*9,getHeight
-9); ix
:=ix
+1 end;
2121 for ix
:=ix
to 9 do drawimage(gui
[15],ix
*9,getHeight
-9);
2125 for ix
:=0 to (hp
div 2)-1 do drawimage(gui
[31],ix
*9,getHeight
-9);
2126 if (hp
mod 2)<>0 then begin drawimage(gui
[32],ix
*9,getHeight
-9); ix
:=ix
+1 end;
2127 for ix
:=ix
to 9 do drawimage(gui
[33],ix
*9,getHeight
-9);
2130 for ix
:=0 to (hunger
div 2)-1 do drawimage(gui
[26],ix
*9,getHeight
-18);
2131 if (hunger
mod 2)<>0 then begin drawimage(gui
[27],ix
*9,getHeight
-18); ix
:=ix
+1 end;
2132 for ix
:=ix
to 9 do drawimage(gui
[28],ix
*9,getHeight
-18);
2134 if getmap((x
+4)/16,y
/16)=50 then
2136 for ix
:=0 to (air
div 2)-1 do drawimage(gui
[29],ix
*9,getHeight
-27);
2137 if (air
mod 2)<>0 then begin drawimage(gui
[30],ix
*9,getHeight
-27); ix
:=ix
+1 end;
2143 drawfonttext(msg
[ix
],0,getHeight
-20-ix
*9);
2144 if getrelativetimems
-msg_time
[ix
]>5000 then msg
[ix
]:='';
2149 procedure load_moon(path
:string;phase
:integer);
2156 moon
:=ld_tex('moon_phase_'+phase
+'.png',path
,'terrain/moon_phases/');
2160 moon
:=resize_image(ld_tex('moon_phase_'+phase
+'.png',path
,'terrain/moon_phases/'),(getWidth
+getHeight
)/5,(getWidth
+getHeight
)/5);
2168 if game_time
>300000 then
2170 if load_light_tex
then
2176 for iy
:=0 to getheight
/16 do
2177 for ix
:=0 to getwidth
/16 do
2178 drawimage(light
[i
],ix
*16,iy
*16);
2183 moon_phase
:=moon_phase
+1;
2184 if moon_phase
>7 then moon_phase
:=0;
2185 load_moon('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/',moon_phase
);
2188 last_sleep_y
:=cury
-1;
2193 for iy
:=0 to getheight
/16 do
2194 for ix
:=0 to getwidth
/16 do
2195 drawimage(light
[i
],ix
*16,iy
*16);
2205 while i
<=getheight
do
2208 fillrect(0,0,getwidth
,i
);
2213 moon_phase
:=moon_phase
+1;
2214 if moon_phase
>7 then moon_phase
:=0;
2215 load_moon('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/',moon_phase
);
2218 last_sleep_y
:=cury
-1;
2220 while i
<=getheight
do
2224 fillrect(0,i
,getwidth
,getheight
);
2230 end; else create_msg('You can sleep only at night');
2233 procedure resetToolProgerss
;
2239 procedure usetools(invcur
, x
, y
:integer);
2241 item
, sum
, block
:integer;
2243 block
:=getmap(x
, y
);
2244 item
:=inv
.getItem(invcur
);
2245 sum
:=inv
.getSum(invcur
);
2248 destroy_block_cr(block
, x
, y
);
2252 if (getItemType(item
)=ITEM_TYPE_TOOL
) and (getBlockTool(block
)=getToolType(item
)) then
2253 toolus
:=toolus
+getToolSpeed(item
);
2257 if toolus
>=getBlockHP(block
) then
2259 if ((getItemType(item
)=ITEM_TYPE_TOOL
) and (getBlockTool(block
)=getToolType(item
)) and (getToolLvl(item
)>=getBlockLvl(block
))) or (getBlockLvl(block
)<=0) then
2262 destroy_block_1(block
, x
, y
);
2263 setMapInfo(0, x
, y
);
2268 destroy_block_0(block
, x
, y
);
2269 setMapInfo(0, x
, y
);
2272 if getItemType(item
)=ITEM_TYPE_TOOL
then
2274 inv
.setSum(inv
.getSum(invcur
)-1, invcur
);
2275 inv
.fixNull(invcur
);
2283 if (toolus
>0) and (toolus
<=getBlockHP(block
)) then
2284 toolind
:=((toolus
*100) div getBlockHP(block
)) div 10;
2287 function rt_useweap
:boolean;
2289 x
, y
, w
, h
, i
, damg
:integer;
2296 item
:=inv
.getItem(invslot
);
2298 if getItemType(item
)=1 then
2299 damg
:=getToolDamg(item
);
2304 i
:=mob
.findAndHit(damg
, x
-TILE_SIZE
, y
, TILE_SIZE
+(w
/2), h
, -2, -3);
2306 i
:=mob
.findAndHit(damg
, x
+(w
/2), y
, TILE_SIZE
+(w
/2), h
, 2, -3);
2310 inv
.setSum(inv
.getSum(invslot
)-1, invslot
);
2311 inv
.fixNull(invslot
);
2316 procedure rt_usetools
;
2323 if posi
=0 then curx
:=(x
div 16)-1; else curx
:=(x
div 16)+1;
2325 if getmap(curx
,cury
)=0 then cury
:=cury
+1;
2327 if curx
<0 then curx
:=0;
2328 if curx
>255 then curx
:=255;
2329 if cury
<0 then cury
:=0;
2330 if cury
>127 then cury
:=127;
2332 usetools(invslot
, curx
, cury
);
2335 procedure rt_usemob
;
2342 if posi
=0 then curx
:=(x
div 16)-1; else curx
:=(x
div 16)+1;
2344 if getmap(curx
,cury
)=0 then cury
:=cury
+1;
2346 if curx
<0 then curx
:=0;
2347 if curx
>255 then curx
:=255;
2348 if cury
<0 then cury
:=0;
2349 if cury
>127 then cury
:=127;
2351 //usemob(curx,cury);
2354 procedure actionUse(invcur
, x
, y
:integer);
2356 if setBlock(invcur
, x
, y
)=false then
2357 if useBlock(invcur
, x
, y
) then
2358 if useItem(invcur
, x
, y
) then
2361 procedure rt_useblock
;
2368 if posi
=0 then curx
:=(x
div 16)-1; else curx
:=(x
div 16)+1;
2370 if getmap(curx
,cury
)=0 then cury
:=cury
+1;
2372 if curx
<0 then curx
:=0;
2373 if curx
>255 then curx
:=255;
2374 if cury
<0 then cury
:=0;
2375 if cury
>127 then cury
:=127;
2377 actionUse(invslot
, curx
, cury
);
2380 procedure go_to_nether
;
2384 portal_time
:=getrelativetimems
;
2385 savegame('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/');
2387 drw_load_line('Matrix',10);
2388 if loadworld('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/')=true then
2390 player
.setX(get_spawn_x
*16+4);
2391 player
.setY((get_up(get_spawn_x
)-1)*16);
2404 mob[ix].m_min_vely:=0;
2407 mob[ix].m_fall:=false;
2408 mob[ix].m_jmp:=false;
2409 mob[ix].m_velani:=false;
2418 procedure go_to_world
;
2420 portal_time
:=getrelativetimems
;
2421 savegame('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/');
2423 drw_load_line('Matrix',10);
2424 if loadworld('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/')=true then
2437 procedure plr_is_dead_hardcore
;
2445 if clickedKey(KEY_MENU_SELECT
) then
2447 deleteworld('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/');
2452 drawfonttext('You died!',getwidth
/2-32,getheight
/2-16);
2454 drw_btn('Delete world',0,0,0,1);
2462 procedure plr_is_dead
;
2474 if clickedKey(KEY_MENU_UP
) then
2477 if m_cur
<0 then m_cur
:=1;
2479 if clickedKey(KEY_MENU_DOWN
) then
2482 if m_cur
>1 then m_cur
:=0;
2484 if clickedKey(KEY_MENU_SELECT
) then
2490 if last_sleep_x
=0 then
2492 x
:=get_spawn_x
*16+4;
2496 x
:=last_sleep_x
*16+4;
2503 if last_sleep_x
=0 then
2505 x
:=get_spawn_x
*16+4;
2509 x
:=last_sleep_x
*16+4;
2523 if m_cur
=1 then begin menu
; exit
; end;
2528 drawfonttext('You died!',getwidth
/2-32,getheight
/2-16);
2530 drw_btn('Respawn',0,m_cur
,0,1);
2531 drw_btn('Main menu',1,m_cur
,0,1);
2538 procedure fast_menu
;
2544 if clickedKey(KEY_MENU_UP
) then begin m_cur
:=m_cur
-1; if m_cur
<0 then m_cur
:=3; end;
2545 if clickedKey(KEY_MENU_DOWN
) then begin m_cur
:=m_cur
+1; if m_cur
>3 then m_cur
:=0; end;
2546 if clickedKey(KEY_MENU_SELECT
) then
2554 savegame('/'+sd
+'/cavecraft/saves/'+sav_fl
+'/');
2563 //clear_gui(keymode);
2569 drawfonttext('Game menu',getwidth
/2-36,getheight
/2-20);
2570 drw_btn('Back to Game',0,m_cur
,0,1);
2571 drw_btn('Save Game',1,m_cur
,0,1);
2572 drw_btn('Options',2,m_cur
,0,1);
2573 drw_btn('Quit to Title',3,m_cur
,0,1);
2580 procedure keyFastInv
;
2582 if clickedKey(KEY_FASTINV_NEXT
) then
2589 if clickedKey(KEY_FASTINV_PREV
) then
2597 procedure keyConsole
;
2599 if clickedKey(KEY_CHAT
) then
2600 SetTimer(1000,T_CONSOLE
);
2602 if pressedKey(KEY_CHAT
) then
2604 if GetTimer(T_CONSOLE
)=TIMER_OK
then
2607 ResetTimer(T_CONSOLE
);
2612 if GetTimer(T_CONSOLE
)>TIMER_OK
then
2615 ResetTimer(T_CONSOLE
);
2620 procedure keyInventory
;
2622 if clickedKey(KEY_PLR_OPENINV
) then
2624 OpenPlayerInventory
;
2629 procedure keyhandler
;
2633 if WindowKeyHanler
then
2641 if clickedKey(KEY_PLR_EDITMODE
) then
2644 curx
:=player
.getX
div 16;
2645 cury
:=player
.getY
div 16;
2648 if clickedKey(KEY_PLR_USE
) then
2651 if clickedKey(KEY_MENU
) then
2654 if clickedKey(KEY_PLR_ATTACK
) then
2655 if rt_useweap
=false then
2658 if pressedKey(KEY_PLR_ATTACK
) then
2661 playAnim(ANIM_HAND
);
2666 cancelAnim(ANIM_HAND
);
2669 if pressedKey(KEY_PLR_UP
) then
2671 if pressedKey(KEY_PLR_DOWN
) then
2673 if pressedKey(KEY_PLR_LEFT
) then
2675 if pressedKey(KEY_PLR_RIGHT
) then
2685 if clickedKey(KEY_PLR_UP
) then
2691 if clickedKey(KEY_PLR_DOWN
) then
2697 if clickedKey(KEY_PLR_LEFT
) then
2703 if clickedKey(KEY_PLR_RIGHT
) then
2710 if clickedKey(KEY_PLR_EDITMODE
) then
2713 if clickedKey(KEY_PLR_USE
) then
2714 actionUse(invslot
, curx
, cury
);
2716 if pressedKey(KEY_PLR_ATTACK
) then
2718 usetools(invslot
, curx
, cury
);
2719 playAnim(ANIM_HAND
);
2724 cancelAnim(ANIM_HAND
);
2727 if clickedKey(KEY_MENU
) then
2735 procedure phyhandler
;
2744 procedure light_fillrect(l
,x
,y
,r
:integer);
2746 ix
,iy
,ym
,yp
,xm
,xp
:integer;
2754 setmaplight(getmaplight(ix
,iy
)+l
,ix
,iy
);
2757 procedure light_rect(l
,x
,y
,r
:integer);
2759 ix
,iy
,ym
,yp
,xm
,xp
:integer;
2767 setmaplight(getmaplight(ix
,ym
)+l
,ix
,ym
);
2768 setmaplight(getmaplight(ix
,yp
)+l
,ix
,yp
);
2770 for iy
:=ym
+1 to yp
-1 do
2772 setmaplight(getmaplight(xm
,iy
)+l
,xm
,iy
);
2773 setmaplight(getmaplight(xp
,iy
)+l
,xp
,iy
);
2777 procedure calc_light(m
,x
,y
:integer);
2779 ix
,iy
,l
,ss
,sf
:integer;
2781 if light_type
=1 then light_fillrect(m
,x
,y
,m
/2); else
2782 for l
:=m
downto 1 do
2784 if ss
mod 2=0 then light_rect(l
,x
,y
,ss
/2);
2789 procedure calc_sun(ix
,m
:integer);
2796 setmaplight(ss
,ix
,iy
);
2798 ss
:=ss
-getBlockTr(getmap(ix
,iy
));
2801 for iy
:=iy
+1 to 127 do
2803 setmaplight(0,ix
,iy
);
2812 for i
:=0 to INV_SIZE
do
2814 if inv
.isNull(i
)=false then
2815 player
.dropItem(inv
.getItem(i
), inv
.getSum(i
));
2819 if gamemode
<2 then plr_is_dead
; else plr_is_dead_hardcore
;
2822 procedure hunger_and_air
;
2830 if getrelativetimems
-hung_time
>=90000/(gamemode
+1) then
2832 hung_time
:=getrelativetimems
;
2835 if getrelativetimems
-hp_time
>=5000*(gamemode
+1) then
2839 hp_time
:=getrelativetimems
;
2841 if hp
>20 then hp
:=20;
2845 hp_time
:=getrelativetimems
;
2847 if hp
<1 then if gamemode
<2 then hp
:=1;
2851 if getmap((x
+4)/16,y
/16)=50 then
2853 if getrelativetimems
-air_time
>=500 then
2856 air_time
:=getrelativetimems
;
2859 hp_time
:=getrelativetimems
;
2870 ix
,iy
,minx
,maxx
,miny
,maxy
,fps_t
,tim
, x
, y
:integer;
2877 if hunger
<0 then hunger
:=0;
2878 if air
<0 then air
:=0;
2881 if fps_t
<1 then fps_t
:=1;
2884 if bl_ani5_v
=false then
2890 bl_ani5_v
:=not bl_ani5_v
;
2899 bl_ani5_v
:=not bl_ani5_v
;
2902 bl_ani5_d
:=not bl_ani5_d
;
2907 game_time
:=game_time
+(600000 div (fps_t
*1000));
2909 if (game_time
>600000) or (game_time
<0) then
2912 moon_phase
:=moon_phase
+1;
2913 if moon_phase
>7 then moon_phase
:=0;
2914 load_moon('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/',moon_phase
);
2917 tim
:=10000*getimagewidth(sky
)/600000*game_time
/10000;
2918 global_light
:=effects
.get(sky
,tim
,1,1) {and $F};
2920 if clock_stage
<>game_time
div 75000 then begin clock_stage
:=clock_stage
+1; if clock_stage
>7 then clock_stage
:=0; end;
2923 if x
+8>4094 then x
:=4086;
2924 if getBlockColl(getmap(x
div 16, y
div 16))>0 then hp
:=hp
-1;
2925 if random(4096)=random(4096) then begin osadki
:=not osadki
; end;
2926 osadki_ani
:=osadki_ani
+1;
2927 if osadki_ani
>7 then osadki_ani
:=0;
2929 if random(20)=random(20) then create_particle(6,x
,y
);
2931 if gamemode
=1 then begin hp
:=666; hunger
:=666; end;
2933 if inv
.getItem(invslot
)=186 then
2938 //if s_spawn_mob then if random(4096)=1547 then megaspawn;
2942 if particle_upd
then update_particle
;
2944 if light_type
>0 then
2947 maxx
:=(camx
+getWidth
)/16+1;
2948 if minx
<0 then minx
:=0;
2949 if maxx
>255 then maxx
:=255;
2950 for ix
:=minx
to maxx
do calc_sun(ix
,global_light
);
2954 maxx
:=(camx
+getWidth
)/16+16;
2956 maxy
:=(camy
+getHeight
)/16+16;
2957 if minx
<0 then minx
:=0;
2958 if maxx
>255 then maxx
:=255;
2959 if miny
<0 then miny
:=0;
2960 if maxy
>127 then maxy
:=127;
2961 for ix
:=minx
to maxx
do
2962 for iy
:=miny
to maxy
do
2964 if light_type
=0 then setmaplight(15,ix
,iy
);
2966 if light_type
>0 then if getBlockLi(getmap(ix
,iy
))>0 then calc_light(getBlockLi(getmap(ix
,iy
)),ix
,iy
);
2969 minx
:=(camx
/16)-((getwidth
/2)/16);
2970 miny
:=(camy
/16)-((getheight
/2)/16);
2971 maxx
:=(camx
+(getWidth
+getWidth
/2))/16;
2972 maxy
:=(camy
+(getHeight
+getHeight
/2))/16;
2973 if minx
<0 then minx
:=0;
2974 if miny
<0 then miny
:=0;
2975 if maxx
>255 then maxx
:=255;
2976 if maxy
>127 then maxy
:=127;
2977 if updx
<minx
then updx
:=minx
;
2978 if updy
<miny
then updy
:=miny
;
2979 if updx
>maxx
then updx
:=minx
;
2980 if updy
>maxy
then updy
:=miny
;
2984 for ix
:=0 to (((2*getWidth
/16)*(2*getHeight
/16))-1) div ((fps_t
*bl_upd
)) do
2986 updateBlock(updx
, updy
);
2992 if updy
>maxy
then updy
:=miny
;
2997 {if coll_bl(110)=true then
2999 if getrelativetimems-portal_time>5000 then
3001 if pl_world=0 then begin go_to_nether; portal_time:=getrelativetimems; end; else
3002 if pl_world=1 then begin go_to_world; portal_time:=getrelativetimems; end;
3006 if coll_bl(51)=true then hp:=hp-1;
3008 if coll_bl(59)=true then
3010 if vely<0 then vely:=-1;
3012 if vely>0 then vely:=1;
3017 if hp
>20 then hp
:=20;
3018 if hunger
>20 then hunger
:=20;
3021 if y
>2048 then kill_plr
;
3022 if (hp
<1) and (gamemode
<>1) then kill_plr
;
3023 if fish
=true then fishing
;
3025 if (fish
=true) and (inv
.getItem(invslot
)<>152) then fish
:=false;
3027 //if (keymode>3) and (cury<(y div 16)-4) then begin clear_gui(keymode); keymode:=0; curx:=x div 16; cury:=y div 16; end;
3031 if cury
<(y
div 16)-4 then cury
:=(y
div 16)-4;
3032 if cury
>(y
div 16)+5 then cury
:=(y
div 16)+5;
3033 if curx
<(x
div 16)-4 then curx
:=(x
div 16)-4;
3034 if curx
>(x
div 16)+4 then curx
:=(x
div 16)+4;
3045 LoadDrawFont('/'+sd
+'/cavecraft/texturepacks/'+tex_pack
+'/');
3048 if load_key_tex
=1 then init_touch
;
3052 msg_time
[i
]:=getrelativetimems
;
3054 InitMap(MAP_W
, MAP_H
);
3060 hung_time
:=getrelativetimems
;
3061 hp_time
:=getrelativetimems
;
3062 air_time
:=getrelativetimems
;
3063 portal_time
:=getrelativetimems
;
3070 drawfonttext(version
,getWidth
-(length(version
)*8),getHeight
-8);
3071 if getrelativetimems
-msg_time
[4]>500 then begin free_ram
:=memory
.get_freememory
; if free_ram
<0 then free_ram
:=-free_ram
; msg_time
[4]:=getrelativetimems
; end;
3074 //drawfonttext('X:'+(x div 16-128),0,0);
3075 //drawfonttext('Y:'+integertostring(127-(y div 16)),0,8);
3076 drawfonttext('CURX:'+(curx
-128),0,16);
3077 drawfonttext('CURY:'+cury
,0,24);
3078 drawfonttext('UPDX:'+updx
,0,32);
3079 drawfonttext('UPDY:'+updy
,0,40);
3080 drawfonttext('FPS:'+fps
,0,56);
3081 drawfonttext('Free RAM:'+free_ram
/1024+' KB',0,64);
3082 drawfonttext('Total RAM:'+memory
.get_totalmemory
div 1024+' KB',0,72);
3083 drawfonttext('SEED:'+seed
,0,88);
3084 drawfonttext('Game time:'+game_time
,0,96);