unit Mform;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, KeyBoard,
  Graphics, Controls, Forms, GLScene, GLWin32FullScreenViewer,
  GLWin32Viewer, GLMisc,
  GLTexture, GLCadencer, GLSkyBox, GLBitmapFont, GLGui, ZipMstr, ExtCtrls,
  GLProxyObjects, jpeg, GLSound, GLSMBASS;

type
  TM = record
    X,Y : word;
  end;
  TOForm = class(TForm)
    ML3: TGLMaterialLibrary;
    FullViewer: TGLFullScreenViewer;
    GLBitmapFont1: TGLBitmapFont;
    Cadencer: TGLCadencer;
    Zip: TZipMaster;
    Timer: TTimer;
    Image1: TImage;
    GLSoundLibrary1: TGLSoundLibrary;
    GLSMBASS1: TGLSMBASS;
    procedure FullViewerMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FullViewerMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure CadencerProgress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure FullViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure TimerTimer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  C=2;

var
  OForm: TOForm;
  M, M2 : TM;
  GObj : TGLBaseSceneObject;
  GN : string;

implementation
uses
  Otshelm_A, Otshelm_B, Otshelm_C, Lives, ghload, logaut, Loader,
  Map, Setup, Sound;

{$R *.dfm}

procedure TOForm.FullViewerMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  M.X:=X;
  M.Y:=Y;
  L.GLVis.Visible:=false;
  L.GLUnVis.Visible:=true;
  logaut.GlLgVis.Visible:=false;
  GObj:=nil;

  case TofG of
  0 : begin
      if Setup.FullWin then
        begin
          if OTofG=3 then FullViewer.Camera:=Ocamera;
          GObj:=FullViewer.Buffer.GetPickedObject(X, Y) as TGLBaseSceneObject;
          GGLMouseDown(Sender,TMouseButton(Button),Shift,X,Y);
          if OTofG=3 then FullViewer.Camera:=LGcamera;
        end
      else
        begin
          if (OTofG=3) and (Viewer<>nil) then Viewer.Camera:=Ocamera;
          GObj:=Viewer.Buffer.GetPickedObject(X, Y) as TGLBaseSceneObject;
          GGLMouseDown(Sender,TMouseButton(Button),Shift,X,Y);
          if (OTofG=3) and (Viewer<>nil) then Viewer.Camera:=LGcamera;
        end;

    end;

  1: if ssLeft in Shift then
      begin
        if Shadow<>nil then Shadow.Visible:=false;
        MClick(X,Y);
        if Shadow<>nil then Shadow.Visible:=true;
    end;

  3: begin
      L.GLVis.Visible:=false;
      L.GLUnVis.Visible:=false;
      logaut.GlLgVis.Visible:=false;

      if (ssRight in Shift) then logaut.MR:=true else logaut.MR:=false;
      if (ssLeft in Shift) then logaut.ML:=true else logaut.ML:=false;
      MRClick(X,Y);

      if Setup.FullWin then
        begin
          FullViewer.Camera:=Ocamera;
          GObj:=FullViewer.Buffer.GetPickedObject(X, Y) as TGLBaseSceneObject;
          GGLMouseDown(Sender,TMouseButton(Button),Shift,X,Y);
          FullViewer.Camera:=LGcamera;
        end
      else
      if (Viewer<>nil) then
        begin
          Viewer.Camera:=Ocamera;
          GObj:=Viewer.Buffer.GetPickedObject(X, Y) as TGLBaseSceneObject;
          GGLMouseDown(Sender,TMouseButton(Button),Shift,X,Y);
          Viewer.Camera:=LGcamera;
        end;
     end;
  7: begin
       GObj:=FullViewer.Buffer.GetPickedObject(X, Y) as TGLBaseSceneObject;
       GGLMouseDown(Sender,TMouseButton(Button),Shift,X,Y);
     end;
  end;
  L.GLVis.Visible:=true;
  L.GLUnVis.Visible:=false;
  logaut.GlLgVis.Visible:=true;

end;

procedure TOForm.FullViewerMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  GObn : string;
begin
  GGLMouseUp(Sender,TMouseButton(Button),Shift,X,Y);
//  if (TofG=1) or (TofG=3) then
    if GObj<>nil then
      begin
        GObn:=GObj.Name;
        if GObn ='GBU1001' then
          begin
            ghload.Layer[1].Visible:=false;
            if not WMenu then
              begin
                WMenu:=true;
                TofG:=1;
                getguimess('Добро пожаловать и игру Отшельник!', 'Рядом с вашим лесом поломались 5 труб, и ваши друзья попросили починить их. Для этого нужно найти люк с изображением солнца, и находясь по близости кликнуть по нему мышкой. Управление осуществляется с помощью клавиатуры (стрелки) или мышки','Все понятно');
                ghload.GLButton[1].O.Caption:='Продолжить'
              end
            else
            GObn:='GBU1004'
          end;
        if GObn='GBU1002' then
          begin
            if WMenu then
            TofG:=OTofG;
            getguimess('Об Авторе:','Игра разработана Трофимовым Алексеем (cdmlex)  для конкурса "паропанк" на igdc.ru','Ну ладно');
            if not WMenu then
            ghload.Layer[1].Visible:=true;
          end;
        if GObj.Name='GBU1003' then
          begin
            pisecALL;
            Application.Terminate;
          end;
        if GObn='GBU1004' then
          begin
            TofG:=OTofG;
            ghload.Layer[2].Visible:=false;
            if OTofG=3 then ghload.Layer[3].Visible:=true
            else
            if OTofG=7 then DialogN;
          end;

        if GObn='GBU1005' then
        logaut.ResetLogGame;

        if GObn='GBU1006' then
          begin
            ghload.Layer[1].Visible:=false;
            ghload.Layer[2].Visible:=false;
            ghload.Layer[3].Visible:=false;
            MLGe;
          end;

     end;
