sapsan 336 Опубликовано 7 Июля 2010 Найдена скриптовая аномалия! Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 7 Июля 2010 Таки причина в table.getn(). Заменил его на оператор # и всё встало на свои места. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 7 Июля 2010 (изменено) Kolmogor, kamikazze, уходить от использования table. нужно или глобально, или только в работе со своими таблицами, к которым никто другой не доступается и в комментариях описать данных "уход", или вообще не уходить с целью даже будущей совместимости. А ведь есть ещё table.sort и table.concat. Добавлено через 19 мин.: Dennis_Chikin, скорее всего там условие проверяется "ленивым" способом. Тоесть если в условии (а или б) значение а == истина, то б уже не проверяется и не расчитывается. Аналогично с условием (а и б) - если значение а == ложь, то б уже не проверяется и не расчитывается. Добавлено через 32 мин.: Dennis_Chikin, тесты, тесты и ещё раз тесты Добавлено через 25 мин.: Ещё по "уходу" - кроме других table-функций есть ведь ещё и оригинальные скрипты от GSC. Поэтому уходить или вместе с ними или только для своих таблиц. Изменено 7 Июля 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 11 Июля 2010 Из экспериментов с таблицами: 1) После вставки с помощью выражения t[#t+1] = 1 получить правильную длину таблицы с помощью table.getn нельзя, но с помощью # можно. 2) Если делать удаление элемента с помощью присваивания nil, то таблица не утрясается и тогда все последующие обращения к ней нужно проводить с проверкой на ~= nil или, если это цикл, с помощью in pairs. Также размер таблицы нельзя получить правильно ни с помощью table.getn, ни с помощью # (разве только вручную вести счетчик). P.S. Вот и все "странности". Так что либо держать все ниточки в своих руках, либо откатываться на стандартные методы... Второе - надёжнее. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 11 Июля 2010 (изменено) kamikazze, получается, что удаление элемента из таблицы путём присваивания nil нельзя, если собираешься потом получить её длину (ни table.getn, ни # корректную длину не возвращают). Или вести счетчик руками... А если для проверки условий по количеству ? В общем - небезопасно это в плане корректности данных. Изменено 11 Июля 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 12 Июля 2010 (изменено) Таблицы в луа - это ассоциативный массив. Хранятся пары - ключ, значение. Но их можно использовать как массивы, списки, стек и прочее(см. список структур данных). Здесь таблицы раскрыты немного не так.The implementation of tables in Lua involves some clever algorithms. Every table in Lua has two parts: the array part and the hash part. The array part stores entries with integer keys in the range 1 to n, for some particular n. All other entries (including integer keys outside that range) go to the hash part. Таблицы в луа - это ассоциативный массив. Хранятся пары - ключ, значение. Но их можно использовать как массивы, списки, стек и прочее(см. список структур данных). Оператор # возвращает не длину таблицы Он возвращает номер элемента после которого идет nil. То есть в частном случае когда в таблице нилов нет, вернется длина таблицы. В общем, как только начали баловаться присвоением нилов, вернет длину до первого нила Не совсем так. Вот такой код local t1 = {1,2,3,4,5} t1[2] = nil get_console():execute("load ~~~ testTables table.getn(t1): "..tostring(table.getn(t1))) get_console():execute("load ~~~ testTables #t1: "..tostring(#t1)) amk.dump_table(t1) даёт такой лог ! Cannot find saved game ~~~ testtables table.getn(t1): 5 ! Cannot find saved game ~~~ testtables #t1: 5 ! Cannot find saved game ~~~ .1 => 1 ! Cannot find saved game ~~~ .3 => 3 ! Cannot find saved game ~~~ .4 => 4 ! Cannot find saved game ~~~ .5 => 5 Дамп таблицы в конце лога построен на for k,v in pairs t do, поэтому элемент под номером 2 пропущен. Но самое интересное, что утряски таблицы не произошло и оба способа получения длины не сработали. P.S. Это я лишнего из лога взял... Изменено 12 Июля 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 12 Июля 2010 (изменено) Ещё из экспериментов с таблицами. local t2 = {2, 3} t2[#t2+1] = 4 t2[#t2+1] = 5 get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) table.remove(t2, 2) table.remove(t2) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) t2[#t2+1] = 7 t2[#t2+1] = 8 get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) table.remove(t2, 2) table.remove(t2) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) Даёт ! Cannot find saved game ~~~ testtables table.getn(t2): 4 ! Cannot find saved game ~~~ testtables #t2: 4 ! Cannot find saved game ~~~ testtables table.getn(t2): 2 ! Cannot find saved game ~~~ testtables #t2: 2 ! Cannot find saved game ~~~ .1 => 2 ! Cannot find saved game ~~~ .2 => 4 ! Cannot find saved game ~~~ testtables table.getn(t2): 2 ! Cannot find saved game ~~~ testtables #t2: 4 ! Cannot find saved game ~~~ .1 => 2 ! Cannot find saved game ~~~ .2 => 4 ! Cannot find saved game ~~~ .3 => 7 ! Cannot find saved game ~~~ .4 => 8 ! Cannot find saved game ~~~ testtables table.getn(t2): 0 ! Cannot find saved game ~~~ testtables #t2: 4 ! Cannot find saved game ~~~ .3 => 7 ! Cannot find saved game ~~~ .4 => 8 Из чего видно, что как только была использована функция table.remove, так сразу разъезжаются результаты table.getn и #, которые до её использования возвращали одинаковые значения, и дальнейшее поведение самой функции table.remove становится некорректным. Общий вывод такой: конструкцию t2[#t2+1] = 1 можно использовать только в случаях "только для чтения/изменения". В случае надобности удалять элементы таблицы нужно пользоваться стандартными функциями table.insert, table.remove либо переходить на полностью ручное управление таблицей (t2[#t2+1] = 1, t2 = nil, t2 ~= nil и ручной счетчик). Изменено 12 Июля 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 12 Июля 2010 malandrinus, нет, стандартными функциями пользоваться можно. local t2 = {2, 3} table.insert(t2, 4) table.insert(t2, 5) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) table.remove(t2, 2) table.remove(t2) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) table.insert(t2, 7) table.insert(t2, 8) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) table.remove(t2, 2) table.remove(t2) get_console():execute("load ~~~ testTables table.getn(t2): "..tostring(table.getn(t2))) get_console():execute("load ~~~ testTables #t2: "..tostring(#t2)) amk.dump_table(t2) Даёт ! Cannot find saved game ~~~ testtables table.getn(t2): 4 ! Cannot find saved game ~~~ testtables #t2: 4 ! Cannot find saved game ~~~ testtables table.getn(t2): 2 ! Cannot find saved game ~~~ testtables #t2: 2 ! Cannot find saved game ~~~ .1 => 2 ! Cannot find saved game ~~~ .2 => 4 ! Cannot find saved game ~~~ testtables table.getn(t2): 4 ! Cannot find saved game ~~~ testtables #t2: 4 ! Cannot find saved game ~~~ .1 => 2 ! Cannot find saved game ~~~ .2 => 4 ! Cannot find saved game ~~~ .3 => 7 ! Cannot find saved game ~~~ .4 => 8 ! Cannot find saved game ~~~ testtables table.getn(t2): 2 ! Cannot find saved game ~~~ testtables #t2: 2 ! Cannot find saved game ~~~ .1 => 2 ! Cannot find saved game ~~~ .2 => 7 Тоесть все функции нормально отрабатывают. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 24 Июля 2010 (изменено) Здесь нашел неофициальный мультиплеерный патч 7.02е (как бы 1.0007). Говорится, что для сингла можно использовать из него gamedata.dbe. После установки ловим вылет по отсутсвию секции, которой нет в Соляночном gamedata/config/weathers/flares.ltx. После простого переноса недостающих секций игра запускается. Но это нельзя считать применённым патчем, так как в Солянке будут и другие файлы, которые "родом" из 1.0004 и которые нужно довести до 1.0007 и оставить соляночные изменения. P.S. Сам я это делать уже не буду (так как по-просту нет времени), но не рассказать о такой находке не мог Желающие - дерзайте, там ведь есть исправления оригинальной игры и, кроме того, теоретически можно попробовать взять dll-ки. BadSven, всё есть в ридми в архиве. Или на странице по ссылке. Как минимум - пофиксена геометрия l11_pripyat, исчезли фантомные гаражи, проявились ранее невидимые - пофиксен конфиг аномалии Ржавые волосы [zone_rusty_hair] Сам gamedata.dbe весит под 70 МБ. Скрипты не изменены. Распакуйте да посмотрите сами Изменено 24 Июля 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 7 Августа 2010 (изменено) Странности с сохранением 64-разрядных данных. Решил было исправить сохранение и, соответсвенно, загрузку времени в level_weathers.script с 32-разрядного на 64-разрядное беззнаковое. В луа_хелп такие функции вроде как есть, но с НИ после попытки сохранится получаю безлоговый вылет. В такой замене функций, как мне кажется, также нуждается скрипт xr_gulag.script malandrinus, я переделал всюду время на 64-разрядный формат (используется game.get_game_time()). Поэтому и нужно хранить 64-разрядное значение. Иначе сохранённое значение будет после переполнения всегда меньше текущего и постоянно будет исполнятся условие необходимости каких-то действий или, если хранится стартовое время, всегда старт + дельта будет меньше текущего времени, что опять же приведёт к постоянному выполнению каких-то действий (наприммер - смена погоды), или эти действия перестанут выполнятся вовсе. Это уже всё зависит от алгоритма... Изменено 7 Августа 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 15 Августа 2010 Arhara, lsclon по вылету LUA error: ...iles\s.t.a.l.k.e.r\gamedata\scripts\amk_anoms.script:512: attempt to index local 'sobj' (a nil value) в строке 512 размещена функция set_anomaly_status(), которая может получить nil только из одного скрипта - это move_mgr.script в строке 251, где данные для amk_anoms.set_anomaly_status() берутся от её "землячки" функции amk_anoms.get_anomaly_list_for_pos(). То ли проблема в amk_anoms.script, то ли в путях, возле которых спавнятся аномалии. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 8 Сентября 2010 Наработки-разработки: Можно что-угодно куда-угодно спавнить с задержкой во времени. В скрипт new_spawn.script добвлена функция function doSpawn(tblSpawn), которая принимает на вход таблицу такого формата: local tbl = { ["spawn_item"] = {--спавним объекты на карту {sect="ros_killer_respawn_4",pos={-259.963623,-0.000217974,22.387314},lv=6507,gv=1395}, -- спавним обычным способом {sect="ros_killer_respawn_4",pos={0,2,0}}, -- спавним в 2-х метрах над ГГ }, ["spawn_item_in_inv"] = {-- спавним объекты в инвентарь {sect="gold_art", npc_id=0}, -- спавним в рюкзаке у ГГ }, ["spawn_ammo_in_inv"] = {-- спавним патроны в инвентарь {sect="ammo_12x70_buck", npc_id=0, number=20}, -- спавним патроны в рюкзаке у ГГ } } Эту функцию можно вызывать как напрямую, так и посредством таймера (пример из new_spawn.script): function bar_james() local tbl = { ["spawn_item"] = {--спавним объекты на карту {sect="ros_killer_respawn_4",pos={-259.963623,-0.000217974,22.387314},lv=6507,gv=1395}, {sect="ros_killer_respawn_4",pos={-257.169403,-0.000773012,5.0113105},lv=7481,gv=1395}, {sect="ros_killer_respawn_4",pos={-263.326446,-0.00097110867,11.14619922},lv=5620,gv=1395}, {sect="ros_killer_respawn_4",pos={-248.740127,-0.00184855,6.270340919},lv=10240,gv=1396}, } } amk.start_timer("spawn_wait", 2, tbl) end который реализован в amk.script так: func_by_string["spawn_wait"] = function (params_string) local tbl = unpack_array_from_string(params_string) new_spawn.doSpawn(tbl) end Реализация в скрипте sol_sound.script. Разные варианты запуска озвучки: play_sound_on_actor([[characters_voice\human_03\stalker\talk\leave\leave_5]], 0, true, nil) 1. имя звука; 2. таймаут (время задержки); 3. прерывать ли предыдущий звук в своей очереди; 4. имя очереди (если == nil, то никакой очереди по своей сути нет) Подходит для СМС и подобных, которые звучат в голове у ГГ. play_sound_on_actor_shift([[characters_voice\human_03\stalker\talk\leave\leave_5]], 0, true, nil, 1, 1, 0) То же самое, но со здвигом относительно ГГ. Сдвиг статичный и не привязак к взгляду ГГ (не справился я с этой задачей). play_sound_on_npc_by_name([[characters_voice\human_03\stalker\talk\dialog\dialog_1]], 0, true, nil, "esc_zvezdochet") Воспроизведение от непися или просто объекта. Непись определяется по точному имени. Звук следует за неписем. "Правильную" привязку звука к объекту "не осилил". Параметры аналогичны первому варианту + в конце имя непися или объекта. play_sound_on_npc_by_sid([[characters_voice\human_03\stalker\talk\leave\leave_5]], 0, true, nil, 32) --Кузнецов на Кордоне Аналогично предыдущему, но объект находится по его story_id. Можно воспроизводить звук с наложением на предыдущий задавая в третьем параметре false. Значение true прервёт проигрывание звуков как без очереди, так и внутри очереди определённой четвёртым параметром. Для постановки звуков в очередь нужно запускать озвучки (можно разнотипные) с одним и тем же именем очереди, например "SMS". Для запуска другой очереди просто запускается озвучка с другим именем очереди. Это может быть использовано для оформления диалогов или смс звуковыми спецэффектами. Есть возможность полной остановки и очистки определённой очереди с помощью функции queue_clear("SMS"), так и полного прерывания и очистки всех очередей вместе взятых - queue_clear_all(). Уже сейчас используются в диалогах: Из dialogs_arhara.xml <phrase id="1"> <text>zvezdochet_talk_1</text> <action>sol_sound.zvezdochet_talk_1</action> <next>2</next> </phrase> Из sol_sound.script function zvezdochet_talk_1() play_sound_on_npc_by_name([[characters_voice\human_03\stalker\talk\dialog\dialog_1]], 0, true, nil, "esc_zvezdochet") -- или вариант с постановкой в очередь и непрерыванием предыдущего звука в этой очереди: --play_sound_on_npc_by_name([[characters_voice\human_03\stalker\talk\dialog\dialog_1]], 0, false, "dialog", "esc_zvezdochet") -- тут же можно запустить и другие звуки для атмосферы или по сути сюжета, можно прервать очередь, можно прервать другую очередь ну и вообще вытворять что-угодно... -- желательно всё же ограничится только работой со звуком, а другое вызывать из диалога другим екшеном... end В диалогах можно практиковать прерывание очереди диалога, а можно ставить всю озвучку диалога в очередь для 100% прослушивания игроком Для запуска СМС вместо -- Звуковое сопровождение local snd_obj = xr_sound.get_safe_sound_object([[characters_voice\human_03\stalker\talk\leave\leave_66]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) делать так: -- Звуковое сопровождение sol_sound.play_sound_on_actor([[characters_voice\human_03\stalker\talk\leave\leave_66]], 0, false, "sms") -- имя звука, задержка, не прерывать звучание очереди, имя очереди благодаря чему не будет накладывания звука и сокращается количество кода. Для работы очередей и следования звука за объектом/неписем в апдейт актора нужно добавить: if sol_sound then sol_sound.update() end Код как мог сделал минимально нагружающим систему как в случае активной озвучки, так и в случае простоя. Поэтому и для того, чтобы звук плавно следовал за объектом ставить под временнУю задержку этот вызов не нужно. Например захочет автор запустить у непися монолог и при этом будет его вместе с ГГ катать по локации на авто/вертолёте/ковре-самолёте, а из-за задержек в апдейтере актора звук будет пространственно отставать от объекта/непися. Если кто-то "правильно" переделает "звук от объекта/непися" так, что звук будет движком перемещаться за объектом-хозяином, тогда часть кода из апдейтера будет убрана (останется только работа с очередями) и тогда только можно будет ставить вызов sol_sound.update() под небольшую задержку (не больше, чем пол секунды). Реализация в amk.script. Теперь есть возможность изменять группировку непися с отсрочкой. Пример из new_dialog.script: function ghange_set(npc) amk.start_timer("change_npc_community", 2, {npc:id(), "killer"}) end Вопросы, критику, предложения, доработки - в личку. Ответы и изменения по сути буду размещать здесь же. Все скрипты вместе. Актуально для Соли с патчем от 03.09 и готово к употреблению. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 17 Сентября 2010 Shadowman, может спавн и уборку тех бинтов от Сяка убрать. Зачем они ? Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 11 Ноября 2010 menk, Trapper023, личные разборки попрошу в личку, а здесь - потереть. Какие текстуры и в какую сторону будут поправлены - дело тех, кто за это берётся. Да и обсуждается это всё открыто. Здесь никто никого принуждать не может. Можно только критиковать результат. Примет ли их Архара в Солянку - другой вопрос. P.S. Да, Солянка она ведь Народная - делается для народа. Без такой позиции не занимались бы мы с Shadowman оптимизацией скриптов, так как изначальное быстродействие для нас было приемлемо. P.P.S. А по качеству текстур - текстуры одного уровня важности (оружие - один уровень, монстры - другой, хлам с транспортом - третий, земля с деревьями - четвертый и т.д.) визуально должны быть одинаковы по качеству и детализации. Нельзя, к примеру, чтобы собака была с обычной, а кот - с супер детальной текстурой да ещё и с мехом - это бросится в глаза и станет понятно, что нужно всё подтягивать к уровню кота (хотя можно было просто сделать кота на уровне собаки и всё было бы уравновешено на общей картинке). Поэтому отдельное новое оружие с очень детальной текстурой стоит "опустить" по детализации (в угоду одного уровня всего оружия и для тех же "пишмашинок") или вытягивать _всё_ остальное оружие до уровня нового (в угоду одного уровня). В первом случае работы меньше, а результат будет лучшим для большинства игроков. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 11 Ноября 2010 chorik, как по мне, то третий вариант уазика - как будто по нему месяц град лупил. На сколько я помню из виденных мною брошенных гниющих машин - такого не было. Поверхность, которая ещё не ржавеет, не коробится и особо не темнеет. Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 23 Ноября 2010 (изменено) Из серии "оптимизация": Если при использовании string.find не используются регулярные выражения, то лучше всего вызывать эту функцию так: string.find("где искать", "что искать", 1, true) Такой вариант обеспечивает сокращение времени работы на 35% (сравнивались варианты с предварительным присваиванием string.find локальной переменной). Также это убережет от ситуации, когда в "что искать" попадается "-". Без указания 1, true скрипт воспримет его как часть регулярного выражения, а не как сам по-себе символ. Dennis_Chikin, это может быть быстрее чем if string.find(obj:name(), "^af_") then Примеры кода для тестирования есть выше... Изменено 23 Ноября 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 25 Ноября 2010 (изменено) Найден способ запускать звук от непися чтобы он шевелил при этом губами. Для этого озвучку нужно запускать с помощью xr_sound.script. Попробовал на Зведочете. Кроме того такой "официальный" способ даст корректную работу с другими звуками неписей (например при переключении его на бой). Настраивать нужно в config\misc\script_sound.ltx и scripts\sound_theme.script. Есть только ньюанс с названием файлов. Озвучивание персонажей в Солянке думаю будет переделано до следующей допы. Все вызовы так и будут идти через sol_sound.script. При этом очереди также поддерживаются самим xr_sound.script да и с помощью того же sol_sound.script возможность запускать другие звуки в фоне останется (например для атмосферности). P.S. Эта "находка" - чисто моя и, если "все об этом давно знали", то я рад за всех и за себя P.P.S. Вот только не проверял следует ли звук за перемещающимся неписем... Dennis_Chikin, протестировал: способ со string.sub() быстрее на 39% способа со string.find() с регулярным выражением. Тоже не мало... fokstar, sapsan, чтобы диалоги не перекрывала визуальная рамкаЭто когда текст не влезает по ширине ? sapsan, возможно сделать захват ГГ на диалог?Теоретически - да. sapsan, будет ли это возможно, чтобы сделать бы диалоги по принципу, как в Fallout?Что имеется ввиду ? Тот же захват ? Изменено 25 Ноября 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 2 Декабря 2010 (изменено) Вот переделал универсальные скрипты. Они нужны чтобы обойтись без адаптации под патчи 1.0005 и 1.0006. Останется только подбрасывать нужный xrGame.dll. Часть информации взял из aem_manager.script (менеджер арены) - там есть функция chk_ver(). Одно но. При перепроверке в том же aem_manager.script есть куча мест, где эта функция chk_ver() не используется при вызове функции добавления фразы (например dlg:AddPhrase("aem_job_reject", chk_ver(6), chk_ver(2), -10000) и dlg:AddPhrase("aem_job_group_reject", dlg_id+2, dlg_id+1, -10000)). Выходит, что арена на патчах 5-6 должна некорректно работать... Проверить сами скрипты и работу арены уже не имею времени. Если кто захочет помочь - милости просим. Проверить нужно на патчах 1.0004 и 1.0005 или 1.0006. Проверить нужно корректность диалогов у неписей (обычный "что можешь нового рассказать", случайных работ, сюжетных, у торговцев и т.д.) и диалоги у Арни по Арене отдельно (особенно сравнить диалоги на разных патчах). Результаты, вылеты - в личку. Порядок установки: - для патча 1.0004 - Солянка с патчем от 03.09, скрипты от 30.09, универсальные скрипты; - для патчей 1.0005, 1.0006 - Солянка с патчем от 03.09, адаптация к патчам, скрипты от 30.09, универсальные скрипты; ============================== Шустрый - странный тип... Иногда после разговора с ним он остаётся стоять на месте и никуда не идёт. Что интересно - вот только запустил игру и первых три-четыре раза не хотел идти. Потом пошел. Перезапускал игру, загружался кучу раз - уже уходит Предвкушая вопросы - щелкал по всем его диалогам одинаково. Думается мне, что при попадании в какую-то фазу его "Привет Меченый" или вставания, или ещё чего-то - его клинит. Когда он не уходит, то просто себе стоит в одной позиции и все, а когда уйдёт, то переминается, чешется... Вот сохранение для проб. Кто сможет понять закономерность - почет и уважение Изменено 4 Декабря 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 28 Декабря 2010 (изменено) По следам оптимизации... Новый (для меня) вариант функции trim(): function trim(s) return s:match'^%s*(.*%S)' or '' end дает от 2-х до 10-и-кратное ускорение в зависимости от того, что ему скормить, в сравнении со "старым" амк-м. Результаты взяты из игры, а не редактора. P.S. "Старый" амк-й str_explode с новым trim и локализацией внешних функций тоже существенно ускоряется, но всё же отстает от варианта Artos-Gun12 Shadowman, запросто может быть, что и люди те строки писали напрямую и в хвосте и начале пробелов с табами наоставляли. Ну и что быстрее в чистом виде - не проверял. Разные функции, разные шаблоны... Главное - результат. Я теоретических изысканий не проводил, а грязно попользовался уже готовыми отсюда. Изменено 29 Декабря 2010 пользователем sapsan Поделиться этим сообщением Ссылка на сообщение
sapsan 336 Опубликовано 13 Мая 2012 Убил целую неделю на то, чтобы убедиться, что удаление из таблиц вообще делать нельзя. Ни каким образом. Ни присвоением nil, ни table.remove(). И без разницы, на самом деле, в цикле, или не в цикле. У табличных функций сносит крышку непредсказуемо. Имеем 13 записей, удаляем через table.remove() последнюю по номеру - имеем 12. Добавляем - снова 13. Удаляем - удаляется почему-то 12-я, размер таблицы - 11, 13-я болтается отдельно. Код покажи. И, часом, это не те же муки творчества, которые два года назад были (1, 2) у меня ? Поделиться этим сообщением Ссылка на сообщение