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, uFLThemes; |
|
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; scriptName, fileName: shortstring); |
|
25 var f: PFSFile; |
|
26 begin |
|
27 underScore2Space(scriptName); |
|
28 script.scriptName:= scriptName; |
|
29 script.description:= scriptName + ' script description'; |
|
30 |
|
31 f:= pfsOpenRead(copy(fileName, 1, length(fileName) - 4) + '.txt'); |
|
32 |
|
33 script.gameScheme:= ''; |
|
34 script.weapons:= ''; |
|
35 |
|
36 if f <> nil then |
|
37 begin |
|
38 if not pfsEOF(f) then |
|
39 begin |
|
40 pfsReadLn(f, script.gameScheme); |
|
41 |
|
42 if not pfsEOF(f) then |
|
43 pfsReadLn(f, script.weapons); |
|
44 end; |
|
45 |
|
46 pfsClose(f) |
|
47 end |
|
48 end; |
|
49 |
|
50 procedure loadScripts; |
|
51 var filesList, tmp: PPChar; |
|
52 script: PScript; |
|
53 s: shortstring; |
|
54 l: Longword; |
|
55 begin |
|
56 filesList:= pfsEnumerateFiles('/Scripts/Multiplayer'); |
|
57 scriptsNumber:= 1; |
|
58 |
|
59 tmp:= filesList; |
|
60 while tmp^ <> nil do |
|
61 begin |
|
62 s:= shortstring(tmp^); |
|
63 l:= length(s); |
|
64 if (l > 4) and (copy(s, l - 3, 4) = '.lua') then inc(scriptsNumber); |
|
65 inc(tmp) |
|
66 end; |
|
67 |
|
68 scriptsList:= GetMem(sizeof(scriptsList^) * (scriptsNumber + 1)); |
|
69 |
|
70 script:= scriptsList; |
|
71 |
|
72 // add 'normal' script |
|
73 script^.scriptName:= 'Normal'; |
|
74 script^.description:= 'Normal gameplay'; |
|
75 inc(script); |
|
76 |
|
77 // fill the rest from *.lua list |
|
78 tmp:= filesList; |
|
79 while tmp^ <> nil do |
|
80 begin |
|
81 s:= shortstring(tmp^); |
|
82 l:= length(s); |
|
83 if (l > 4) and (copy(s, l - 3, 4) = '.lua') then |
|
84 begin |
|
85 loadScript(script^, copy(s, 1, l - 4), '/Config/Scripts/' + s); |
|
86 inc(script) |
|
87 end; |
|
88 inc(tmp) |
|
89 end; |
|
90 |
|
91 pfsFreeList(filesList) |
|
92 end; |
|
93 |
|
94 |
|
95 function getScriptsList: PPChar; cdecl; |
|
96 var i, t, l: Longword; |
|
97 script: PScript; |
|
98 begin |
|
99 if scriptsList = nil then |
|
100 loadScripts; |
|
101 |
|
102 t:= scriptsNumber; |
|
103 if t >= MAX_SCRIPT_NAMES then |
|
104 t:= MAX_SCRIPT_NAMES; |
|
105 |
|
106 script:= scriptsList; |
|
107 for i:= 0 to Pred(t) do |
|
108 begin |
|
109 l:= length(script^.scriptName); |
|
110 if l >= 255 then l:= 254; |
|
111 script^.scriptName[l + 1]:= #0; |
|
112 listOfScriptNames[i]:= @script^.scriptName[1]; |
|
113 inc(script) |
|
114 end; |
|
115 |
|
116 listOfScriptNames[t]:= nil; |
|
117 |
|
118 getScriptsList:= listOfScriptNames |
|
119 end; |
|
120 |
|
121 |
|
122 procedure freeScriptsList; |
|
123 begin |
|
124 if scriptsList <> nil then |
|
125 FreeMem(scriptsList, sizeof(scriptsList^) * scriptsNumber) |
|
126 end; |
|
127 |
|
128 end. |
|