unit yatc_script;
{YATC - Unit Global
Autor : Tobias Mark aka Colenzo (tobiasmark@gmx.de)

Hilfs Funktionen die in den Skript benutzt werden um einfluss zu nehmen,funktionen um skript aufzurufen

****
 bug : script kann feld größe nicht ändern?

***

Version
0.1 - 6.9 : - Erste version
}
interface

uses yatc_global,yatc_block,sysutils,Globjects,dialogs,yatc_field,yatc_gameoptions;


//********Block zusammbassteln

function newblock_script(x,y : integer;b,g,r: single) : Tobject; //skript
//erstellt einen neuen Block im Hauptspielfeld

procedure connectright_script(block1,block2 : Tobject);//skript
procedure connectleft_script(block1,block2 : Tobject); //skript
procedure connectdown_script(block1,block2 : Tobject); //skript
procedure connectup_script(block1,block2 : Tobject);  //skript
//verbindet block 2 mit block 1 in der angegeben richtung und umgekehrt

function randomcolor_script : single;    //skript
//gibt einen wert zwischen 0 und 1 zurück

//**********Spiel Block Starte

procedure setresult_script(block : Tobject);   //skript
//Setzt den ergebniss Block

function select_script(var test : integer; mode : Rgamemode) : boolean;  //program
//Ruft die Skript funktion zur Block auswahl auf, test gibt den ausgewählten block zurück funktiosn ergebiss berichtet über erfolg
//test varialbe : a) -1 => totalen Ersatz aufrufen b) zufalls numer für den teil ersatz

function create_script(field : TBlockfield;number : integer) : Ttcube; //program
//Ruft die Skript Funktion zur erzeugung eines bestimmten blockes(number) auf

function randomint_script(range : integer) : integer; //skript
//ruft random(range) auf

//************Spielablauf

function speed_script : integer;  //programm
//ruft die Geschwindigkeits ermittlungs funktion auf

function points_script(lines : integer) : integer;  //programm
//ruft die Punkte ermittlungs funktion auf

function level_script : integer;  //programm
//ruft die Level ermittlungs funktion auf

//************Interface

procedure updatedata_script;   //skript
//erneuert die bassiseinstellung wenn vom skript verändert

procedure setcamera_script(position : integer); //skript
//setzt kamera entferung

procedure locksize_script;      //skript
//verhindert größen änderung

procedure lockmode_script;     //skript
//verhindert schwierikeitsgrad änderung

procedure dialog_script(text : string); //skript
//macht ein showmessage(text)

procedure setSize_script(x,y : integer); //script
//set die Größe des Spielfelds

procedure setpreViewSize_script(x,y : integer);  //script
//Setz die Preview Größe

procedure newgame_script; //programm
//wird beim starten eines neuen spiels aufgerufen, dient zum varialben einsten usw.

implementation

uses yatc_main,yatc_blocks;

var tempfield : TBlockfield;  // Parameter die für yatc_Blocks prozeduren gebracucht werden aber im Skript nicht vorkommen sollen, seperat vor jedem aufruf eingestellt
    tempdummy : Tgldummycube;
    tempblock : Ttcube; //rückgabe wert aus skript, umweg da objekte nicht zurückgeben werden können

procedure connectright_script(block1,block2 : Tobject);

begin   //verbinden
  ttcube(block1).linked[dright] := ttcube(block2);
  ttcube(block2).linked[dleft] := ttcube(block1);
end;

procedure connectleft_script(block1,block2 : Tobject);

begin          //verbinden
  ttcube(block1).linked[dleft] := ttcube(block2);
  ttcube(block2).linked[dright] := ttcube(block1);
end;

procedure connectdown_script(block1,block2 : Tobject);

begin        //verbinden
  ttcube(block1).linked[ddown] := ttcube(block2);
  ttcube(block2).linked[dup] := ttcube(block1);
end;

procedure connectup_script(block1,block2 : Tobject);

begin          //verbinden
  ttcube(block1).linked[dup] := ttcube(block2);
  ttcube(block2).linked[ddown] := ttcube(block1);
end;

function randomcolor_script : single;

begin
//  randomize;
  result := random;
end;

procedure setresult_script(block : Tobject);

begin
  tempblock := TTcube(block);
end;

function newblock_script(x,y : integer;b,g,r: single): Tobject;

begin     //erzeugung aufrufen, im Hauptfeld!
  result := Tobject(newblock(tempfield,x,y,b,g,r));
end;

function select_script(var test : integer; mode : Rgamemode) : boolean;


begin
  if optionForm.script > 0 then //schauen ob es eins gibt
  begin
    if test = -1 then //suchen nach full version
    begin
      if form1.scriptengine.GetProcMethod('select_full').code <> nil then
      begin           //wenn ja dann ausführen
        test := strtoint(form1.scriptengine.executefunction([],'select_full'));
        result := true;     //ausgefürht
      end
      else result :=false;
    end
    else
    begin
      if form1.scriptengine.GetProcMethod('select').code <> nil then
      begin          //suchen nach teil funkion und ausführen
        test := strtoint(form1.scriptengine.ExecuteFunction([test],'select'));
        if test <> -1     //ergebniss?
        then  result := true
        else result := false;
      end
      else  result := false
    end;
  end
  else result := false;
end;


function create_script(field : TBlockfield;number : integer): Ttcube;

begin
  result := nil;
  if optionForm.script > 0 then //schauen ob es eins gibt
  begin
    tempfield := field;
    tempdummy := field.content;
    if form1.scriptengine.GetProcMethod('create').code <> nil then
    begin    //schauen ob methode vorhanden und dann ausführen
      form1.scriptengine.ExecuteFunction([number],'create');
      result := tempblock;      //ergebniss holen
    end;
  end;
end;

function randomint_script(range : integer) : integer;

begin
//  randomize;
  result := random(range);
end;

function speed_script : integer;

begin
  if optionForm.script > 0 then
  begin
    if form1.scriptengine.GetProcMethod('calculatespeed').Code <> nil then
      result := strtoint(form1.scriptengine.ExecuteFunction([],'calculatespeed'))
    else result := -1;
  end
  else result := -1;
end;

function points_script(lines : integer) : integer;

begin
  if optionForm.script > 0 then
  begin
    if form1.scriptengine.GetProcMethod('calculatepoints').Code <> nil then
      result := strtoint(form1.scriptengine.ExecuteFunction([lines],'calculatepoints'))
    else result := -1;
  end
  else result := -1;
end;

function level_script : integer;

begin
  if optionForm.script > 0 then
  begin
    if form1.scriptengine.GetProcMethod('calculatelevel').Code <> nil then
      result := strtoint(form1.scriptengine.ExecuteFunction([],'calculatelevel'))
    else result := -1;
  end
  else result := -1;
end;


procedure updatedata_script;

begin
  case optionform.mode of    //Minimale Feldgröße für Modus einhalten
    desay : begin //minium für felder ist 5
              if form1.player1.preview.sizeX < 3 then  form1.player1.preview.setSize(3,form1.player1.preview.SizeY);
              if form1.player1.preview.sizeY < 3 then  form1.player1.preview.setSize(form1.player1.preview.SizeX,3);
              if form1.player1.field.sizeX < 5 then form1.player1.field.setSize(8,form1.player1.field.sizeY);
              if form1.player1.field.sizeY < 5 then form1.player1.field.setSize(form1.player1.field.sizeX,8);
            end;
    dmedium : begin    //feld größe prüfen & Nachkorigieren wenn korrigiert dann Melden
                if form1.player1.preview.sizeX < 4 then  form1.player1.preview.setSize(4,form1.player1.preview.SizeY);
                if form1.player1.preview.sizeY < 4 then  form1.player1.preview.setSize(form1.player1.preview.SizeX,4);
                if form1.player1.field.sizeX < 8 then form1.player1.field.setSize(8,form1.player1.field.sizeY);
                if form1.player1.field.sizeY < 8 then form1.player1.field.setSize(form1.player1.field.sizeX,8);
              end;
    dhard : begin
              if form1.player1.preview.sizeX < 5 then  form1.player1.preview.setSize(5,form1.player1.preview.SizeY);
              if form1.player1.preview.sizeY < 5 then  form1.player1.preview.setSize(form1.player1.preview.SizeX,5);
              if form1.player1.field.sizeX < 12 then form1.player1.field.setSize(12,form1.player1.field.sizeY);
              if form1.player1.field.sizeY < 12 then form1.player1.field.setSize(form1.player1.field.sizeX,12);
            end;
    end;

  form1.new_buttonClick(form1);
end;

procedure setSize_script(x,y : integer);

begin
  form1.player1.field.setSize(x,y);
end;

procedure setpreViewSize_script(x,y : integer);

begin
  form1.player1.preview.setSize(x,y);
end;

procedure setcamera_script( position : integer);

begin
  form1.kamera_edit.value := position;
  form1.kamera_editChange(form1);
end;

procedure locksize_script;

begin
  optionForm.feldx_edit.enabled := false;
  optionForm.feldy_edit.enabled := false;
end;

procedure lockmode_script;

begin
  optionForm.modus_select.Enabled := false;
  optionForm.modus_select.TabStop := false;//signal an die "neu" prozedur das nicht wieder eingeschaltet wird
end;

procedure dialog_script(text : string);

begin
  showmessage(text);
end;

procedure newgame_script;

begin
  if optionForm.script > 0 then
  begin
    if form1.scriptengine.GetProcMethod('newgame').Code <> nil then
      form1.scriptengine.ExecuteFunction([],'newgame')
  end
end;

end.
