QWLOG.PAS 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. USES DOS;
  2. Type TRec = record
  3. Name : string[20];
  4. Frag : integer;
  5. Suicide : Word;
  6. Deaths : word;
  7. Other : array [1..20] of Word;
  8. End;
  9. Type TFile = array [1..20] of TRec;
  10. Var
  11. inp : file of TFile;
  12. cur : TFile;
  13. find : SearchRec;
  14. logfile : text;
  15. str : string;
  16. Function ScanName(Name : string) : boolean;
  17. Var i : byte;
  18. Begin
  19. ScanName := false;
  20. for i := 1 to 20 do if cur[i].Name = Name then ScanName := true;
  21. End;
  22. {-----------------------------------------}
  23. Procedure AddName(Name : string);
  24. Var i : byte;
  25. Begin
  26. i := 1;
  27. while cur[i].Name <> '' do inc(i);
  28. if i<>20 then cur[i].Name := Name;
  29. End;
  30. {-----------------------------------------}
  31. Procedure AddFrag(Name : string;Num : ShortInt);
  32. Var i : byte;
  33. Begin
  34. for i := 1 to 20 do if cur[i].Name = Name then inc(cur[i].Frag,Num);
  35. End;
  36. Procedure AddSuicide(Name:string);
  37. Var i :byte;
  38. Begin
  39. for i := 1 to 20 do if cur[i].Name = Name then inc(cur[i].Suicide);
  40. End;
  41. Procedure AddDeath(Name:string);
  42. Var i :byte;
  43. Begin
  44. for i := 1 to 20 do if cur[i].Name = Name then inc(cur[i].Deaths);
  45. End;
  46. Function GetNum(Name:string):integer;
  47. Var i : byte;
  48. Begin
  49. GetNum := -1;
  50. for i := 1 to 20 do if cur[i].Name = Name then GetNum := i;
  51. End;
  52. Procedure ReadCurData;
  53. Var i : byte;
  54. Begin
  55. assign(inp,'qwfrag.dat');
  56. {$I-}
  57. Reset(inp);
  58. if IOResult <> 0 then
  59. begin
  60. Rewrite(inp);
  61. for i := 1 to 20 do with cur[i] do begin
  62. Name := '';
  63. Frag := 0;
  64. Suicide := 0;
  65. Deaths := 0;
  66. fillChar(other,sizeof(other),0);
  67. end;
  68. end
  69. else Read(inp,cur);
  70. {$I+}
  71. End;
  72. {----------------------------------}
  73. Procedure AddOther(Name1,Name2:string);
  74. Var i : integer;
  75. Begin
  76. i := 1;
  77. while cur[i].Name <> Name1 do inc(i);
  78. if i <> 20 then inc(cur[i].Other[GetNum(Name2)]);
  79. End;
  80. {------------------------------------}
  81. Procedure Analyze(str : string);
  82. Var Name1,Name2:string[20];i:integer;
  83. Begin
  84. name1 := '';
  85. name2 := '';
  86. i := 2;
  87. if (pos('\',str) <> 0) and (length(str) > 3) then
  88. begin
  89. while str[i] <> '\' do begin Name1 := Name1 + str[i]; inc(i); end;
  90. inc(i);
  91. while str[i] <> '\' do begin Name2 := Name2 + str[i]; inc(i); end;
  92. if Name1 = Name2 then
  93. begin
  94. If not ScanName(Name1) then AddName(Name1);
  95. AddSuicide(Name1);
  96. AddFrag(Name1,-1);
  97. AddOther(Name1,Name2);
  98. end
  99. else
  100. begin
  101. If not ScanName(Name1) then AddName(Name1);
  102. If not ScanName(Name2) then AddName(Name2);
  103. AddFrag(Name1,1);
  104. AddDeath(Name2);
  105. AddOther(Name1,Name2);
  106. end;
  107. end;
  108. End;
  109. {------------------------------------}
  110. Procedure WriteInfo(Name:string;var fout:text);
  111. Var g,h: integer;spaces:string;
  112. Begin
  113. g := GetNum(Name);
  114. WriteLn(fout,' --- ',cur[g].Name,' --- ');
  115. WriteLN(fout);
  116. WriteLn(fout,'Фрагов: ',cur[g].Frag);
  117. WriteLn(fout,'Самоубийств: ',cur[g].Suicide);
  118. WriteLn(fout,'Смертей: ',cur[g].Deaths);
  119. WriteLn(fout,'Убийства : ');
  120. h := 1;
  121. while cur[h].Name <> '' do
  122. begin
  123. FillChar(Spaces, SizeOf(Spaces), ' ');
  124. Spaces[0] := Chr(15-length(cur[h].Name));
  125. WriteLn(fout,' ',cur[h].Name,spaces,' : ',cur[g].Other[h]);
  126. inc(h);
  127. end;
  128. WriteLn(fout);
  129. End;
  130. {------------------------------------}
  131. Procedure SaveRes;
  132. Var
  133. o : text;
  134. l : integer;
  135. max : integer;
  136. Begin
  137. Assign(o,'qw.scr');
  138. Rewrite(o);
  139. l := 1;
  140. while cur[l].Name <> '' do begin
  141. WriteInfo(cur[l].Name,o);
  142. inc(l);
  143. end;
  144. WriteLn(o,'------------==================-------------');
  145. max := 0;
  146. l := 1;
  147. While cur[l].Name <> '' do
  148. begin
  149. inc(max,cur[l].Frag);
  150. inc(l);
  151. end;
  152. WriteLn(o,'Всего фрагов: ',Max);
  153. l := 1;
  154. max := 0;
  155. While cur[l].Name <> '' do
  156. begin
  157. inc(max,cur[l].Suicide);
  158. inc(l);
  159. end;
  160. WriteLn(o,'Всего самоубийств: ',max);
  161. l := 1;
  162. max := 0;
  163. While cur[l].Name <> '' do
  164. begin
  165. inc(max,cur[l].Deaths);
  166. inc(l);
  167. end;
  168. WriteLn(o,'Всего смертей: ',max);
  169. Close(o);
  170. End;
  171. {SaveRes}
  172. {MainPart}
  173. Begin
  174. if ParamCount = 0 then begin
  175. ReadCurData;
  176. FindFirst('*.log',AnyFile,find);
  177. While DOSError = 0 do
  178. begin
  179. WriteLn('Анализирую файл ',find.name,' ...');
  180. Assign(LogFile,find.name);
  181. Reset(LOgFile);
  182. While not EOF(LogFile) do
  183. begin
  184. ReadLn(LogFile,str);
  185. Analyze(str);
  186. end;
  187. Close(LogFile);
  188. Erase(LogFile);
  189. FindNext(find);
  190. end;
  191. SaveRes;
  192. Close(inp);
  193. Rewrite(inp);
  194. Write(inp,cur);
  195. Close(inp);
  196. End
  197. else if ParamStr(1) <> '/?' then WriteLn('Запустите с параметром /? для помощи')
  198. else
  199. begin
  200. WriteLn('О чем : ');
  201. WriteLn(' Данная программа поможет пользователям системы Quake World');
  202. WriteLn(' обобщить и наглядно просмотреть результаты баталий.');
  203. WriteLn('Использование : ');
  204. WriteLn(' Запустите программу в каталоге с логами, сделанными при');
  205. WriteLn(' помощи команды "fraglogfile" на сервере. Программа сгенерирует');
  206. WriteLn(' файл "qwfrag.dat" в котором содержится вся информация.');
  207. WriteLn(' После работы программы логи будут удалены в целях предотвращения');
  208. WriteLn(' дупов, и сгенерирован файл "qw.scr" в который в текстовом виде');
  209. WriteLn(' будет продемонстрирован результат.');
  210. WriteLn('Ограничения : ');
  211. WriteLn(' К сожалению на текущий момент количество игороков лимитировано');
  212. WriteLn(' 20-ю вхождениями.');
  213. end;
  214. WriteLn;
  215. WriteLn('Quake World Frag Log Analyzer ver 1.0');
  216. WriteLn(' Copyright 1999, Rod Inc. 2:5030/538.33');
  217. End.