end;

procedure TOForm.CadencerProgress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
  if Otshelm_C.WGame
  then
    begin
      dt:=deltaTime;
      case TofG of
      0:  GGLChange;
      1:  Otshelm_C.presskey;
      2:  if Otshelm_C.SCMB then Otshelm_C.SCrCM else
          begin
            TofG:=3;
            logaut.StartLogGame;
            getguimess('Вы готовы приступить к ремонту','Трубы будут починены только тогда, когда заработают все "паророметры", и нигде не будет просачиваться пар. Чтобы повернуть трубу влево - кликните левой кнопкой мыши, вправо - правой. Чтобы пустить пар по трубам - кликните на кране.','Хорошо');
          end;
      3: begin
          GGLChange;
          logaut.workLG;
         end;
      8: BotsWork;   
      end;


  if (TCWin=5) and (ToFG=1) then
    begin
      Sound.PSoundY('win');
      getguimess('Поздравляю','Ура! Вы восстановили все трубы, надо обрадовать Немо!','Уже бегу!');
      TCWin:=6;
    end;
  end;
//  Caption:=floattostr(dt);
end;

procedure TOForm.FullViewerMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
   GameCur.Position.X:=X+10;
   GameCur.Position.Y:=Y+10;
   M2.X:=X;
   M2.Y:=Y;

   if not SCMB then
   if (ssRight in Shift) then
   case TofG of
   0: GGLMouseMove(Sender, Shift, X, Y);
   1: begin  OCamera.MoveAroundTarget(m.y-y, m.x-x);
             m.x:=x; m.y:=y;
             if OCamera.Position.Z < 0.5 then
             OCamera.Position.Z:=0.5;
      end;
   3: begin  LGCamera.MoveAroundTarget(m.y-y, m.x-x);
             m.x:=x; m.y:=y;
             if LGCamera.Position.Z < 0.5 then
             LGCamera.Position.Z:=0.5;
      end;
   end;

end;

procedure TOForm.TimerTimer(Sender: TObject);
begin
  if TofG=99 then
    begin
      Otshelm_A.CreatAll;
      Otshelm_C.loadlevel('');
      ghload.Layer[2].Visible:=false;
      ghload.Layer[3].Visible:=false;
      Loader.INCDir(ExtractFilePath(Application.ExeName)+'Data\temp\');
      TofG:=0;
      OTofG:=1;
      WMenu:=false;
      showCursor(false);
      Sound.PMusic('mz1');
    end
  else
    begin
      if (not Setup.FullWin) and (Viewer<>nil) then
        begin
     {     Caption:=GN+Format(' %.1f FPS', [Viewer.FramesPerSecond]);
          Viewer.ResetPerformanceMonitor;    }
        end;
    end;
end;

procedure TOForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  pisecALL;
end;

procedure TOForm.FormCreate(Sender: TObject);
begin
  Image1.Align:=alClient;
  TofG:=99;
  OTofG:=0;
  GN:=Caption;
end;

procedure TOForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (IsKeyDown(vk_escape)) and (TofG<7) and (OTofG>0) then
  begin
    if (TofG=1) or (TofG=3) then
      begin
       OTofG:=TofG;
       TofG:=0;
       ghload.Layer[2].Visible:=false;
       ghload.Layer[3].Visible:=false;
       ghload.Layer[1].Visible:=true;
      end
    else
      begin
        ghload.Layer[1].Visible:=false;
        ghload.Layer[2].Visible:=false;
        if OTofG=3 then ghload.Layer[3].Visible:=true else ghload.Layer[3].Visible:=false;
        TofG:=OTofG;
      end;
   end;
end;

procedure TOForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
  AD : real;
begin
  if (TofG=1) then
    begin
      AD:=0.2;

      if Ocamera.Position.Z>3 then Ocamera.Position.Z:=Ocamera.Position.Z-AD;

      if Ocamera.Position.Y>3 then Ocamera.Position.Y:=Ocamera.Position.Y-AD
      else
      if Ocamera.Position.Y<-3 then Ocamera.Position.Y:=Ocamera.Position.Y+AD;

      if Ocamera.Position.X>3 then Ocamera.Position.X:=Ocamera.Position.X-AD
      else
      if Ocamera.Position.X<-3 then Ocamera.Position.X:=Ocamera.Position.X+AD;
    end
  else
  if (TofG=3) then
    begin
      AD:=0.02;
      if LGcamera.Position.Z>0.75 then LGcamera.Position.Z:=LGcamera.Position.Z-AD;
    end;

end;

procedure TOForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
  AD : real;
begin
  if (TofG=1) then
    begin
      AD:=0.2;
      if Ocamera.Position.Z<5 then Ocamera.Position.Z:=Ocamera.Position.Z+AD;

      if Ocamera.Position.Y>3 then Ocamera.Position.Y:=Ocamera.Position.Y-AD
      else
      if Ocamera.Position.Y<-3 then Ocamera.Position.Y:=Ocamera.Position.Y+AD;

      if Ocamera.Position.X>3 then Ocamera.Position.X:=Ocamera.Position.X-AD
      else
      if Ocamera.Position.X<-3 then Ocamera.Position.X:=Ocamera.Position.X+AD;
    end
  else
  if (TofG=3) then
    begin
      AD:=0.02;
      if LGcamera.Position.Z<1.17 then LGcamera.Position.Z:=LGcamera.Position.Z+AD;
    end;

end;

end.
