|
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. |