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

interface

procedure Game5Init;
procedure Game5Draw;
procedure Game5Process;

procedure EndTask;

implementation

uses uGUI,uGeneralData,OMEGA,uGame,uEndTask;

var Cr:array [1..4] of tCard;
    QCr:integer;
    Card:tCard;

    time,timestart:double;

    ac:array [1..4,1..2] of integer;

    CardX,CardY,CardSizeX,CardSizeY:integer; //размеры карт для сравнения

    nowtc:integer;               //текущая выделеная карта

    q1,q2,q3:real;

    MenuPanel:tMenuPanel;

procedure Game5Init;
var DF:textfile;
    i,i1,i2,t1,t2: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,QCr);
readln(DF,CardX,CardY);
readln(DF,cardsizex,cardsizey);
// читаем размеры
// и положение основной карты
readln(DF,Card.sizex,Card.sizey);
readln(DF,Card.x,Card.y);
Card.Init;
// читае время выполнения задания
readln(DF,time);
closefile(DF);

//
card.x:=((ScrW-158)-(card.sizex*16+56)) div 2+158;
CardX:=card.x;
randomize;
for i1:=1 to card.sizex do
 for i2:=1 to card.sizey do begin
  card.data[i1,i2,1]:=10<random(20);
  card.data[i1,i2,2]:=false;
end;
//
for i:=1 to QCr do begin
 Cr[i].sizex:=cardsizex;
 Cr[i].sizey:=cardsizey;
 Cr[i].x:=CardX;
 Cr[i].y:=CardY;
 CardX:=CardX+Cr[i].sizex*16+56+20;
 Cr[i].Init;

 t1:=random(card.sizex-cardsizex);
 t2:=random(card.sizey-cardsizey);

 for i1:=1 to cr[i].sizex do
  for i2:=1 to cr[i].sizey do begin
   cr[i].data[i1,i2,1]:=card.data[t1+i1,t2+i2,1];
   cr[i].data[i1,i2,2]:=false;
  end;

end;

//задаём параметры выделения
for i:=1 to 4 do begin
 ac[i,1]:=-1;ac[i,2]:=-1;
end;
nowtc:=1;

//обнуляем результаты тренировки
rezult:=0;
eror:=0;
speed:=0;

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

end;

procedure Game5Draw;
var str:PChar;
    i,t,t1,t2:integer;
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);

//в зависимости от текущей выбраной карты рисуем прямоугольник выделения
case NowTC of
 1:DrawFWind(1,Cr[1].x-5,Cr[1].y-5,Cr[1].sizex*16+66,Cr[1].sizey*16+66);
 2:DrawFWind(1,Cr[2].x-5,Cr[2].y-5,Cr[2].sizex*16+66,Cr[2].sizey*16+66);
 3:DrawFWind(1,Cr[3].x-5,Cr[3].y-5,Cr[3].sizex*16+66,Cr[3].sizey*16+66);
 4:DrawFWind(1,Cr[4].x-5,Cr[4].y-5,Cr[4].sizex*16+66,Cr[4].sizey*16+66);
end;
//и пишем номер карты
Text_Draw(font,Cr[1].x-2,Cr[1].y-4,'1',1,0,255,$003B7D);
Text_Draw(font,Cr[2].x-2,Cr[2].y-4,'2',1,0,255,$003B7D);
Text_Draw(font,Cr[3].x-2,Cr[3].y-4,'3',1,0,255,$003B7D);
Text_Draw(font,Cr[4].x-2,Cr[4].y-4,'4',1,0,255,$003B7D);

//рисуем главную карту
Card.Draw;
//рисуем малые карты и выделения на гл. карте
for i:=1 to QCr do begin
 Cr[i].Draw;
 if ac[i,1]<>-1 then begin
  DrawFWind(1,card.x+16+ac[i,1]*16,card.y+16+ac[i,2]*16,16*cardsizex,16*cardsizey);
  Text_Draw(font,card.x+20+ac[i,1]*16,card.y+16+ac[i,2]*16,U_IntToStr(i),1,0,255,$00094B);
 end;
end;

MenuPanel.Draw;

end;

procedure Game5Process;
var i,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;

//если игрок нажмёт на какой-либо карте для поиска она выделится
for i:=1 to QCr do
 if ((mouse_x>cr[i].x) and (mouse_x<cr[i].x+cr[i].sizex*16+56))
 and ((mouse_y>cr[i].y) and (mouse_y<cr[i].y+cr[i].sizey*16+56))
 and (mouse_press(m_lbutton))
 then nowtc:=i;
//когда игрок находит нужный элемент, ему требуется
//щелкнуть на левой верхней точке элемента
//при этом весь необходимый кусок выделится.
if ((mouse_x>card.x+32) and (mouse_x<card.x+card.sizex*16+48-cardsizex*16))
and ((mouse_y>card.y+32) and (mouse_y<card.y+card.sizey*16+48-cardsizey*16))
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;
 if (ac[nowtc,1]=t1) and (ac[nowtc,2]=t2) then begin
  ac[nowtc,1]:=-1;
  ac[nowtc,2]:=-1;
 end else begin
  ac[nowtc,1]:=t1;
  ac[nowtc,2]:=t2;
 end;
end;

end;

procedure EndTask;
var i,i1,i2,score,t:integer;
    tb:boolean;
begin

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

//проверяем задание
for i:=1 to QCr do begin
 tb:=false;
 //если не выделен соответствующий карте участок
 //то ошибка
 if (ac[i,1]<>-1) then
  for i1:=1 to Cr[i].sizex do
   for i2:=1 to Cr[i].sizey do
   //сравниваем выделеный участок и
   //и соответствующию ему карту
    if Cr[i].data[i1,i2,1]<>card.data[ac[i,1]+i1-1,ac[i,2]+i2-1,1] then begin
    //и если найдём хоть одно отличие
    //то выходим из цикла
     tb:=true;
     break;
    end else continue
 else tb:=true;
 //и сохраним результат
 if tb then t:=trunc(t+q1*80) else score:=trunc(score+q1*80);
end;

rezult:=trunc(q1*score);
eror:=trunc(q3*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.
