unit uGame6;
///////////////////////////////////
// версия 1,0
///////////////////////////////////
// модуль задания
// "Заполнение карты"
///////////////////////////////////

interface

procedure Game6Init;
procedure Game6Draw;
procedure Game6Process;

procedure EndTask;
function BolToInt(x,y:integer):byte;

implementation

uses uGUI,uGeneralData,OMEGA,uGame,uEndTask,uGameText;

var Card:tCard;
    data:array [1..100,1..100] of byte; //текст для заполнение
    qxdata,qydata:byte;                 //кол-во текста по гориз. и верт.

    time,timestart:double;

    q1,q2,q3:real;

    MenuPanel:tMenuPanel;

    HCr:array [1..4] of tCard;

procedure Game6Init;
var DF:textfile;
    i,i1,i2:integer;
begin

// делаем меню
MenuPanel.Init('menupanel',0,0,158,Scrh);
// и добовляем в него кнопки
MenuPanel.AddBtn('в меню','buttoncirclmenu','bbackmenu',10,10,true,font);
MenuPanel.AddBtn('выход','buttoncirclnormal','bquit',10,scrh-138,true,font);
MenuPanel.AddBtn('проверить задание','buttoncirclnormal','bgotask',10,300,true,font);

// загружаем параметры задания по соответствующему типу и сложности
assignfile(DF,Dfld+'tasks\'+SceneName+'.txt');
reset(DF);
// задаём коэфициенты очков
readln(DF,q1,q2,q3);
// задаём положение и размеры карты
readln(DF,Card.x,Card.y);
readln(DF,Card.sizex,Card.sizey);
Card.Init;
// читае время выполнения задания
readln(DF,time);
closefile(DF);

card.x:=((ScrW-158)-(card.sizex*16+56)) div 2+158;
for i1:=1 to card.sizex do
 for i2:=1 to card.sizey do begin
  card.data[i1,i2,1]:=false;
  card.data[i1,i2,2]:=false;
 end;

qxdata:=card.sizex div 2;
qydata:=card.sizey div 2;

randomize;
for i1:=1 to qydata do
 for i2:=1 to qxdata do
  data[i2,i1]:=10*(Random(4)+1)+(Random(4)+1);

i2:=10;
for i1:=1 to 4 do begin
 HCr[i1].sizex:=1;
 HCr[i1].sizey:=2;
 HCr[i1].x:=168;
 HCr[i1].y:=i2;
 i2:=i2+HCr[i1].sizey*16+66;
 HCr[i1].Init;
end;

HCr[1].data[1,1,1]:=false;HCr[1].data[1,2,1]:=false;
HCr[2].data[1,1,1]:=false;HCr[2].data[1,2,1]:=true;
HCr[3].data[1,1,1]:=true;HCr[3].data[1,2,1]:=false;
HCr[4].data[1,1,1]:=true;HCr[4].data[1,2,1]:=true;

//получаем время начала игры
timestart:=U_GetTime;

end;

procedure Game6Draw;
var t,t1,t2:integer;
    str:PChar;
begin

//на столе рисуем таймер
str:=PChar('времени осталось - '+U_IntToStr(trunc(time)-(trunc(U_GetTime-timestart) div 1000) mod 1000));
t:=trunc(Text_GetWidth(font,str,1,0)); //узнаём ширину текста
t1:=((scrw-158)-t) div 2+158;
t2:=5;
Pr2D_Rect(t1,t2,(t+20)*((trunc(U_GetTime-timestart) div 1000) mod 1000)/time,20,$003B7D,255,PR_Fill );
DrawGWind(t1,t2,t+20,20,200);
Text_Draw(font,10+t1,t2,str,1,0,255,$003B7D);

DrawFWind(1,card.x+46,40,qxdata*24+20,qydata*30+20);
for t1:=1 to qxdata do
 for t2:=1 to qydata do begin
  Text_Draw(font,card.x+32+t1*24,20+t2*30,U_IntToStr(data[t1,t2]),1,0,255,$ffffff);
end;

For t1:=1 to 4 do begin
 HCr[t1].Draw;
 Text_Draw(font,HCr[t1].x-2,HCr[t1].y-4,U_IntToStr(t1),1,0,255,$003B7D);
end;

Card.draw;

//если курсор в рабочих пределах второй карты, на соответствуещем отверстии первой карты рисуем выделение
if ((mouse_x>card.x+32) and (mouse_x<card.x+card.sizex*16+32))
and ((mouse_y>card.y+32) and (mouse_y<card.y+card.sizey*16+32))
then begin
//узнаём над каким отверстием карты находится курсор
 t1:=mouse_x-card.x-32;
 t2:=mouse_y-card.y-32;
 t1:=t1 div 16+1;
 t2:=t2 div 16+1;
 DrawFWind(2,card.x+24+t1*16,card.y+23+t2*16,6,6);
 t1:=(t1 div 2)+(t1 mod 2);
 t2:=(t2 div 2)+(t2 mod 2);
 DrawFWind(1,card.x+30+t1*24,20+t2*30,18,17);
end;

MenuPanel.Draw;

end;

procedure Game6Process;
var t1,t2:integer;
begin

MenuPanel.Process;

// проверяем нажатия кнопок меню
if (col_pointinaabb(mouse_x,mouse_y,@MenuPanel.Btn[1].c1))
 and (mouse_press(m_lbutton)) then GoToMenu;

if (col_pointinaabb(mouse_x,mouse_y,@menupanel.Btn[2].c1))
 and (mouse_press(m_lbutton)) then Oe_Quit;

if (col_pointinaabb(mouse_x,mouse_y,@menupanel.Btn[3].c1))
 and (mouse_press(m_lbutton)) then EndTask;

//разница во времени между временим на выполнение и уже пройденым
//уже пройденое в сек. = trunc(U_GetTime-timestart) div 1000
if (trunc(time)-(trunc(U_GetTime-timestart) div 1000) mod 1000)<=0 then EndTask;

//если щёлкаем на каком либо отверстии второй карты
//то выделяем его
if ((mouse_x>card.x+32) and (mouse_x<card.x+card.sizex*16+32))
and ((mouse_y>card.y+32) and (mouse_y<card.y+card.sizey*16+32))
and (mouse_press(m_lbutton)) then begin
 t1:=mouse_x-card.x-32;
 t2:=mouse_y-card.y-32;
 t1:=t1 div 16+1;
 t2:=t2 div 16+1;
 card.data[t1,t2,1]:=not card.data[t1,t2,1];
end;

end;

function BolToInt(x,y:integer):byte;
var i:integer;
begin

i:=0;
if card.data[x,y*2-1,1] then i:=i+2;
if card.data[x,y*2,1] then i:=i+2 else i:=i+1;

case i of
 1:BolToInt:=1;
 2:BolToInt:=2;
 3:BolToInt:=3;
 4:BolToInt:=4;
end;

end;

procedure EndTask;
var i,i1,i2,score,t:integer;
    str1,str2:string;
    DF:textfile;
begin

score:=0;
t:=0;
speed:=trunc(q2*(trunc(time)-(trunc(U_GetTime-timestart) div 1000) mod 1000));

for i1:=1 to qydata do
 for i2:=1 to qxdata do begin
  i:=10*BolToInt(i2*2-1,i1)+BolToInt(i2*2,i1);
  if i=data[i2,i1] then score:=trunc(score+q1) else t:=trunc(t+q3);
end;

rezult:=score;
eror:=t;

//если в режиме тренировки, то переходим на экран тренировки
//если в режиме игры, то запоминаем результат
//в результаты игрока
if trening then gscene:=sTraining else begin
 Player.Experience:=Player.Experience+rezult;
 Player.Accuracy:=Player.Accuracy+eror;
 Player.Speed:=Player.Speed+speed;
//выводим результаты задания
 EndTaskB:=true;
 EndTaskInit;
end;

end;

end.
