Zander_driver 10 345 Опубликовано 19 Апреля 2016 Дабы меня не закидали овощами в соседней теме, поделюсь-ка я в очередной раз своим сырым кодом. Просто что меня на эту мысль навело... функционал как бы востребованный до жути давным давно и настолько, что я нисколько не сомневаюсь в том что с десяток мододелов уже себе такое писали. Но никто на публику не выложил - начинающим взяться не за что, только самим писать. Я про съемку координат речь веду, если что. В моей подписи как раз есть ссылка на тему где можно посмотреть видео про "Пушку мододела" - инструмент для снятия координат в игре. Координат для чего? Ну в данном варианте для путей работ в гулагах, а вообще-то для чего угодно. Как оно работает: на стороне игры через всякие там интерфейсы задаем настройки, что мы хотим поставить, потом отлавливается выстрел, и в момент выстрела берутся координаты актора и с этими всеми настройками записываются эдаким пакетом информации в лог. И собственно все, на стороне игры работа инструмента закончилась. Потом на стороне Windows, рядом с логами игры лежит одна программа которую я сам для себя написал. Она открывает файл логов, находит там все эти пакеты данных с координатами, оставленные скриптом, обрабатывает и создает "текст" который можно уже вставлять в файлы распакованного аллспавна и компилировать в игру с помощью acdc. т.е. на стороне windows все что я делаю - открываю свою программу, тыкаю в ней кнопку, открываю созданный ею файл, нажимаю Ctrl+C, открываю файл распакованного спавна - Ctrl+V. запускаю батник компиляции спавна. все. Т.е. все просто на самом деле. Но в открытом доступе я таких инструментов не видел, почему-то. Наверное у всех под свои нужды заточены. У меня тоже. Скриптовую часть на стороне игры - ее в любом случае каждый под себя напишет, тут у всех предпочтения разные, и не так давно доказывали что больше одного стейта у гулагов быть не должно... в общем, мелочи это, несущественные. Поэтому игровую-скриптовую часть выладывать не буду. Выложу код программы которая на стороне виндовса выковыривает данные из логов и собирает из них то что можно копипастить прямо в аллспавн. Писал я ее в Делфи. Визуально программа простейшая, там одно текстовое поле, куда однажды надо ввести имя лог-файла (разные же бывают), и кнопка "конвертировать". собственно все. Кому надо и интересно - можно взять и заточить под свои нужды. код Pascal (Показать) { ***************************************************** PathGenerator - программа для извлечения и обработки данных в лог-файле игры С.Т.А.Л.К.Е.Р. ТЧ. сканирует лог-файл, находит пакеты данных, оставленные специальным скриптом. читает эти данные и формирует на их основе, массивы данных готовые для вставки в файлы аллспавна и последущей компиляции. Автор: Zander (skype zander700) г.Курск Copyright: Zander Последнее обновление: 3 марта 2016 г. ***************************************************** } unit PathGenerator; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TPointXR = record lv: integer; lvn: integer; gv: integer; px: string; py: string; pz: string; dx: string; dy: string; dz: string; mode: integer; gulag_name: string; param_line: string; Res1: string; Res2: string; end; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Paths: TStringList; Alife: TStringList; Scrpt: TStringList; NextCommand: integer; ArXr: array of TPointXR; gulag: integer; logfilename: string; implementation {$R *.dfm} function StF(S: string): extended; var S1: string; S2: string; L1: integer; L2: integer; P: integer; R: extended; a: integer; sl: TStringList; begin a:= 0; P:= -1; while (a < Length(S)) do begin If (S[a] = '.') then begin P:= a; a:= Length(S); end; a:= a + 1; end; S1:= Copy(S,1,P - 1); S2:= Copy(S, P + 1, Length(S) - P); L2:= Length(S2); a:= 0; L1:= 1; while (a < L2) do begin L1:= L1 * 10; a:= a + 1; end; S2:= Copy(S2, 1, 4); R:= Strtoint(S1) + (Strtoint(S2) / L1); sl:= TStringList.Create; sl.Append(S); sl.Append(S1); sl.Append(S2); sl.SaveToFile('proglog.txt'); Result:= R; end; procedure TForm1.Button1Click(Sender: TObject); // конвертация var kamp_n: integer; walk_n: integer; guard_n: integer; patrol_n: integer; sniper_n: integer; sleep_n: integer; lead_n: integer; stalker_n: integer; monster_n: integer; anomaly_n: integer; rest_n: integer; smart_n: integer; item_n: integer; a: integer; b: integer; c: integer; points_label: string; alife_number: integer; Dist: extended; begin //SetDecimalSeparator('.'); a:= 0; b:= 0; kamp_n:= 1; walk_n:= 1; guard_n:= 1; patrol_n:= 1; sniper_n:= 1; sleep_n:= 1; lead_n:= 1; stalker_n:= 1; monster_n:= 1; anomaly_n:= 1; rest_n:= 1; smart_n:= 1; item_n:= 1; alife_number:= 50000; while (a < Length(ArXr)) do begin Case (ArXr[a].mode) of 0: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append(ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_look]'); walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 1: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_kamp_' + inttostr(kamp_n) + ']'); kamp_n := kamp_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); end; 2: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_guard_' + inttostr(guard_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_guard_' + inttostr(guard_n) + '_look]'); guard_n := guard_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 3: begin // установить число точек в патрульном пути b:= 1; while not (ArXr[a + b].mode = 4) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_patrol_' + inttostr(patrol_n) + '_walk]'); patrol_n:= patrol_n + 1; points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin if (c = 0) then begin Paths.Append('p0:name = name00' + ArXr[a].param_line); end else begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); end; Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].px + ',' + ArXr[a + c].py + ',' + ArXr[a + c].pz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lv)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; a:= a + b; end; 4: begin // empty end; 5: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sniper_' + inttostr(sniper_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sniper_' + inttostr(sniper_n) + '_look]'); sniper_n:= sniper_n + 1; Paths.Append('points = p0,p1,p2,p3'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a + 1].px + ',' + ArXr[a + 1].py + ',' + ArXr[a + 1].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a + 1].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a + 1].lv)); Paths.Append('p0:links = p1(1)'); Paths.Append(''); Paths.Append('p1:name = name00'); Paths.Append('p1:flags = 0x400'); Paths.Append('p1:position = ' + ArXr[a + 2].px + ',' + ArXr[a + 2].py + ',' + ArXr[a + 2].pz ); Paths.Append('p1:game_vertex_id = ' + inttostr(ArXr[a + 2].gv)); Paths.Append('p1:level_vertex_id = ' + inttostr(ArXr[a + 2].lv)); Paths.Append('p1:links = p2(1)'); Paths.Append(''); Paths.Append('p2:name = name00'); Paths.Append('p2:flags = 0x400'); Paths.Append('p2:position = ' + ArXr[a + 3].px + ',' + ArXr[a + 3].py + ',' + ArXr[a + 3].pz ); Paths.Append('p2:game_vertex_id = ' + inttostr(ArXr[a + 3].gv)); Paths.Append('p2:level_vertex_id = ' + inttostr(ArXr[a + 3].lv)); Paths.Append('p2:links = p3(1)'); Paths.Append(''); Paths.Append('p3:name = name00'); Paths.Append('p3:flags = 0x400'); Paths.Append('p3:position = ' + ArXr[a + 4].px + ',' + ArXr[a + 4].py + ',' + ArXr[a + 4].pz ); Paths.Append('p3:game_vertex_id = ' + inttostr(ArXr[a + 4].gv)); Paths.Append('p3:level_vertex_id = ' + inttostr(ArXr[a + 4].lv)); Paths.Append('p3:links = p0(1)'); a:= a + 4; end; 6: begin // установить число точек в патрульном пути b:= 1; while not (ArXr[a + b].mode = 7) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_walk]'); points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin if (c = 0) then begin Paths.Append('p0:name = name00' + ArXr[a].param_line); end else begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); end; Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].px + ',' + ArXr[a + c].py + ',' + ArXr[a + c].pz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lv)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; b:= 1; while not (ArXr[a + b].mode = 7) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_look]'); points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].dx + ',' + ArXr[a + c].dy + ',' + ArXr[a + c].dz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lvn)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; walk_n:= walk_n + 1; a:= a + b; end; 7: begin // empty end; 8: begin // rudiment gulag:= gulag + 1; kamp_n:= 1; walk_n:= 1; guard_n:= 1; patrol_n:= 1; sniper_n:= 1; sleep_n:= 1; lead_n:= 1; // sleep end; 9: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sleep_' + inttostr(sleep_n) + ']'); sleep_n := sleep_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); end; 10: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_lead_' + inttostr(lead_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_lead_' + inttostr(lead_n) + '_look]'); lead_n := lead_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 20: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = stalker'); Alife.Append('name = uniqstalkername');// + inttostr(stalker_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_trader_abstract properties'); Alife.Append('money = 5000'); Alife.Append('character_profile = uniqstalkerprofile');// + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append('custom_data = <<END'); Alife.Append(''); // Alife.Append('[logic]'); //Alife.Append('cfg = uniqstalkerlogic' + inttostr(stalker_n) + '.ltx'); // Alife.Append(''); Alife.Append('; cse'); Alife.Append('[smart_terrains]'); Alife.Append('none = true'); Alife.Append('END'); Alife.Append(';story_id = ' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = actors\neytral\stalker_neytral_balon_1'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 1'); Alife.Append('g_group = 2'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0.0280130300670862,0,0.999607563018799'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 1'); Alife.Append('upd:g_group = 2'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_alife_human_abstract properties'); Alife.Append('predicate5 = 1,2,2,1,2'); Alife.Append('predicate4 = 0,1,1,1'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('upd:start_dialog = '); Alife.Append(''); Alife.Append('; se_stalker properties'); stalker_n:= stalker_n + 1; alife_number:= alife_number + 1; end; 21: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = stalker'); Alife.Append('name = uniqstalkername' + inttostr(stalker_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_trader_abstract properties'); Alife.Append('money = 5000'); Alife.Append('character_profile = uniqstalkerprofile' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append('custom_data = <<END'); Alife.Append(''); Alife.Append('[logic]'); Alife.Append('cfg = uniqstalkerlogic' + inttostr(stalker_n) + '.ltx'); Alife.Append(''); Alife.Append('; cse'); Alife.Append('[smart_terrains]'); Alife.Append('none = true'); Alife.Append('END'); Alife.Append(';story_id = ' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = actors\neytral\stalker_neytral_balon_1'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 1'); Alife.Append('g_group = 2'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0.0280130300670862,0,0.999607563018799'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 1'); Alife.Append('upd:g_group = 2'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_alife_human_abstract properties'); Alife.Append('predicate5 = 1,2,2,1,2'); Alife.Append('predicate4 = 0,1,1,1'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('upd:start_dialog = '); Alife.Append(''); Alife.Append('; se_stalker properties'); Paths.Append(''); Paths.Append('[uniqstalker' + inttostr(stalker_n) + '_walker_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[uniqstalker' + inttostr(stalker_n) + '_walker_look]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); stalker_n:= stalker_n + 1; alife_number:= alife_number + 1; end; 22: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = monster_section'); Alife.Append('name = uniqmonstername' + inttostr(monster_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 36.3999977111816'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = monsters\mutant_boar\mutant_boar_strong'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 0'); Alife.Append('g_group = 0'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0,0,0'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 0'); Alife.Append('upd:g_group = 0'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('; cse_alife_monster_base properties'); Alife.Append(''); Alife.Append('; se_monster properties'); monster_n:= monster_n + 1; alife_number:= alife_number + 1; end; 23: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = zone_mosquito_bald_weak'); Alife.Append('name = uniqanomalyname' + inttostr(anomaly_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = -0.367405563592911,0.0629953369498253,0.17383885383606'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 36.3999977111816'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff3e'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Dist:= sqrt((sqr(StF(ArXr[a].px) + StF(ArXr[a + 1].px))) + (sqr(StF(ArXr[a].py) + StF(ArXr[a + 1].py))) + (sqr(StF(ArXr[a].pz) + StF(ArXr[a + 1].pz)))); Alife.Append('shape0:radius = ' + Floattostr(Dist)); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties'); Alife.Append('restrictor_type = 0'); Alife.Append(''); Alife.Append('; cse_alife_custom_zone properties'); Alife.Append('max_power = 0'); Alife.Append(''); Alife.Append('; cse_alife_anomalous_zone properties'); Alife.Append('offline_interactive_radius = 30'); Alife.Append('artefact_spawn_count = 32'); Alife.Append(''); Alife.Append('; se_zone_anom properties'); anomaly_n:= anomaly_n + 1; a:= a + 1; // вторая точка для определения радиуса шейпа alife_number:= alife_number + 1; end; 24: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = space_restrictor'); Alife.Append('name = uniq_restrictor' + inttostr(rest_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff3e'); Alife.Append('custom_data = <<END'); Alife.Append('[logic]'); Alife.Append('active = sr_idle'); Alife.Append(''); Alife.Append('[sr_idle]'); Alife.Append('on_actor_inside = %+esc_close_door%'); Alife.Append('END'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Dist:= sqrt((sqr(StrtoFloat(ArXr[a].px) + StrtoFloat(ArXr[a + 1].px))) + (sqr(StrtoFloat(ArXr[a].py) + StrtoFloat(ArXr[a + 1].py))) + (sqr(StrtoFloat(ArXr[a].pz) + StrtoFloat(ArXr[a + 1].pz)))); Alife.Append('shape0:radius = ' + Floattostr(Dist)); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties '); Alife.Append('restrictor_type = 3'); rest_n:= rest_n + 1; a:= a + 1; alife_number:= alife_number + 1; end; 25: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = smart_terrain'); Alife.Append('name = ' + ArXr[a].gulag_name); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0.062321275472641,0.00316426996141672,0.0140644172206521'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 4'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbe'); Alife.Append('custom_data = <<END'); Alife.Append('[smart_terrain]'); Alife.Append('type = general_lager'); Alife.Append('capacity = ' + inttostr(ArXr[a].lvn)); Alife.Append('communities = ' + ArXr[a].param_line); Alife.Append('stay = medium'); Alife.Append('END'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Alife.Append('shape0:radius = 1'); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties'); Alife.Append('restrictor_type = 3'); Alife.Append(''); Alife.Append('; se_smart_terrain properties'); smart_n:= smart_n + 1; alife_number:= alife_number + 1; end; 26: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = wpn_ak74u'); Alife.Append('name = item' + inttostr(item_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,-1.63260018825531,-1.58220040798187'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff07'); Alife.Append('custom_data = cond = 0.2'); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = weapons\ak-74u\ak74u'); Alife.Append(''); Alife.Append('; cse_alife_item properties'); Alife.Append('condition = 1'); Alife.Append(''); Alife.Append('upd:num_items = 0'); Alife.Append(''); Alife.Append('; cse_alife_item_weapon properties'); Alife.Append('ammo_current = 90'); Alife.Append(''); Alife.Append('upd:condition = 1'); Alife.Append('upd:weapon_flags = 0'); Alife.Append('upd:ammo_elapsed = 0'); Alife.Append('upd:addon_flags = 0'); Alife.Append('upd:ammo_type = 0'); Alife.Append('upd:weapon_state = 0'); Alife.Append('upd:weapon_zoom = 0'); Alife.Append(''); Alife.Append('upd:current_fire_mode = 0'); item_n:= item_n + 1; alife_number:= alife_number + 1; end; 27: begin Scrpt.Append(ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz + ',' + Inttostr(ArXr[a].lv) + ',' + Inttostr(ArXr[a].gv)); end; 28: begin Scrpt.Append('treasure' + inttostr(alife_number) + ' = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz + ',' + inttostr(ArXr[a].lv) + ',' + inttostr(ArXr[a].gv)); alife_number:= alife_number + 1; end; end; a:= a + 1; end; // Form1.Memo1.Text:= Paths.Text; Paths.SavetoFile('Way_Generated.ltx'); Alife.SavetoFile('Alife_Generated.ltx'); Scrpt.SavetoFile('Script_Generated.ltx'); end; procedure TForm1.Edit1Change(Sender: TObject); begin logfilename:= Form1.Edit1.Text; end; procedure TForm1.Button2Click(Sender: TObject); // прочитать лог-файл var DLog: TStringList; a: integer; s: string; Command: string; P: TPointXR; begin NextCommand:= 0; gulag:= 1; Paths:= TStringList.Create; Alife:= TStringList.Create; Scrpt:= TStringList.Create; DLog:= TStringList.Create; DLog.LoadFromFile(logfilename); a:= 0; while (a < DLog.Count) do begin s:= DLog.Strings[a]; Command:= s; //copy(s,12,Length(s) - 11); If (Command = 'Command_create_point_way') then begin s:= DLog.Strings[a + 1]; Command:= s; //copy(s,12,Length(s) - 11); If (NextCommand = strtoint(Command)) then begin // BEGIN WORK //scan mode s:= DLog.Strings[a + 2]; Command:= s; //copy(s,12,Length(s) - 11); P.mode:= strtoint(Command); //game vertex s:= DLog.Strings[a + 3]; Command:= s; //copy(s,12,Length(s) - 11); P.gv:= strtoint(Command); //level vertex s:= DLog.Strings[a + 4]; Command:= s; //copy(s,12,Length(s) - 11); P.lv:= strtoint(Command); // level vertex look s:= DLog.Strings[a + 5]; Command:= s; //copy(s,12,Length(s) - 11); P.lvn:= strtoint(Command); //position s:= DLog.Strings[a + 6]; Command:= s; //copy(s,12,Length(s) - 11); P.px:= Command; s:= DLog.Strings[a + 7]; Command:= s; //copy(s,12,Length(s) - 11); P.py:= Command; s:= DLog.Strings[a + 8]; Command:= s; //copy(s,12,Length(s) - 11); P.pz:= Command; //direction s:= DLog.Strings[a + 9]; Command:= s; //copy(s,12,Length(s) - 11); P.dx:= Command; s:= DLog.Strings[a + 10]; Command:= s; //copy(s,12,Length(s) - 11); P.dy:= Command; s:= DLog.Strings[a + 11]; Command:= s; //copy(s,12,Length(s) - 11); P.dz:= Command; // gulag_name s:= DLog.Strings[a + 12]; Command:= s; //copy(s,12,Length(s) - 11); P.gulag_name:= Command; // param_line s:= DLog.Strings[a + 13]; Command:= s; //copy(s,12,Length(s) - 11); P.param_line:= Command; // reserved 1 param_line s:= DLog.Strings[a + 14]; Command:= s; //copy(s,12,Length(s) - 11); P.Res1:= Command; // reserved 2 param_line s:= DLog.Strings[a + 15]; Command:= s; //copy(s,12,Length(s) - 11); P.Res2:= Command; SetLength(ArXr,Length(ArXr) + 1); ArXr[NextCommand]:= P; NextCommand:= NextCommand + 1; end; end; a:= a + 1; end; Form1.Label1.Caption:= 'Точек найдено: ' + inttostr(Length(ArXr)); if (Length(ArXr) > 0) then begin Form1.Button1.Enabled:= true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin logfilename:= 'xray_user.log'; end; end.{ ***************************************************** PathGenerator - программа для извлечения и обработки данных в лог-файле игры С.Т.А.Л.К.Е.Р. ТЧ. сканирует лог-файл, находит пакеты данных, оставленные специальным скриптом. читает эти данные и формирует на их основе, массивы данных готовые для вставки в файлы аллспавна и последущей компиляции. Автор: Zander (skype zander700) г.Курск Copyright: Zander Последнее обновление: 3 марта 2016 г. ***************************************************** } unit PathGenerator; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TPointXR = record lv: integer; lvn: integer; gv: integer; px: string; py: string; pz: string; dx: string; dy: string; dz: string; mode: integer; gulag_name: string; param_line: string; Res1: string; Res2: string; end; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Paths: TStringList; Alife: TStringList; Scrpt: TStringList; NextCommand: integer; ArXr: array of TPointXR; gulag: integer; logfilename: string; implementation {$R *.dfm} function StF(S: string): extended; var S1: string; S2: string; L1: integer; L2: integer; P: integer; R: extended; a: integer; sl: TStringList; begin a:= 0; P:= -1; while (a < Length(S)) do begin If (S[a] = '.') then begin P:= a; a:= Length(S); end; a:= a + 1; end; S1:= Copy(S,1,P - 1); S2:= Copy(S, P + 1, Length(S) - P); L2:= Length(S2); a:= 0; L1:= 1; while (a < L2) do begin L1:= L1 * 10; a:= a + 1; end; S2:= Copy(S2, 1, 4); R:= Strtoint(S1) + (Strtoint(S2) / L1); sl:= TStringList.Create; sl.Append(S); sl.Append(S1); sl.Append(S2); sl.SaveToFile('proglog.txt'); Result:= R; end; procedure TForm1.Button1Click(Sender: TObject); // конвертация var kamp_n: integer; walk_n: integer; guard_n: integer; patrol_n: integer; sniper_n: integer; sleep_n: integer; lead_n: integer; stalker_n: integer; monster_n: integer; anomaly_n: integer; rest_n: integer; smart_n: integer; item_n: integer; a: integer; b: integer; c: integer; points_label: string; alife_number: integer; Dist: extended; begin //SetDecimalSeparator('.'); a:= 0; b:= 0; kamp_n:= 1; walk_n:= 1; guard_n:= 1; patrol_n:= 1; sniper_n:= 1; sleep_n:= 1; lead_n:= 1; stalker_n:= 1; monster_n:= 1; anomaly_n:= 1; rest_n:= 1; smart_n:= 1; item_n:= 1; alife_number:= 50000; while (a < Length(ArXr)) do begin Case (ArXr[a].mode) of 0: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append(ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_look]'); walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 1: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_kamp_' + inttostr(kamp_n) + ']'); kamp_n := kamp_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); end; 2: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_guard_' + inttostr(guard_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_guard_' + inttostr(guard_n) + '_look]'); guard_n := guard_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 3: begin // установить число точек в патрульном пути b:= 1; while not (ArXr[a + b].mode = 4) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_patrol_' + inttostr(patrol_n) + '_walk]'); patrol_n:= patrol_n + 1; points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin if (c = 0) then begin Paths.Append('p0:name = name00' + ArXr[a].param_line); end else begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); end; Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].px + ',' + ArXr[a + c].py + ',' + ArXr[a + c].pz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lv)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; a:= a + b; end; 4: begin // empty end; 5: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sniper_' + inttostr(sniper_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sniper_' + inttostr(sniper_n) + '_look]'); sniper_n:= sniper_n + 1; Paths.Append('points = p0,p1,p2,p3'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a + 1].px + ',' + ArXr[a + 1].py + ',' + ArXr[a + 1].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a + 1].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a + 1].lv)); Paths.Append('p0:links = p1(1)'); Paths.Append(''); Paths.Append('p1:name = name00'); Paths.Append('p1:flags = 0x400'); Paths.Append('p1:position = ' + ArXr[a + 2].px + ',' + ArXr[a + 2].py + ',' + ArXr[a + 2].pz ); Paths.Append('p1:game_vertex_id = ' + inttostr(ArXr[a + 2].gv)); Paths.Append('p1:level_vertex_id = ' + inttostr(ArXr[a + 2].lv)); Paths.Append('p1:links = p2(1)'); Paths.Append(''); Paths.Append('p2:name = name00'); Paths.Append('p2:flags = 0x400'); Paths.Append('p2:position = ' + ArXr[a + 3].px + ',' + ArXr[a + 3].py + ',' + ArXr[a + 3].pz ); Paths.Append('p2:game_vertex_id = ' + inttostr(ArXr[a + 3].gv)); Paths.Append('p2:level_vertex_id = ' + inttostr(ArXr[a + 3].lv)); Paths.Append('p2:links = p3(1)'); Paths.Append(''); Paths.Append('p3:name = name00'); Paths.Append('p3:flags = 0x400'); Paths.Append('p3:position = ' + ArXr[a + 4].px + ',' + ArXr[a + 4].py + ',' + ArXr[a + 4].pz ); Paths.Append('p3:game_vertex_id = ' + inttostr(ArXr[a + 4].gv)); Paths.Append('p3:level_vertex_id = ' + inttostr(ArXr[a + 4].lv)); Paths.Append('p3:links = p0(1)'); a:= a + 4; end; 6: begin // установить число точек в патрульном пути b:= 1; while not (ArXr[a + b].mode = 7) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_walk]'); points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin if (c = 0) then begin Paths.Append('p0:name = name00' + ArXr[a].param_line); end else begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); end; Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].px + ',' + ArXr[a + c].py + ',' + ArXr[a + c].pz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lv)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; b:= 1; while not (ArXr[a + b].mode = 7) do begin b:= b + 1; end; /// a + b - последняя точка Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_walker_' + inttostr(walk_n) + '_look]'); points_label:= 'p0'; c:= 0; while (c < do begin c:= c + 1; points_label:= points_label + ',p' + inttostr(c); end; Paths.Append('points = ' + points_label); c:= 0; while (c < (b + 1)) do begin Paths.Append('p' + inttostr(c) + ':name = name0' + inttostr(c)); Paths.Append('p' + inttostr(c) + ':flags = 0x400'); Paths.Append('p' + inttostr(c) + ':position = ' + ArXr[a + c].dx + ',' + ArXr[a + c].dy + ',' + ArXr[a + c].dz ); Paths.Append('p' + inttostr(c) + ':game_vertex_id = ' + inttostr(ArXr[a + c].gv)); Paths.Append('p' + inttostr(c) + ':level_vertex_id = ' + inttostr(ArXr[a + c].lvn)); If (c = then begin Paths.Append('p' + inttostr(c) + ':links = p0(1)'); // автозамыкание патрульного пути end else begin Paths.Append('p' + inttostr(c) + ':links = p' + inttostr(c + 1) + '(1)'); end; Paths.Append(''); c:= c + 1; end; walk_n:= walk_n + 1; a:= a + b; end; 7: begin // empty end; 8: begin // rudiment gulag:= gulag + 1; kamp_n:= 1; walk_n:= 1; guard_n:= 1; patrol_n:= 1; sniper_n:= 1; sleep_n:= 1; lead_n:= 1; // sleep end; 9: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_sleep_' + inttostr(sleep_n) + ']'); sleep_n := sleep_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); end; 10: begin Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_lead_' + inttostr(lead_n) + '_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00' + ArXr[a].param_line); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[' + ArXr[a].gulag_name + '_lead_' + inttostr(lead_n) + '_look]'); lead_n := lead_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); end; 20: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = stalker'); Alife.Append('name = uniqstalkername');// + inttostr(stalker_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_trader_abstract properties'); Alife.Append('money = 5000'); Alife.Append('character_profile = uniqstalkerprofile');// + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append('custom_data = <<END'); Alife.Append(''); // Alife.Append('[logic]'); //Alife.Append('cfg = uniqstalkerlogic' + inttostr(stalker_n) + '.ltx'); // Alife.Append(''); Alife.Append('; cse'); Alife.Append('[smart_terrains]'); Alife.Append('none = true'); Alife.Append('END'); Alife.Append(';story_id = ' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = actors\neytral\stalker_neytral_balon_1'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 1'); Alife.Append('g_group = 2'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0.0280130300670862,0,0.999607563018799'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 1'); Alife.Append('upd:g_group = 2'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_alife_human_abstract properties'); Alife.Append('predicate5 = 1,2,2,1,2'); Alife.Append('predicate4 = 0,1,1,1'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('upd:start_dialog = '); Alife.Append(''); Alife.Append('; se_stalker properties'); stalker_n:= stalker_n + 1; alife_number:= alife_number + 1; end; 21: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = stalker'); Alife.Append('name = uniqstalkername' + inttostr(stalker_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_trader_abstract properties'); Alife.Append('money = 5000'); Alife.Append('character_profile = uniqstalkerprofile' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append('custom_data = <<END'); Alife.Append(''); Alife.Append('[logic]'); Alife.Append('cfg = uniqstalkerlogic' + inttostr(stalker_n) + '.ltx'); Alife.Append(''); Alife.Append('; cse'); Alife.Append('[smart_terrains]'); Alife.Append('none = true'); Alife.Append('END'); Alife.Append(';story_id = ' + inttostr(stalker_n)); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = actors\neytral\stalker_neytral_balon_1'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 1'); Alife.Append('g_group = 2'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0.0280130300670862,0,0.999607563018799'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 1'); Alife.Append('upd:g_group = 2'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_alife_human_abstract properties'); Alife.Append('predicate5 = 1,2,2,1,2'); Alife.Append('predicate4 = 0,1,1,1'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('upd:start_dialog = '); Alife.Append(''); Alife.Append('; se_stalker properties'); Paths.Append(''); Paths.Append('[uniqstalker' + inttostr(stalker_n) + '_walker_walk]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lv)); Paths.Append(''); Paths.Append('[uniqstalker' + inttostr(stalker_n) + '_walker_look]'); // walk_n := walk_n + 1; Paths.Append('points = p0'); Paths.Append('p0:name = name00'); Paths.Append('p0:flags = 0x400'); Paths.Append('p0:position = ' + ArXr[a].dx + ',' + ArXr[a].dy + ',' + ArXr[a].dz ); Paths.Append('p0:game_vertex_id = ' + inttostr(ArXr[a].gv)); Paths.Append('p0:level_vertex_id = ' + inttostr(ArXr[a].lvn)); stalker_n:= stalker_n + 1; alife_number:= alife_number + 1; end; 22: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = monster_section'); Alife.Append('name = uniqmonstername' + inttostr(monster_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 36.3999977111816'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbf'); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = monsters\mutant_boar\mutant_boar_strong'); Alife.Append(''); Alife.Append('; cse_alife_creature_abstract properties'); Alife.Append('g_team = 0'); Alife.Append('g_squad = 0'); Alife.Append('g_group = 0'); Alife.Append('health = 1'); Alife.Append('dynamic_out_restrictions = '); Alife.Append('dynamic_in_restrictions = '); Alife.Append(''); Alife.Append('upd:health = 1'); Alife.Append('upd:timestamp = 0'); Alife.Append('upd:creature_flags = 0'); Alife.Append('upd:position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('upd:o_model = 0'); Alife.Append('upd:o_torso = 0,0,0'); Alife.Append('upd:g_team = 0'); Alife.Append('upd:g_squad = 0'); Alife.Append('upd:g_group = 0'); Alife.Append(''); Alife.Append('; cse_alife_monster_abstract properties'); Alife.Append(''); Alife.Append('upd:next_game_vertex_id = 65535'); Alife.Append('upd:prev_game_vertex_id = 65535'); Alife.Append('upd:distance_from_point = 0'); Alife.Append('upd:distance_to_point = 0'); Alife.Append(''); Alife.Append('; cse_ph_skeleton properties'); Alife.Append(''); Alife.Append('; cse_alife_monster_base properties'); Alife.Append(''); Alife.Append('; se_monster properties'); monster_n:= monster_n + 1; alife_number:= alife_number + 1; end; 23: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = zone_mosquito_bald_weak'); Alife.Append('name = uniqanomalyname' + inttostr(anomaly_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = -0.367405563592911,0.0629953369498253,0.17383885383606'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 36.3999977111816'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff3e'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Dist:= sqrt((sqr(StF(ArXr[a].px) + StF(ArXr[a + 1].px))) + (sqr(StF(ArXr[a].py) + StF(ArXr[a + 1].py))) + (sqr(StF(ArXr[a].pz) + StF(ArXr[a + 1].pz)))); Alife.Append('shape0:radius = ' + Floattostr(Dist)); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties'); Alife.Append('restrictor_type = 0'); Alife.Append(''); Alife.Append('; cse_alife_custom_zone properties'); Alife.Append('max_power = 0'); Alife.Append(''); Alife.Append('; cse_alife_anomalous_zone properties'); Alife.Append('offline_interactive_radius = 30'); Alife.Append('artefact_spawn_count = 32'); Alife.Append(''); Alife.Append('; se_zone_anom properties'); anomaly_n:= anomaly_n + 1; a:= a + 1; // вторая точка для определения радиуса шейпа alife_number:= alife_number + 1; end; 24: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = space_restrictor'); Alife.Append('name = uniq_restrictor' + inttostr(rest_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,0,0'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff3e'); Alife.Append('custom_data = <<END'); Alife.Append('[logic]'); Alife.Append('active = sr_idle'); Alife.Append(''); Alife.Append('[sr_idle]'); Alife.Append('on_actor_inside = %+esc_close_door%'); Alife.Append('END'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Dist:= sqrt((sqr(StrtoFloat(ArXr[a].px) + StrtoFloat(ArXr[a + 1].px))) + (sqr(StrtoFloat(ArXr[a].py) + StrtoFloat(ArXr[a + 1].py))) + (sqr(StrtoFloat(ArXr[a].pz) + StrtoFloat(ArXr[a + 1].pz)))); Alife.Append('shape0:radius = ' + Floattostr(Dist)); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties '); Alife.Append('restrictor_type = 3'); rest_n:= rest_n + 1; a:= a + 1; alife_number:= alife_number + 1; end; 25: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = smart_terrain'); Alife.Append('name = ' + ArXr[a].gulag_name); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0.062321275472641,0.00316426996141672,0.0140644172206521'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 4'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffffbe'); Alife.Append('custom_data = <<END'); Alife.Append('[smart_terrain]'); Alife.Append('type = general_lager'); Alife.Append('capacity = ' + inttostr(ArXr[a].lvn)); Alife.Append('communities = ' + ArXr[a].param_line); Alife.Append('stay = medium'); Alife.Append('END'); Alife.Append(''); Alife.Append('; cse_shape properties'); Alife.Append('shapes = shape0'); Alife.Append('shape0:type = sphere'); Alife.Append('shape0:offset = 0,0,0'); Alife.Append('shape0:radius = 1'); Alife.Append(''); Alife.Append('; cse_alife_space_restrictor properties'); Alife.Append('restrictor_type = 3'); Alife.Append(''); Alife.Append('; se_smart_terrain properties'); smart_n:= smart_n + 1; alife_number:= alife_number + 1; end; 26: begin Alife.Append(''); Alife.Append('[' + inttostr(alife_number) + ']'); Alife.Append('; cse_abstract properties'); Alife.Append('section_name = wpn_ak74u'); Alife.Append('name = item' + inttostr(item_n)); Alife.Append('position = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz); Alife.Append('direction = 0,-1.63260018825531,-1.58220040798187'); Alife.Append(''); Alife.Append('; cse_alife_object properties'); Alife.Append('game_vertex_id = ' + inttostr(ArXr[a].gv)); Alife.Append('distance = 0'); Alife.Append('level_vertex_id = ' + inttostr(ArXr[a].lv)); Alife.Append('object_flags = 0xffffff07'); Alife.Append('custom_data = cond = 0.2'); Alife.Append(''); Alife.Append('; cse_visual properties'); Alife.Append('visual_name = weapons\ak-74u\ak74u'); Alife.Append(''); Alife.Append('; cse_alife_item properties'); Alife.Append('condition = 1'); Alife.Append(''); Alife.Append('upd:num_items = 0'); Alife.Append(''); Alife.Append('; cse_alife_item_weapon properties'); Alife.Append('ammo_current = 90'); Alife.Append(''); Alife.Append('upd:condition = 1'); Alife.Append('upd:weapon_flags = 0'); Alife.Append('upd:ammo_elapsed = 0'); Alife.Append('upd:addon_flags = 0'); Alife.Append('upd:ammo_type = 0'); Alife.Append('upd:weapon_state = 0'); Alife.Append('upd:weapon_zoom = 0'); Alife.Append(''); Alife.Append('upd:current_fire_mode = 0'); item_n:= item_n + 1; alife_number:= alife_number + 1; end; 27: begin Scrpt.Append(ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz + ',' + Inttostr(ArXr[a].lv) + ',' + Inttostr(ArXr[a].gv)); end; 28: begin Scrpt.Append('treasure' + inttostr(alife_number) + ' = ' + ArXr[a].px + ',' + ArXr[a].py + ',' + ArXr[a].pz + ',' + inttostr(ArXr[a].lv) + ',' + inttostr(ArXr[a].gv)); alife_number:= alife_number + 1; end; end; a:= a + 1; end; // Form1.Memo1.Text:= Paths.Text; Paths.SavetoFile('Way_Generated.ltx'); Alife.SavetoFile('Alife_Generated.ltx'); Scrpt.SavetoFile('Script_Generated.ltx'); end; procedure TForm1.Edit1Change(Sender: TObject); begin logfilename:= Form1.Edit1.Text; end; procedure TForm1.Button2Click(Sender: TObject); // прочитать лог-файл var DLog: TStringList; a: integer; s: string; Command: string; P: TPointXR; begin NextCommand:= 0; gulag:= 1; Paths:= TStringList.Create; Alife:= TStringList.Create; Scrpt:= TStringList.Create; DLog:= TStringList.Create; DLog.LoadFromFile(logfilename); a:= 0; while (a < DLog.Count) do begin s:= DLog.Strings[a]; Command:= s; //copy(s,12,Length(s) - 11); If (Command = 'Command_create_point_way') then begin s:= DLog.Strings[a + 1]; Command:= s; //copy(s,12,Length(s) - 11); If (NextCommand = strtoint(Command)) then begin // BEGIN WORK //scan mode s:= DLog.Strings[a + 2]; Command:= s; //copy(s,12,Length(s) - 11); P.mode:= strtoint(Command); //game vertex s:= DLog.Strings[a + 3]; Command:= s; //copy(s,12,Length(s) - 11); P.gv:= strtoint(Command); //level vertex s:= DLog.Strings[a + 4]; Command:= s; //copy(s,12,Length(s) - 11); P.lv:= strtoint(Command); // level vertex look s:= DLog.Strings[a + 5]; Command:= s; //copy(s,12,Length(s) - 11); P.lvn:= strtoint(Command); //position s:= DLog.Strings[a + 6]; Command:= s; //copy(s,12,Length(s) - 11); P.px:= Command; s:= DLog.Strings[a + 7]; Command:= s; //copy(s,12,Length(s) - 11); P.py:= Command; s:= DLog.Strings[a + 8]; Command:= s; //copy(s,12,Length(s) - 11); P.pz:= Command; //direction s:= DLog.Strings[a + 9]; Command:= s; //copy(s,12,Length(s) - 11); P.dx:= Command; s:= DLog.Strings[a + 10]; Command:= s; //copy(s,12,Length(s) - 11); P.dy:= Command; s:= DLog.Strings[a + 11]; Command:= s; //copy(s,12,Length(s) - 11); P.dz:= Command; // gulag_name s:= DLog.Strings[a + 12]; Command:= s; //copy(s,12,Length(s) - 11); P.gulag_name:= Command; // param_line s:= DLog.Strings[a + 13]; Command:= s; //copy(s,12,Length(s) - 11); P.param_line:= Command; // reserved 1 param_line s:= DLog.Strings[a + 14]; Command:= s; //copy(s,12,Length(s) - 11); P.Res1:= Command; // reserved 2 param_line s:= DLog.Strings[a + 15]; Command:= s; //copy(s,12,Length(s) - 11); P.Res2:= Command; SetLength(ArXr,Length(ArXr) + 1); ArXr[NextCommand]:= P; NextCommand:= NextCommand + 1; end; end; a:= a + 1; end; Form1.Label1.Caption:= 'Точек найдено: ' + inttostr(Length(ArXr)); if (Length(ArXr) > 0) then begin Form1.Button1.Enabled:= true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin logfilename:= 'xray_user.log'; end; end. 2 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 19 Апреля 2016 abramcumner писал(а): дельфевый проект Я же говорил что там минимум dpr (Показать) program PathGeneratorProject1; uses Forms, PathGenerator in 'PathGenerator.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.program PathGeneratorProject1; uses Forms, PathGenerator in 'PathGenerator.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. dfm (Показать) object Form1: TForm1 Left = 200 Top = 126 Width = 275 Height = 143 Caption = #1043#1077#1085#1077#1088#1072#1090#1086#1088' '#1087#1091#1090#1077#1081' '#1089#1090#1072#1083#1082#1077#1088#1072 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 8 Top = 8 Width = 3 Height = 13 end object Button1: TButton Left = 8 Top = 72 Width = 249 Height = 25 Caption = 'Save' Enabled = False TabOrder = 0 OnClick = Button1Click end object Edit1: TEdit Left = 8 Top = 32 Width = 169 Height = 21 TabOrder = 1 Text = 'xray_user.log' OnChange = Edit1Change end object Button2: TButton Left = 184 Top = 32 Width = 75 Height = 25 Caption = 'Open' TabOrder = 2 OnClick = Button2Click end endobject Form1: TForm1 Left = 200 Top = 126 Width = 275 Height = 143 Caption = #1043#1077#1085#1077#1088#1072#1090#1086#1088' '#1087#1091#1090#1077#1081' '#1089#1090#1072#1083#1082#1077#1088#1072 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 8 Top = 8 Width = 3 Height = 13 end object Button1: TButton Left = 8 Top = 72 Width = 249 Height = 25 Caption = 'Save' Enabled = False TabOrder = 0 OnClick = Button1Click end object Edit1: TEdit Left = 8 Top = 32 Width = 169 Height = 21 TabOrder = 1 Text = 'xray_user.log' OnChange = Edit1Change end object Button2: TButton Left = 184 Top = 32 Width = 75 Height = 25 Caption = 'Open' TabOrder = 2 OnClick = Button2Click end end Lua - упаковка пакета данных (Показать) log("Command_create_point_way") --- ключевое слово, по которому программа опознает что начался пакет данных предназначенный для нее log(tostring(point_number)) --- номер пакета - нужен чтобы программа могла контролировать, что ничего не перепуталось point_number = point_number + 1 --- прибавляем при каждой записи log("8") --- число - номер исполняемой команды. указание что делать программе log(tostring(gv)) --- геймвертекс актора log(tostring(lv)) --- левел-вертекс актора log(tostring(lvn)) --- левел-вертекс куда смотрит актор log(tostring(pos.x)) --- позиция актора log(tostring(pos.y)) log(tostring(pos.z)) log(tostring(pos2.x)) --- позиция куда смотрит актор log(tostring(pos2.y)) log(tostring(pos2.z)) --- фрагменты вектора передаются и читаются на той стороне как строки. если где-то понадобится, это можно использовать. log(R_param_1) --- дополнительные строковые параметры. log(R_param_2) --- для разных команд, их назначение различно. log("Command_create_point_way") --- ключевое слово, по которому программа опознает что начался пакет данных предназначенный для нее log(tostring(point_number)) --- номер пакета - нужен чтобы программа могла контролировать, что ничего не перепуталось point_number = point_number + 1 --- прибавляем при каждой записи log("8") --- число - номер исполняемой команды. указание что делать программе log(tostring(gv)) --- геймвертекс актора log(tostring(lv)) --- левел-вертекс актора log(tostring(lvn)) --- левел-вертекс куда смотрит актор log(tostring(pos.x)) --- позиция актора log(tostring(pos.y)) log(tostring(pos.z)) log(tostring(pos2.x)) --- позиция куда смотрит актор log(tostring(pos2.y)) log(tostring(pos2.z)) --- фрагменты вектора передаются и читаются на той стороне как строки. если где-то понадобится, это можно использовать. log(R_param_1) --- дополнительные строковые параметры. log(R_param_2) --- для разных команд, их назначение различно. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 30 Апреля 2016 И снова я. На этот раз, оптимизация загрузки звуков. Платформа: ТЧ. Помнится кто-то здесь долго и упорно толковал про оптимизацию много чего применительно к солянке. И когда я спрашивал как бы звуки оптимизировать - был послан в те скрипты солянки, еще 2010 года, а как их прикручивать к моему/какому угодно моду - черт его знает. Ну и в общем, дошли руки, оптимизировал сам, посмотрел на то что получилось - и есть у меня такое подозрение, что пойдет это на любой мод на платформе ТЧ. Почему в таком случае не в "сборочный цех" это выкладываю? а потому что в файле присутствуют списки звуковых тем, и для модов в которых добавляются свои звуки/темы, придется их совмещать вручную через WinMerge. собственно сам код: https://yadi.sk/d/x-9OfcydsPRp2 адаптация под свой проект (Показать) 1. положить файл из архива в папку скриптов 2. Если в вашем моде добавлены/изменены звуки, вооружиться WinMerge и перенести свои изменения в оптимизированный файл, обратите внимание что объявление таблицы themes теперь упаковано в функцию reinit, не снесите ее случайно. 3. В bind_stalker.script в функции actor_binder:net_spawn добавить такую строчку: sound_theme.init()sound_theme.init() 4. Готово, можно запускать игру и радоваться. как это работает (Показать) Во первых, часть данных которую возможно загрузить/обработать заранее, загружается и обрабатывается при нетспавне актора. т.е. до загрузки всех неписей вообще. Во вторых, при появлении в онлайне нового нпс скрипт сначала проверит, а есть ли в онлайне похожие нпс (загружены ли наборы звуков для нпс такой же группировки/профиля и т.д.) - и если да, похожие данные имеются, он их просто копирует а не загружает по второму-десятому разу то же самое. В результате этого, при загрузке звуков для толпы похожих/идентичных нпс, находящихся рядом в одном гулаге, достигается максимальный эффект оптимизации т.к. для 10, 100 похожих нпс звуки (одни и те же) будут загружены не 10 или 100 раз, а всего 1. Во третьих, если все же производится загрузка, улучшен алгоритм загрузки данных при появлении нпс в онлайне. Дабы не быть голословным - РЕЗУЛЬТАТЫ ТЕСТОВ (Показать) Тут у многих товарищей была долгое время нехорошая привычка - говорить что мол, вот это быстрее, а это нет. почему и на сколько? а вот я так сказал мол, верьте мне на слово и все. Я по их стопам идти не собираюсь. Если речь идет о быстродействии - любое утверждение на тему оптимизации должно подтверждаться тестами, фактами. И числами. До (Показать) До оптимизации, родной sound_theme.script оригинала. * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 7446 * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 689.61376953125 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:7446 * DBG: xr_motivator:Время db.add_obj 0.0083737866953015 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.020855639129877 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 1.7214480638504 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0030716524925083 миллисекунд. * DBG: xr_motivator:Время manager 0.0021360206883401 миллисекунд. * DBG: xr_motivator:Время xfsnds 758.39764404297 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 57.310382843018 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 817.66247558594 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 7446 * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 689.61376953125 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:7446 * DBG: xr_motivator:Время db.add_obj 0.0083737866953015 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.020855639129877 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 1.7214480638504 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0030716524925083 миллисекунд. * DBG: xr_motivator:Время manager 0.0021360206883401 миллисекунд. * DBG: xr_motivator:Время xfsnds 758.39764404297 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 57.310382843018 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 817.66247558594 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ После (Показать) После оптимизации, загрузка первого НПС на локе: * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 7448 (new system) * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 229.58290100098 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:7448 * DBG: xr_motivator:Время db.add_obj 0.0080105112865567 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.020090805366635 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 1.6084860563278 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0035129971802235 миллисекунд. * DBG: xr_motivator:Время manager 0.0024669475387782 миллисекунд. * DBG: xr_motivator:Время xfsnds 229.81428527832 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 42.045860290527 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 273.69644165039 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 7448 (new system) * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 229.58290100098 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:7448 * DBG: xr_motivator:Время db.add_obj 0.0080105112865567 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.020090805366635 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 1.6084860563278 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0035129971802235 миллисекунд. * DBG: xr_motivator:Время manager 0.0024669475387782 миллисекунд. * DBG: xr_motivator:Время xfsnds 229.81428527832 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 42.045860290527 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 273.69644165039 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ загрузка 15-го подряд нпс в одном и том же гулаге: * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 17124 (new system) * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 1.6716794967651 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:17124 * DBG: xr_motivator:Время db.add_obj 0.0065423832274973 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.019425256177783 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 0.010625801980495 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0025873512495309 миллисекунд. * DBG: xr_motivator:Время manager 0.0019161499803886 миллисекунд. * DBG: xr_motivator:Время xfsnds 1.7876405715942 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 2.4578604698181 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 4.4502859115601 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: sound_theme:Start load sound for object: 17124 (new system) * DBG: sound_theme:sounds loaded = 280 * DBG: sound_theme:время загрузки: 1.6716794967651 миллисекунд * DBG: sound_theme:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DBG: xr_motivator:Вход NPC в онлайн:17124 * DBG: xr_motivator:Время db.add_obj 0.0065423832274973 миллисекунд. * DBG: xr_motivator:Время self.object:set_callback 0.019425256177783 миллисекунд. * DBG: xr_motivator:Время xr_info.loadInfo 0.010625801980495 миллисекунд. * DBG: xr_motivator:Время not self.object:alive() 0.0025873512495309 миллисекунд. * DBG: xr_motivator:Время manager 0.0019161499803886 миллисекунд. * DBG: xr_motivator:Время xfsnds 1.7876405715942 миллисекунд. * DBG: xr_motivator:Время xr_gulag.setup_gulag_and_logic_on_spawn 2.4578604698181 миллисекунд. * DBG: xr_motivator:Итого с учетом вывода в лог: 4.4502859115601 миллисекунд. * DBG: xr_motivator:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 3 10 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 1 Мая 2016 А я все же думаю пока оставить это дело тут. В "Сборочном цехе" есть свои правила, которые я сам же писал, и нарушать их не намерен. А эта работа в те правила не вписывается. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 1 Мая 2016 Вы мне так подпись взорвете она же не резиновая. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 1 Мая 2016 (изменено) Формально это полезно, но вообще то как раз из разряда тех "оптимизаций" которые добавляют считанные микросекунды и мало что меняют. Тем более что это "изменение" расположено во время загрузки... Загружу я сейв за 40 секунд, или за 40,1 - мне от такого ни холодно ни жарко. впрочем, это мое предположение, я это не тестировал. Если результаты тестов покажут что я ошибаюсь, возьму свои слова назад) Изменено 1 Мая 2016 пользователем Zander_driver 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 6 Мая 2016 (изменено) Dennis_Chikin писал(а): Касательно же звука, рекомендую поискать в теме "разработки" солянковской Смею заметить, инструкции к подключению скриптовых модулей, выкладываются все же не так. Я думаю ты помнишь когда я сам об этом спрашивал. Твой ответ тот раз был примерно такой же. Изменено 6 Мая 2016 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 6 Мая 2016 dsh писал(а): Может я чего не заметил? Наверное тестов моих не заметил. Там цифры какие-то есть, и они почему-то разные. Dennis_Chikin писал(а): Плюс к тому уникальные звуки надо вынести по уникальным путям, и грузить вообще не через themes. Ибо если включить лог, и посмотреть, кому что читается - это - страшно. Вот это справедливо, плюсую. логи включал, смотрел, выпадал в осадок от увиденного. зы. кактусы не люблю, мышью быть не хочется Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 7 Мая 2016 (изменено) dsh писал(а): Не, ну я не знаю, что там у тебя раньше было-то sound_theme.script оригинального ТЧ был. Там как бы сама кухня эта, в процессе определения кому и какие звуки подрубать в npc:add_sound() - уже сама по себе жрала прилично, потому что цикл, а в нем еще цикл, а в нем может быть еще, а внутри вызываем функции но результаты их работы никуда не запоминаем и потому дергаем на каждой итерации цикла заново. Вот это безобразие и исправил, результат - в посте под спойлером. Про внутри-движковое кэширование звуков я тоже в курсе, видел его проявление в логах, вот только нпс с профилем, таким же как у кого-то из уже загруженных неписей, грузился на оригинальной "кухне" в три раза дольше при всем движковом кэшировании. Изменено 7 Мая 2016 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 7 Мая 2016 (изменено) Кстати Денис, я тебя конечно уважаю, но http://www.amk-team.ru/forum/topic/13078-prozektorskaia/?view=findpost&p=904591 ты прости, работу этого файла проверял? игру с ним запускал? Я между прочим знаю что нет. Не проверял, не тестировал, не запускал. История то давняя... когда этот файл тут появился, я его сначала в WinMerge открывал. там просто все оранжевое) ладно думаю, попробую напролом. поменял свой старый на этот. вылет, один, другой, третий. отложил на потом. Вот пришло это потом, стал ковыряться в чем дело... local c_wnp = _G.c_wpn or {} -- здесь должна быть табличка clsid стволов.local c_wnp = _G.c_wpn or {} -- здесь должна быть табличка clsid стволов. объявляешь ее локально для модуля как c_wnp, потом в модуле используешь как c_wpn. Просто некрасиво но сразу доказывает что код тупо не проверялся на вот такие ляпы. Дальше веселее. function parse_data1( s )function parse_data1( s ) function parse_syn_data( s )function parse_syn_data( s ) функции находятся прямо в коде модуля. и в этом же модуле далее по тексту local t_def_nil = { ["meet_state"] = parse_data1( "5|wait@wait" ), ["meet_state_wpn"] = parse_data1( "5|backoff@threat_weap" ), ["victim"] = parse_data1( "5|actor" ), ["victim_wpn"] = parse_data1( "5|actor" ), ["use"] = { { ["section"] = "true", ["infop_check"] = {}, ["infop_set"] = {} } }, ["use_wpn"] = { { ["section"] = "false", ["infop_check"] = {}, ["infop_set"] = {} } }, ["syndata"] = parse_syn_data( "backoff@threat_weap" ), ["init_meet"] = "talk_hello", ["precond"] = "visibility", ["abuse"] = "true" } local t_def_nil = { ["meet_state"] = parse_data1( "5|wait@wait" ), ["meet_state_wpn"] = parse_data1( "5|backoff@threat_weap" ), ["victim"] = parse_data1( "5|actor" ), ["victim_wpn"] = parse_data1( "5|actor" ), ["use"] = { { ["section"] = "true", ["infop_check"] = {}, ["infop_set"] = {} } }, ["use_wpn"] = { { ["section"] = "false", ["infop_check"] = {}, ["infop_set"] = {} } }, ["syndata"] = parse_syn_data( "backoff@threat_weap" ), ["init_meet"] = "talk_hello", ["precond"] = "visibility", ["abuse"] = "true" } т.е. элементы таблицы, локально объявленной для данного модуля, мы формируем с помощью функции которая находится в этом же модуле. Знаете это видимо заразно. Писать индусский-солянкоподобный код который по щучьему велению что-то может быть делает а может быть нет, но проверять делает ли он вообще что то и работает ли, мы не будем, не царское это дело. Разжевываю для тех кто не понял. При первом упоминании xr_meet где-нибудь, движок приступает к компиляции модуля. Модуль будет доступен тогда, когда она завершится, до этого - он как бы еще не существует. и вот компилятор добирается до строчки ["meet_state"] = parse_data1( "5|wait@wait" ), он видит parse_data1. ее как бы надо вызвать, но где она? в этом же модуле который еще не собран. т.е. функция - не доступна. И знаете что происходит? компиляция прекращается на этом самом месте, что несложно установить просто поставив вызовы printf("проверка") между функций и таблиц. Компиляция обрывается, вернув скомпилированный обрубок кода в качестве модуля. проверки if xr_meet then return true end - исправно возвращают true, функции расположенные в нем ДО проблемного места исправно работают. Кусок кода расположенный ПОСЛЕ этого чудного маневра, просто отваливается. И такое выкладывается на публику, пользуйтесь мол, господа, а если у вас что-то вылетает так вы сами криворучки. Солянка блин, во всей своей красе и заразности. 2016 год на дворе. Изменено 7 Мая 2016 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 8 Мая 2016 (изменено) Dennis_Chikin писал(а): В чем проблема с обратиться к функции, описанной до обращения - ВАЩЕ ни панимаю. в том что модуль еще не собран. а она нужна для его сбора. Денис, я же не утверждаю что ты какую-то чепуху написал. Скрипт в конечном итоге полезный, и я его к своему моду прикрутил, но для этого мне потребовалось над ним изрядно поколдовать - сбор этих таблиц упаковать в функцию, и дергать ее из известных мест... для тебя, для меня, это не проблема, сделать чтобы вот этот выложенный тобою скрипт, работал. Но выкладывать работу в таком виде, когда для подключения к чему-угодно она требует определенных танцев с бубном при наличии определенных знаний - это не красиво как минимум, не стоит так делать имхо. А вот представь что человек ничего не смыслящий в скриптах, не скриптер вообще, возьмет твой файл и попробует поставить в свой проект. Что будет? у него ничего не получится. Желательно все же скрипты выкладывать в таком виде чтоб их могли не-скриптеры использовать. Изменено 8 Мая 2016 пользователем Ааз 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 8 Мая 2016 Да причем тут xr_logic и откат к древнеиндусским монстрокодам. Я же не об этом толкую блин. Просто чтобы файл требовал меньше телодвижений при его подключении к произвольно-стороннему проекту. Dennis_Chikin писал(а): ну ВОТ КАК ??? -- Функция чтения настроек. В нее передается секция, откуда их нужно читать. local t_def_nil local t_def_kamp local t_def_fotoman local t_def_bandit local t_def_other function init_tables() t_def_nil = { ["meet_state"] = parse_data1( "5|wait@wait" ), и тэ дэ по тексту...-- Функция чтения настроек. В нее передается секция, откуда их нужно читать. local t_def_nil local t_def_kamp local t_def_fotoman local t_def_bandit local t_def_other function init_tables() t_def_nil = { ["meet_state"] = parse_data1( "5|wait@wait" ), и тэ дэ по тексту... Ну вот так например. local xr_meet_initialized = false function init() if not xr_meet_initialized then init_tables() xr_meet_initialized = true end return true endlocal xr_meet_initialized = false function init() if not xr_meet_initialized then init_tables() xr_meet_initialized = true end return true end и вот так. И наконец в начале функций где эти таблички используются, вот так. function init_meet( npc, ini, sect, st, scheme ) xr_meet.init() далее тело функцииfunction init_meet( npc, ini, sect, st, scheme ) xr_meet.init() далее тело функции И все будет крутиться само при помещении этого файла в какой угодно проект. Список clsid стволов согласен, должны уж сами догадываться занести. Впрочем я вряд ли ошибусь, если скажу что в большинстве модов этот список не отличается от оригинала. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 8 Мая 2016 (изменено) Не считая расширения от RvP, у меня стандартный движок ТЧ. Оригинальный. Как можно запустить построчно, скомпилировав только часть - вот это мне интересно. Мы тут собрали пол-функции, что там дальше еще не знаем, но вы уже можете ее вызвать - так чтоли? И что будет выполняться при вызове такой функции... Может быть стоит обращать внимание на то, что после чего создается, и что после чего может быть создано. Нельзя вычислить сумму а и б до тех пор пока мы не узнаем чему равны а и б например, это просто логично. И у меня такое ощущение что ты это упускаешь из виду) Изменено 8 Мая 2016 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 8 Мая 2016 Я не знаю какое это имеет отношение к теме разговора. разве что, если писать log("сообщение") то у меня в логе никаких ! Cannot find saved game не будет. Все мотивы и причины и даже следствия я изложил, не вижу причин повторяться. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 8 Мая 2016 Мдямс. щас повторил твой тест - и у меня работает. а когда (в том самом, изначально тобою выложенном) xr_meet расставил между функций сообщения-маяки, они прошли все аккурат до тех таблиц. а после глухо. Может мы оба что-то не так делаем, но найти причину этого явления будет интересно. А за последние свои претензии приношу извинения. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 9 Июня 2016 тот пост редактировать уже не могу, а ссылка в моей подписи ведет именно на пост. Просьба к модераторам, заменить в нем ссылку на код, на вот эту: https://yadi.sk/d/x-9OfcydsPRp2 завел у себя на диске отдельную папку для всяких публичных материалов, чтобы их не удалять случайно. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 15 Января 2017 Dennis_Chikin писал(а): Кто и зачем так сделал - науке неизвестно, но скорее всего это был очередной курсовик по ООП очередного скубента. Прочитал. Такие увеселительные описания чудесных конструкций, придуманных разрабами Сталкира, и умудряющихся несмотря на "чудесность" конструкции, еще и работать, выдавая результат, который наверное похож на желаемый... это очаровательно. Сам я бы до такого не докопался никогда. Денис, с возвращением! И кстати, чтобы мой пост содержал не только эмоциональную радость, но и что-нибудь теоретически-интересное. Расскажу-ка я о том, как в своем моде лечил всеми любимого NPC по фамилии Сахаров. Предисловие для тех кто не в курсе. Суть проблемы была такая - если прийти на Янтарь, и допустить хоть на мгновение, чтобы Сахаров оказался в онлайне, то после этого происходит ужасное. Игра спокойно идет дальше, ни о чем таком не ругаясь даже в логе. Спокойно позволяет себя сохранить. Вот только при загрузке любого сделанного после сейва, валится на рабочий стол, без общепринятых в таком случае логов. Ну так вот. О тех страшных механизмах, о которых рассказывает Денис постом выше, я не знал, но догадывался что с рестрикторами в сталкире связано много страшного и беспощадного. И чтобы количество нежелательных явлений сократить, я в какой-то версии своего мода решил все рестрикторы в игре, которые не числятся в памяти кого-нибудь, удалять к чертовой бабушке. Есть как известно, IN-рестрикторы, OUT-рестрикторы, нпс и мутанты их помнят и очень обижаются если такой рестриктор перестает существовать. Ну, и ладно. Собрал значит в кучу память всех нпс и мутантов, перебрал все рестрикторы. Кого в этой всеобщей памяти не нашлось - к стенке, расстрелять. А у Сахарова, как оказалось, был еще base_in_restrictor. не "не входить", и не "не выходить" а еще какая то третья категория. Зачем так было сделано, и в чем тайный смысл - мне неведомо. Но Сахаров очень был обижен на то что его любимый, хотя и нидлячегоненужный, рестриктор убили. И в отместку убивал сейвы, и не соглашался на перезапись этого base_in_restrictor-а в своем нетпакете. Может Артос таких выкрутасов не предусмотрел, а может свойство только для чтения, кто ж его знает. В итоге пришлось самого Сахарова удалить и поставить на его место копию, которой средствами ОГСЕ приписан тот же стори_ид что был у старого. Мораль истории - рестрикторы зло в особенности те, для которых ни с первого, ни со второго взгляда не удается понять, зачем они вообще нужны. 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 345 Опубликовано 16 Января 2017 Карлан писал(а): Ни в каком не в подполье Если даже и не в подполье, то в каком-то темном углу. Потому как я разбор на эту тему вижу впервые, и посему с утверждением Карлан писал(а): ничего там интересного нет. Категорически не согласен. Да и вообще Денис интересно рассказывает, я бы почитал с удовольствием дальше, даже если бы это было "бояном". Но для меня повторюсь, это новое. По всяким подпольям и потайным углам я не любитель лазить. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение