hedgewars/uFLScripts.pas
branchqmlfrontend
changeset 10458 f7a199346c3e
child 10517 844bd43db47a
equal deleted inserted replaced
10456:6fd99bb73524 10458:f7a199346c3e
       
     1 unit uFLScripts;
       
     2 interface
       
     3 uses uFLTypes;
       
     4 
       
     5 function getScriptsList: PPChar; cdecl;
       
     6 procedure freeScriptsList;
       
     7 
       
     8 implementation
       
     9 uses uFLUtils, uFLIPC, uPhysFSLayer, uFLData;
       
    10 
       
    11 const MAX_SCRIPT_NAMES = 64;
       
    12 type
       
    13     TScript = record
       
    14             scriptName: shortstring;
       
    15             description: shortstring;
       
    16             gameScheme, weapons: shortstring;
       
    17         end;
       
    18     PScript = ^TScript;
       
    19 var
       
    20     scriptsList: PScript;
       
    21     scriptsNumber: Longword;
       
    22     listOfScriptNames: array[0..MAX_SCRIPT_NAMES] of PChar;
       
    23 
       
    24 procedure loadScript(var script: TScript; fileName: shortstring);
       
    25 var f: PFSFile;
       
    26     section: LongInt;
       
    27     l: shortstring;
       
    28 begin
       
    29     section:= -1;
       
    30     f:= pfsOpenRead(fileName);
       
    31 
       
    32     while (not pfsEOF(f)) do
       
    33     begin
       
    34         pfsReadLn(f, l);
       
    35     end;
       
    36 
       
    37     pfsClose(f)
       
    38 end;
       
    39 
       
    40 procedure loadScripts;
       
    41 var filesList, tmp: PPChar;
       
    42     script: PScript;
       
    43     s: shortstring;
       
    44     l: Longword;
       
    45 begin
       
    46     filesList:= pfsEnumerateFiles('/Scripts/Multiplayer');
       
    47     scriptsNumber:= 0;
       
    48 
       
    49     tmp:= filesList;
       
    50     while tmp^ <> nil do
       
    51     begin
       
    52         s:= shortstring(tmp^);
       
    53         writeln(stderr, '> ', s);
       
    54         l:= length(s);
       
    55         if (l > 4) and (copy(s, l - 3, 4) = '.lua') then inc(scriptsNumber);
       
    56         inc(tmp)
       
    57     end;
       
    58 
       
    59     scriptsList:= GetMem(sizeof(scriptsList^) * scriptsNumber);
       
    60 
       
    61     script:= scriptsList;
       
    62     tmp:= filesList;
       
    63     while tmp^ <> nil do
       
    64     begin
       
    65         s:= shortstring(tmp^);
       
    66         l:= length(s);
       
    67         if (l > 4) and (copy(s, l - 3, 4) = '.lua') then 
       
    68             begin
       
    69                 loadScript(script^, '/Config/Scripts/' + s);
       
    70                 inc(script)
       
    71             end;
       
    72         inc(tmp)
       
    73     end;
       
    74 
       
    75     pfsFreeList(filesList)
       
    76 end;
       
    77 
       
    78 
       
    79 function getScriptsList: PPChar; cdecl;
       
    80 var i, t, l: Longword;
       
    81     script: PScript;
       
    82 begin
       
    83     if scriptsList = nil then
       
    84         loadScripts;
       
    85 
       
    86     t:= scriptsNumber;
       
    87     if t >= MAX_SCRIPT_NAMES then 
       
    88         t:= MAX_SCRIPT_NAMES;
       
    89 
       
    90     script:= scriptsList;
       
    91     for i:= 0 to Pred(t) do
       
    92     begin
       
    93         l:= length(script^.scriptName);
       
    94         if l >= 255 then l:= 254;
       
    95         script^.scriptName[l + 1]:= #0;
       
    96         listOfScriptNames[i]:= @script^.scriptName[1];
       
    97         inc(script)
       
    98     end;
       
    99 
       
   100     listOfScriptNames[t]:= nil;
       
   101 
       
   102     getScriptsList:= listOfScriptNames
       
   103 end;
       
   104 
       
   105 
       
   106 procedure freeScriptsList;
       
   107 begin
       
   108     if scriptsList <> nil then
       
   109         FreeMem(scriptsList, sizeof(scriptsList^) * scriptsNumber)
       
   110 end;
       
   111 
       
   112 end.