program LandScroll4_by_Cliffe_aka_Snake;
uses game, sprite, alpha;
const
versWidth=176;versHeight=220; //Мидлет ориентирует всю отрисовку на этот экран
mapsize=255; // ширина и высота карты(квадратной, при желании можно сделать и неквадратную)
//Возможно одновременное нажатие нескольких клавиш
//функция для маскирования поля game.get_bit(value, mask)
UP=2; LEFT=4; RIGHT=32; DOWN=64;
FIRE=256;
GAME_A=512; GAME_B=1024;
GAME_C=2048; GAME_D=4096;
var
{Меню}
vW,vH,PROGW : integer; // хз ,хз , ширина Прогрессбара
np,xp,yp,xp2,upf,maxi: integer; // Nомер пункта меню и его координаты, сдвиг по вертикали и кол-во разрабов
ir,ks,ksl: integer;
New,Continue : boolean; // см. ниже
exit : boolean;
menu,jspeed : Integer; // Текущее состояние меню, регулируемая задержка
st : Array [1..7] of string; // массив пунктов меню
rz : Array [1..50] of string; // массив надписей RаZработчиков
ry : Array [1..50] of integer; // массив высот надписей разрабов
load,str : string; // впомогательные строки
res : resource; // для открытия ресурсов
rs: recordstore; // Для загрузки профиля из RMS-памяти + загрузка/сохранение прогресса
{Для бэкграунда, игры}
img: array[0..16] of image; {массив загруженных изображений}
kl,sw,sh : integer; {нажатие кнопки | ширина, высота экрана}
x,y,txp,typ,i,j: integer; {мелкий сдвиг карты | коорд.тайла наход-ся в верх-левом углу экрана | параметры циклов}
my,mx,tx,ty : integer;{- ширина, высота карты | кол-во тайлов в строке и в столбце}
th,tw: integer; {высота, ширина тайлов}
bx,by,bc: integer; {проверка для буфер-ции, счётчик буфера}
bufer: string; {список загруженных тайлов}
lin: string; {считывание строки карты}
map : array[1..mapsize,1..mapsize] of char; {Карта местности}
scr : array[1..10,1..10] of char; {Отображаемый кусок карты}
hero,fn,fd: integer; // спрайт, номер фрейма перса
splash,karta,razraby:image; //менюшные картинки
oxsv,oysv,oxmv,oymv : integer; //Для исключения лишних загрузок из ресурсов
{Игра}
speed,dspeed: integer; //Скорости обычная и диагональная(pixels/iteration)
txt,object : string; //Впомогательные строки
hx, hy : integer; // Коорд.героя
d : integer; // Направление и номер кадра.
lx,ly : integer; // Координаты надписи загрузка
w,h : integer; // Сдвиг карты по X и Y. Ширина и высота карты
health,armour,loading: integer;// текущее здоровье,броня. центрирование загрузки
onum,omax : integer; //номер тек.объекта, кол-во объектов
gbar,bpanel,armb,lifb,box : image; //картинки HUD'a
obj,mask,shadow : array[1..15] of image; //Картинка объекта, его маска и тень
ox,oy,oxm,oym,oys,oxs : array[1..15] of integer; //использ. для сбора данных объекта
objname : array[1..15] of string; //название объекта
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
{ БУФЕРИЗАЦИЯ!!!! =) Тайлов }
procedure buferiz(v,w:integer);
begin
img[bc]:=LoadImage('/land'+scr[v,w]+'.JPG');
bufer:=bufer+scr[v,w];
bc:=bc+1;
end;
////////////////////////////////////////////////////////////////////////////
{----- Рисуем прогрессбар -----}
Procedure DrawPBar;
begin
loading:= loading+(PROGW/20); //Здесь значение 20 это кол-во загружаемых файлов(постоянно нужно менять)
If loading >= PROGW Then loading:= PROGW;
SetColor(0, 0, 0);
FillRect(0, 0, sw, sh);
setcolor(255,255,255);
DrawText(load,lx,ly);
SetColor(150, 150, 0);
DrawRect((sw - PROGW)/2-2, (sh + GetStringHeight('Загрузка'))/2+8, PROGW+2, 15);
FillRect((sw - PROGW)/2, (sh + GetStringHeight('Загрузка'))/2+10, loading, 12);
refresh;//repaint;
end;
/////////////////////////////////////////////////////////////////////////////
//// Конвертирует кракозябры, считаные с ресурса в русск-англ.строку
{ Не помню у кого взял код этой функции}
function ansi(str : string) : string;
var {rus_ansi to unicode}
s : string;
i,c : integer;
begin
s := '';
for i := 0 to length(str)-1 do
begin
c := ord(getChar(str,i)) and 255;
if (c>=192) then c := c+(1040-192) else
if (c<32) and (c<>10) then c := 32;
s := s+chr(c);
end;
ansi := s;
end;
/////////////////////////////////////////////////////////////////////////////
Function joy(nk:integer) : integer; // укороченный вариант KeyToAction
begin
joy:=keytoaction(nk);
end;
//////////////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ СОХРАНЕНИЯ И ЗАГРУЗКИ ПРОГРЕССА (c)Odd [Всё остальное писал сам (с)Cliffe] //
//////////////////////////////////////////////////////////////////////////////////////////
Procedure SaveProgress;
var
id: integer;
begin
rs:=OpenRecordStore('Saving');
id:=GetRecordStoreNextId(rs);
if id=1 then begin id:=AddRecordStoreEntry(rs,'0'); id:=AddRecordStoreEntry(rs,'0'); end;
{Далее сохраняем значения переменных}
ModifyRecordStoreEntry(rs,''+health,1);
ModifyRecordStoreEntry(rs,''+armour,2);
CloseRecordStore(rs);
str:='Игра сохранена ';
Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2);
delay(1600);
refresh;
end;
Procedure LoadProgress;
var
id: integer;
begin
rs:=OpenRecordStore('Saving');
id:=GetRecordStoreNextId(rs);
if id=1 then
begin
str:='Игра ещё не сохранялась ';
Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2);
delay(1000);
refresh;
end
else
begin
{Далее загружаем значения переменных}
health:=stringtointeger(ReadRecordStoreEntry(rs,1));
armour:=stringtointeger(ReadRecordStoreEntry(rs,2));
str:='Игра загружена ';
Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2);
delay(1000);
refresh;
end;
CloseRecordStore(rs);
end;
//////////////////////////////////////////////////////////////////////////////
// Очень удобно работать с настройками шрифта, //
// передаём процедуре строку char'ов, соответствие каждого см. в IF-THEN'ах //
// причём к передаваемой строке нет никаких ограничений //
//////////////////////////////////////////////////////////////////////////////
Procedure Font(fpar:string);
var
face,style1,style2,size,i,j: integer;
tp: char;
begin
face:=FONT_FACE_SYSTEM;
style1:=FONT_STYLE_PLAIN;
style2:=FONT_STYLE_PLAIN;
size:=FONT_SIZE_SMALL;
j:=1;
for i:=1 to length(fpar) do begin
tp:=getchar(fpar,i-1);
//Берём второй символ напр.: sYstem-->'Y' mOnospace-->'o' pRoportional-->'r'
if (tp='y') or (tp='Y') then face:=FONT_FACE_SYSTEM;
if (tp='o') or (tp='O') then face:=FONT_FACE_MONOSPACE ;
if (tp='r') or (tp='R') then face:=FONT_FACE_PROPORTIONAL;
//Далее проще используем первый символ: Small-->'S' Italic-->'i' и т.д.
if (tp='p') or (tp='P') then if j=1 then style1:=FONT_STYLE_PLAIN else style2:=FONT_STYLE_PLAIN;
if (tp='b') or (tp='B') then if j=1 then style1:=FONT_STYLE_BOLD else style2:=FONT_STYLE_BOLD;
if (tp='i') or (tp='I') then if j=1 then style1:=FONT_STYLE_ITALIC else style2:=FONT_STYLE_ITALIC;
if j=1 then j:=2 else j:=1;
if (tp='s') or (tp='S') then size:=FONT_SIZE_SMALL
if (tp='m') or (tp='M') then size:=FONT_SIZE_MEDIUM
if (tp='l') or (tp='L') then size:=FONT_SIZE_LARGE
end;
if (style1=FONT_STYLE_PLAIN) or (style2=FONT_STYLE_PLAIN) then
SetFont(face,FONT_STYLE_PLAIN,size)
else
SetFont(face,style1 or style2,size);
end;
//////////////////////////////////////////////////
// Так как функции game.get_key_clicked нету //
// пришлось написать её самому //
//////////////////////////////////////////////////
Function Click(key:integer): boolean;
begin
if (ks=key) and (ksl<>key) then click:=true else click:=false;
end;
{-------------------------------------------------------------}
{=============== # # ### ### # # ==================}
{=============== ## ## # # # ## # ==================}
{=============== # # # #### # # ## ==================}
{=============== # # # # ### # # ==================}
{-------------------------------------------------------------}
begin
game.init(1);
sprite.init(1);
game.show;
PROGW:=versWidth-6; //Устанавливаем ширину прогресс-бара
loading:=0;
speed:=3;
Font('myb');// устанавливаем шрифт SYSTEM-BOLD-MEDIUM
vW:=versWidth; vH:=versHeight; //Считываем значения констант в переменные
sw:=GetWidth; //Записываем размеры экрана
sh:=GetHeight;//чтобы по сто раз не писать GetWidth и GetHeight.
{Здесь осуществляется поддержка экранов, логика такова:
Если версия для меньшего экрана, то будем все вычисления проводить относительно онного.
А если версия для большего экрана, то дабы не разжирять jar-файл,
не будем осуществлять такую поддержку, хотя все вычисления будут проводиться отн-но реального экрана.
Отсюда следует, что нужно компилить по 3-4 версии: v.176(132x176,128x160), v.208(176x208),v.220(176x220), v.320(240x320)
Вот и вся не хитрая поддержка экранов =) }
if (vw<sw) then sw:=vw;
if (vh<sh) then sh:=vh;
setclip(0,0,sw,sh);
// Тут перечисляем пункты меню:
st[1]:='Новая игра';
st[2]:='Карта';
st[3]:='Загрузить';
st[4]:='Сохранить';
st[5]:='Разработчики';
st[6]:='Выход';
//Ну и конечно же нас - разрабов =)
res := openResource('/Autors.txt');
i:=0; upf:=vH*4/6;
repeat
i:=i+1;
rz[i]:=readLine(res);
ry[i]:=(getstringheight(rz[i]))*i;
until (rz[i]='The End =)'); // Строка, означающая "Конец чтения ресурса" (Тоже выводится на экран)
maxi:=i;
closeResource(res);
{Загружаем картинки соответственно версии:}
splash:=loadimage('/menu/splash'+versHeight+'.JPG');
karta:=loadimage('/menu/karta'+versHeight+'.JPG');
razraby:=loadimage('/menu/razraby'+versHeight+'.JPG');
// Загружаем аним_спрайт
hero:= sprite.create_frames('/walk1.png',29,39);
menu:=1;
new:=false; // Если true, то начинаем новую игру
continue:=false; // Если true, то можно вернуться из меню обратно в игру
setcolor(255,255,255);
np:=1; // номер активного пункта меню
xp:=(sw-getstringwidth(st[np]))/2; //Выравнивание пункта меню по центру;
//Цикл меню:
repeat
if New=true then begin // Начать новую игру?
//Переходим из меню в начало игры.
menu:=-1;
SetColor(0, 0, 0);
FillRect(0, 0, sw, sh);
dspeed:=Trunc(speed*7/10);//устанавливаем диагональную скорость передвижения персонажа
if (Continue=false) then
begin
//Начинаем НОВУЮ ИГРУ
health:=10; armour:=90; // устанавливаем начальные значения Здоровья и Брони
//// Чёрный экран, загрузка ////
load:='Загрузка анимации ';
lx:=(sw-getstringwidth(load))/2;
ly:=(sh-getstringheight(load))/2;
//Раньше я загружал каждый кадр анимации из отдельного файла, поэтому далее идёт коммент
{//// Загружаем АНИМАЦИИ персонажа...
for d:=1 to 9 do begin
for i:=0 to 3 do begin
DrawPBar;
load:=load+'.';
if (d<>5) then begin
walk[d,i]:= LoadImage('/hero/walk/'+d+i+'.png');
talk[d,i]:= LoadImage('/hero/talk/'+d+i+'.png');
end;
end;
load:='Загрузка анимации '+d;
end;}
//// Чёрный экран, загрузка ////
load:='Загрузка спрайтов ';
lx:=(sw-getstringwidth(load))/2;
ly:=(sh-getstringheight(load))/2;
//Загрузка НЕ анимированных спрайтов персонажа и Анимированных спрайтов окружения
{for d:=1 to 9 do begin
DrawPBar;
load:=load+'.';
if (d<>5) then begin
stop[d]:= LoadImage('/hero/stop/stopped'+d+'.png');
end;
if d<8 then fireborn[d]:=loadimage('/world/fire'+d+'.png');
end;}
//далее загружаем по-одному однокадровые обьекты, которые не являются препятствием
//box:=loadimage('/world/box.png');
///// Загрузка картинок HUD'a
gbar:=loadimage('/gunbar.png');
bpanel:=loadimage('/barpanel'+versHeight+'.png');
armb:=loadimage('/armorbar.png');
lifb:=loadimage('/healthbar.png');
hx:= trunc(sw/2-15);
hy:= trunc(sh/2-20);
d:=2;i:=0;
load:='Загрузка Обьектов';
lx:=(sw-getstringwidth(load))/2;
ly:=(sh-getstringheight(load))/2;
{res:= openResource('/Objects.txt');
// Загружаем объекты (картинки). В этой версии объекты загружаются, но не включаются в карту
onum:=0;
repeat
DrawPBar;
onum:=onum+1;
txt:=readLine(res);
if (copy(txt,0,1)<>'_') then begin
objname[onum]:=copy(txt,0,length(txt)-1);
load:='Загрузка обьекта '+objname[onum];
txt:=readLine(res);
ox[onum]:=Stringtointeger(copy(txt,3,length(txt)));
txt:=readLine(res);
oy[onum]:=Stringtointeger(copy(txt,3,length(txt)));
if onum>1 then
for i:=1 to onum do
if (objname[i]=objname[onum]) then begin
obj[onum]:=obj[i];
mask[onum]:=mask[i];
shadow[onum]:=shadow[i];
end;
else begin
obj[onum]:=loadimage('/world/'+objname[onum]+'.png');
mask[onum]:=loadimage('/world/'+objname[onum]+'_mask.png');
shadow[onum]:=loadimage('/world/'+objname[onum]+'_shadow.png');
end;
else begin
obj[onum]:=loadimage('/world/'+objname[onum]+'.png');
mask[onum]:=loadimage('/world/'+objname[onum]+'_mask.png');
shadow[onum]:=loadimage('/world/'+objname[onum]+'_shadow.png');
end;
txt:=readLine(res);
if txt<>'add' then txt:='_End'
end;
until (txt='_End');
omax:=onum; //Запиываем кол-во объектов
closeResource(res); }
SetColor(0, 0, 0);
FillRect(0, 0, sw, sh);
load:='Синхронизация Обьектов';
lx:=(sw-getstringwidth(load))/2-4;
ly:=(sh-getstringheight(load))/2;
DrawPBar;
// Далее компонуем тень, маску и картинку объекта
{ res:= openResource('/index.dat');
object:=readline(res);
repeat
oxsv:=stringtointeger(readLine(res));
oysv:=stringtointeger(readLine(res));
oxmv:=stringtointeger(readLine(res));
oymv:=stringtointeger(readLine(res));
for i:=1 to omax do begin
if objname[i]=object then begin
oxs[i]:=oxsv;
oys[i]:=oysv;
oxm[i]:=oxmv;
oym[i]:=oymv;
end;
load:='Синхронизация обьектов:'+i;
lx:=(sw-getstringwidth(load))/2;
ly:=(sh-getstringheight(load))/2;
drawpbar;
end;
object:=readline(res);
delay(10);
until (object='end');
closeResource(res); }
end;
else
//// Возврат в игру (чёрный экран, загрузка) ////
begin
load:='Загрузка';
lx:=(sw-getstringwidth('Загрузка..'))/2;
ly:=(sh-getstringheight(load))/2;
For i:=1 to 4 do begin
SetColor(0, 0, 0);
FillRect(0, 0, sw, sh);
setcolor(255,255,255);
DrawText(load,lx,ly);
refresh;//repaint;
load:=load+'.';
delay(40);
end;
end;
setcolor(255,0,0);
fillrect(0,0,240,320);
refresh;//repaint;
sprite.append(hero); // добавляем героя на экран
sprite.set_position(hero, hx, hy-5); // и ставим его в центр экрана
/////====== Новая часть движка ======/////
res:=OpenResource('/map.txt'); //Загружаем символьную карту местности
j:=1;
setcolor(255,255,0); // Переодически встречающуюся связку \/
fillrect(0,0,240,320); // Setcolor->FillRect-->(Repaint/Refresh) использую \/
refresh;//repaint; // для выявления момента сбоя приложения
bc:=0;
{Далее в цикле переношу карту в массив map[j,i] }
repeat
bc:=bc+1;
if (bc<mapsize) then lin:=ReadLine(res);
if (length(lin)>=mapsize-1) then lin:=copy(lin,0,mapsize);
if (length(lin)>0) and (lin<>'END') then
begin
i:=1;
repeat
map[j,i]:=getchar(lin,i-1);
i:=i+1;
until i>length(lin);
j:=j+1;
end
until (lin='END') or (bc>=mapsize); //Условие окончания считывания карты из ресурса
CloseResource(res);
mx:=i-1;my:=j-1;
setcolor(255,0,0);
drawtext(''+mx,5,5);
drawtext(''+my,25,5);
refresh;//repaint;
{==================================}
{============VARIABLES=============}
{==================================}
th:=64; tw:=64; {размер тайла}
bc:=0;
//tx:=6;ty:=6; {кол-во строк и столбцов тайлов отображаемых на дисплее(увеличить, если наблюдаются шлейфы)}
{Далее вариант с автоподгонкой значений tx и ty}
tx:=Trunc(sw/tw)+3;
ty:=Trunc(sh/th)+3;
txp:=7;typ:=4; {координаты левого верхнего тайла (при запуске)}
fd:=4; // устанавливаем начальное направление анимации перса
fn:=1; // устанавливаем начальный кадр анимации
setcolor(255,0,255); // Переодически встречающуюся связку \/
fillrect(0,0,240,320); // Setcolor->FillRect-->(Repaint/Refresh) использую \/
refresh;//repaint; // для выявления момента сбоя приложения
{Загрузка буфера}
for j:=1 to ty do
for i:=1 to tx do begin
scr[j,i]:=map[typ+j,txp+i]; //Считываем тайлы, которые должны быть отображены при старте
if Pos(bufer, scr[j,i])=-1 then buferiz(j,i); // Загружаем тайлы
end;
///=============== Игровой цикл ================///
repeat
jspeed:=GetRelativeTimeMs;
for j:=1 to ty do
for i:=1 to tx do begin
scr[j,i]:=map[typ+j,txp+i];
end;
kl:=getkeypressed;
ks:= game.get_key_states;
if ks<>0 then begin
if (game.get_bit(ks,4) <> 0) then begin x:=x-2; fd:=3; end;
if (game.get_bit(ks,32)<> 0) then begin x:=x+2; fd:=4; end;
if (game.get_bit(ks,2) <> 0) then begin y:=y-2; fd:=1; end;
if (game.get_bit(ks,64)<> 0) then begin y:=y+2; fd:=6; end;
// если двигаемся по диагонали, то изменяем
if (game.get_bit(ks,64)<> 0)and(game.get_bit(ks,4) <> 0) then fd:=5;
if (game.get_bit(ks,64)<> 0)and(game.get_bit(ks,32)<> 0) then fd:=7;
if (game.get_bit(ks,2) <> 0)and(game.get_bit(ks,4) <> 0) then fd:=0;
if (game.get_bit(ks,32)<> 0)and(game.get_bit(ks,2) <> 0) then fd:=2;
end;
//если убрать, то мидлет зависнет по незвестной причине(скорее всего из-за Lib_sprite или Lib_game)
delay(1);
{Далее идет смена кадров текущей анимации }
if ((game.get_bit(ks,64)<>0)xor(game.get_bit(ks,2)<>0))or((game.get_bit(ks,32)<>0)xor(game.get_bit(ks,4)<>0))then fn:=fn+2;
if fn>=40 then fn:=0;
if (fn>=0) and (fn<10) then sprite.set_frame(hero, fd*4);
if (fn>=10) and (fn<20) then sprite.set_frame(hero, fd*4+1);
if (fn>=20) and (fn<30) then sprite.set_frame(hero, fd*4+2);
if (fn>=30) and (fn<40) then sprite.set_frame(hero, fd*4+3);
if (y<-th) and (typ=0) then begin y:=-th; end;
if (y>th) and (typ=my-ty) then begin y:=th; end;
if (x<-tw) and (txp=0) then begin x:=-tw; end;
if (x>tw) and (txp=mx-tx) then begin x:=tw; end;
{Проверка на наличие незабуфер-ых тайлов
если таковые есть, подгружаем их налету (Выгрузку пока не сделал)}
if by>typ then for i:=1 to tx do if Pos(bufer, scr[1,i])=-1 then buferiz(1,i);
if by<typ then for i:=1 to tx do if Pos(bufer, scr[ty,i])=-1 then buferiz(ty,i);
if bx>txp then for j:=1 to ty do if Pos(bufer, scr[j,1])=-1 then buferiz(j,1);
if bx<txp then for j:=1 to ty do if Pos(bufer, scr[j,tx])=-1 then buferiz(j,tx);
for j:=1 to ty do
for i:=1 to tx do begin
drawimage(img[Pos(bufer, scr[j,i])],(i-2)*tw-x,(j-2)*th-y);
end;
bx:=txp; by:=typ;
if (x>tw) and (txp<=mx-tx) then begin txp:=txp+1; x:=0; end;
if (x<-tw) and (txp>=0) then begin txp:=txp-1; x:=0; end;
if (y>th) and (typ<=my-ty) then begin typ:=typ+1; y:=0; end;
if (y<-th) and (typ>=0) then begin typ:=typ-1; y:=0; end;
//Выводим техническую инфу на экран
drawtext('AlphaLevels:'+IntegerToString(GetAlphaLevels),5,5);
drawtext('Frames:'+fd+'_'+fn,5,20);
drawtext('Your delay:'+(100/(GetRelativeTimeMs-jspeed)),5,35);
drawtext('ks:'+ks+' kl:'+kl,5,50);
//отрисовываем HUD
drawimage(gbar,0,sh-getimageheight(gbar));
drawimage(bpanel,sw-getimagewidth(bpanel),sh-getimageheight(bpanel));
setclip(sw-58,sh-23,armour/2,10);
drawimage(armb,sw-58,sh-23);
setclip(sw-58,sh-12,health/2,10);
drawimage(lifb,sw-58,sh-12);
setclip(0,0,sw,sh);
refresh;
delay(Trunc(100/(GetRelativeTimeMs-jspeed))); //Делаем задержку для обеспечения эталонной скорости работы мидлета на девайсе
/// Чтобы избавиться от шлейфов, сразу после рипейнта красим экран чёрным:
// setcolor(0,0,0);
// fillrect(0,0,sw,sh);
until kl=-7; // по правому софту выходим в меню
np:=0; menu:=1;
If health>0 then
begin
continue:=true;//ставим флаг возможности продолжения игры
new:=false;
st[1]:='Вернуться'; //меняем значения пунктов меню
st[6]:='Завершить игру';
end;
remove(hero);//удаляем спрайт, дабы тот не вылез в меню
setcolor(255,255,255);
end;
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
{Обработка менюшки}
ks:=game.get_key_states;
kl:=getkeyclicked;
Font('rbm');
// Подготовка к выводу запрошенного пункта меню
if (kl=KE_KEY5) or click(FIRE) then begin
if (np=2) then begin menu:=2; np:=0; end;
if (np=3) then begin menu:=1; LoadProgress; np:=0; end;
if (np=4) then begin menu:=1; SaveProgress; np:=0; end;
if (np=5) then begin menu:=3; np:=0; end;
if (np=6) then begin menu:=4; np:=0; end;
if menu=1 then if (np=1) then begin new:=true; menu:=-1; np:=0; end;
end;
////Вывод меню
if (menu=1) then begin
if np=0 then np:=1;
if (kl=KE_KEY4) or click(LEFT) then np:=np-1;
if (kl=KE_KEY6) or click(RIGHT) then np:=np+1;
if (np=7) then np:=1;
if (np=0) then np:=6;
yp:=sh-getstringheight(st[np])-4;
xp:=(sw-getstringwidth(st[np]))/2;
drawimage(splash,0,0);
drawtext(st[np],xp,yp);
refresh;//repaint;
end;
////Вывод карты
if menu=2 then
begin
ksl:=ks;
repeat
kl:=getkeyclicked;
ks:=game.get_key_states;
drawimage(karta,0,0);
if (kl=KE_KEY5) or click(FIRE) then begin menu:=1; kl:=0; end;
refresh;//repaint;
ksl:=ks;
until menu=1;
end;
////Вывод экрана разрабов
if menu=3 then
begin
Font('sbs');
ksl:=ks;
repeat
kl:=getkeyclicked;
ks:=game.get_key_states;
upf:=upf-2;
drawimage(razraby,0,0);
if ry[maxi]+upf<0 then upf:=vH*5/6;
setclip(0,vH/6,vW,vH*14/24);
for i:=1 to maxi do
if (ry[i]+upf<vH*5/6) and (ry[i]+upf>vH/7)then drawtext(rz[i],vW/8,ry[i]+upf);
setclip(0,0,sw,sh);
refresh;//repaint;
if (kl=KE_KEY5) or click(FIRE) then begin menu:=1; kl:=0; end;
ksl:=ks;
until menu=1;
end;
if menu=4 then
begin
ksl:=ks;
if (Continue=true) then // обнуляем возможность вернуться или нет
repeat
kl:=getkeyclicked;
if (kl=KE_KEY3) then begin menu:=1; kl:=0; np:=0 end; // отмена
if (kl=KE_KEY1) then
begin // завершаем
np:=0; continue:=false; new:=false;
st[1]:='Новая игра';
st[6]:='Выход';
menu:=1;
end;
str:='Завершить текущую игру?';
Drawtext(str,(sw-getstringwidth(str))/2,sh/2-getstringheight(str));
str:='yes[1] / no[3]';
Drawtext(str,(sw-getstringwidth(str))/2,sh/2+getstringheight(str));
refresh;
delay(100);
until menu=1
else // ВЫЙТИ? Да/Нет?
repeat
kl:=getkeyclicked;
if (kl=KE_KEY3) then begin menu:=1; kl:=0; np:=0 end; // отмена
if (kl=KE_KEY1) then begin menu:=1; exit:=true; end; // выбран выход
str:='Вы уверены?';
Drawtext(str,(sw-getstringwidth(str))/2,sh/2-getstringheight(str));
str:='yes[1] / no[3]';
Drawtext(str,(sw-getstringwidth(str))/2,sh/2+getstringheight(str));
refresh;
delay(100);
until menu=1;
end;
ksl:=ks;
until exit; //Выходим или возвращаемся
end.