|
|
|
Канал X2: The Threat: «Торговля скриптами» |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Dusk : |
55. Если не нашли, опять ищем станцию, но уже по умному(наверное).
|
Нет. В строке 53 поиск среди фабрик, в строке 55 - среди торговых станций.
Никуда мы не летим, т.к. "16 [THIS] -> set destination to $station" просто устанавливает переменную destination = переданному в функцию параметру $station. А летим в строке 41.
Цитата: |
49. Если мы ни фига не получили и есть команда "ни шагу назад",
мы опять идем в "!trade.loop.getwarebest"
(* nothing bought, then return if requested and do not fly home)
...
Летим домой
|
Т.к. скрипт "trade.getwareandreturnhome" вызван с параметром "stay if unable to buy = TRUE", то возврат (49.return -1) и ищем другую станцию для закупки. Если нашли - летим туда (опять же после 10-20сек тупого ожидания на "пустой" станции). Т.е. я в п.7 был в корне не прав. Приношу извинения - время было позднее, голова к концу рабочего дня плохо варит
akm : |
3. То количество ресурса, за которым он полетит, определяется в момент, когда он еще дома.
|
Дополнение: если транспорту не удалось закупиться с первой попытки, то идет перерасчет необходимого объема ресурса для закупки, т.е. п. 3 и 4 согласно текущему состоянию фабрики (но только в моменты непосредственно после "обломов" - потом опять летим на след. ф-ку и покупаем столько, сколько решили покупать еще перед вылетом. Если опять обламываемся - опять запоминаем новое значение $amount)
"Писателей" скриптов я тоже рано похвалил. Там можно треть команд выкинуть и еще треть вынести из цикла (чтобы не проверять всякую х-ню которая и не меняется с каждым новым циклом). Вот примеры. Скрипт "trade.getwareandreturnhome" :
1) Нахрена строки 7-14, если мы уже разгрузились в "!trade.loop.getwarebest"?
2) Вот еще вам задачка. Каков будет результат выполнения кода что ниже? Примечание: $amount - это параметр, переданный скрипту и он не модифицируется абсолютно ни в одной из строк, кроме приведенных ниже, и он всегда >0.
Код: |
001 [THIS] -> set wanted ware count to $amount
........
031 if $amount > 0
032 $wantedamount = [THIS] -> get wanted ware count
033 skip if $amount >= $wantedamount
034 $amount = $wantedamount
035 else
036 $amount = [THIS] -> get free amount of ware $ware in cargo bay
037 end |
Правильный ответ: ничего эти строки не делают вообще!!! Т.к. строки 34 и 36 попросту никогда не выполняются.
Цитата: |
А теперь момент: Летают 2 транспорта за батарейками.
Один тарнспорт привозит товар на свою базу. Второй летит за товаром,
прилетает, ОПА, товара нет. Е. Смотрит, а на 21,22 - так ведь уже не надо
нихрена. И что делает - переходит на 006. И так пока беза снова не нужен
будет товар. Т.е. остается на левой базе.
|
Вот и ответ автору топика. А что делать - писать самим нормальные скрипты. Вот только ничего особо продвинутого не напишешь (и без того игра тормозит). Хотя, одно Эгософт сделал прально: разделил пользовательские и неписевские скрипты. Т.е. на данный момент они одинаковы, но можно, скажем модифицировать пользовательский скрипт и не трогать std-скрипт, а еще лучше значительно упростить и оптимизировать последний - гарантирую: тормозов в игре убавится!
Еще огорчает то, что доступа к самой Script Engine у нас нет. Т.е. к примеру имеем проблему оптимального выбора маршрута, которую изложил AFor. И вот как ее пофиксить, если команду
get next sector on route from sector [SECTOR] to sector $targetsector
мы модифицировать не можем? Мы конечно ее можем заменить на свой скрипт, но для поиска маршрута придется создать массив всех секторов и гейтов в этом скрипте(!) и сделать свой алгоритм поиска (он не слишком сложен, но все же будет довольно ресурсоемок учитывая размерчик массива-карты).
Dimaxx : |
Короче, работы непочатый край...
|
Это уж точно! Но работать пока возможности толком и нет (не охота каждый раз начинать новую игру, строить по-новой фабрику, тестить очередную редакцию скрипта, и т.д.). Ждем патча. Есть маленькая надежда, что они сделают загрузку скриптов именно из папки Scripts, иначе те фичи, что они обещали, работать попросту не будут.
|
|
|
Dusk
200 EGP
   Репутация: 61 Сообщения: 412 Откуда: SPB Зарегистрирован: 30.11.2003
 |
|
--------------------------------------
Скрипт "trade.getwareandreturnhome" :
1) Нахрена строки 7-14, если мы уже разгрузились в "!trade.loop.getwarebest"?
--------------------------------------
Скрипт "trade.getwareandreturnhome" вызывается не только из "!trade.loop.getwarebest", это только для кораблей игрока, NPC же работают со скриптом "!ship.cmd.getware.std.xml", а там больше ничего нет, акромя вызова "trade.getwareandreturnhome". Для игрока эти строчки действительно нафиг не нужны, а вот NPC пригодятся
-----------------------------------------------------
2) Вот еще вам задачка. Каков будет результат выполнения кода что ниже? Примечание: $amount - это параметр, переданный скрипту и он не модифицируется абсолютно ни в одной из строк, кроме приведенных ниже, и он всегда >0.
Код:
001 [THIS] -> set wanted ware count to $amount
........
031 if $amount > 0
032 $wantedamount = [THIS] -> get wanted ware count
033 skip if $amount >= $wantedamount
034 $amount = $wantedamount
035 else
036 $amount = [THIS] -> get free amount of ware $ware in cargo bay
037 end
Правильный ответ: ничего эти строки не делают вообще!!!Т.к. строки 34 и 36 попросту никогда не выполняются.
-----------------------------------------------------
По моему так:
001.Задаем целью для переменной $amount содержать значение желаемого товара, т.е. как бы задаем и тип, и присваиваем ей значение,
которое извлекается из переданного в качестве параметра данному скрипты значения..
...
031. Если мы вообще что-то хотим купить, то
032. $wantedamount = конкретно, сколько(количество) товара мы вообще хотим купить на текущий момент.
033. Если то количество, которое мы хотели купить раньше, больше, того, что мы хотим купить сейчас, то пропускаем строчку 34. (Т.е. если пока мы летели на станцию, товара на homebase никто на привез, а он там выработался, то мы обновляем счетчик $amount в строке 34)
34. Обновляем счетчик 34 в связи с текущим значением. И переходим на 37.
35. Если мы вообще ничего не хотим купить, то
36. $amount = загружаемся по самые помидоры. Т.е. сколько товара в каргобее свободно.
37. end.
Я так думаю что команда Buy работает с типизированными переменными, типа "count" или "ware".
А вообще если у кого есть какие соображения по этому поводу, или какая критика, будет здорово.
Ибо полной документации все равно нет
-----------------------------------------------
Нет. В строке 53 поиск среди фабрик, в строке 55 - среди торговых станций.
----------------------------------------------
Сенькс
----------------------------------------------
Никуда мы не летим, т.к. "16 [THIS] -> set destination to $station" просто устанавливает переменную destination = переданному в функцию параметру $station. А летим в строке 41.
-----------------------------------------------
Да я знаю это. Поскольку летим мы в цикле, то под словом "летим" я подразумевал весь цикл. А т.к. покупаем мы в том же цикле, я не стал посреди слова "летим" вставлять "покупаем" , а написал его после. Думал догадаешься, что я имел в виду, хотя я наверно несовсем правильно написал с точки зрения алгоритма, но я имел в виду смысл.
|
|
|
Grebomet
1469 EGP
      Рейтинг канала: 2(22) Репутация: 261 Сообщения: 4790 Откуда: Питербурх Зарегистрирован: 06.01.2003
 |
|
Dusk : |
36. $amount = загружаемся по самые помидоры. Т.е. сколько товара в каргобее свободно.
|
Я так понимаю, $amount - это сколько товара корабль должен ПРИВЕЗТИ на станцию. Посему строка 36 должна звучать так:
036 Установить количество товара, который нужно привезти на станцию, равным имеющемуся на данный момент количеству этого товара в трюме.
Кстати, очень даже мудрая мысль, т.к. не дает транспорту "зависнуть" на чужой фабрике, если его трюм вдруг чудесным образом пополнился нужным товаром.
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
ZViruS
150 EGP
  Репутация: 20 Сообщения: 492 Откуда: Украина, Херсон Зарегистрирован: 10.11.2003
 |
|
в патчике 1.1. лежат скрипты
!trade.loop.getwarebest.pck
!trade.loop.sellwarebest.pck
!trade.sellwareandreturnhome.pck
!trade.getwareandreturnhome.pck
!init.ship.globalscriptmap.pl.pck
!fight.attack.object.pck
!fight.invasion.pck
!init.ship.commandupgrade.pck
!ship.signal.attacked.ts.pck
!ship.signal.followerneedshelp.pck
Чет они тама поисправляли. И еще куча всякой лабуды. Включая новые загрузочные заставки
Если нуна могу привести перечень.
_________________ Горят над нами, горят,
Помрачая рассудок.
Бриллиантовые дороги
В темное время суток. |
|
|
ASKirilL
1220 EGP
       Репутация: 302 Сообщения: 8209 Откуда: Москва Зарегистрирован: 21.03.2003
 |
|
akm : |
Есть маленькая надежда, что они сделают загрузку скриптов именно из папки Scripts, иначе те фичи, что они обещали, работать попросту не будут.
|
Гы.... А он навернож неспроста будить с сейвом что-то мутить...
Хорошо, если будет удалять из него скрипты, и начинать после этого грузать из папки скриптов...
А если он просто в сайве заменит старые скрипты на новые??....
_________________ Павлов - собака. |
|
|
Keynol
130 EGP
  Репутация: 11 Сообщения: 358
Зарегистрирован: 05.07.2001
 |
|
AFor
Ага Приведи
|
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Dusk : |
001.Задаем целью для переменной $amount содержать значение желаемого товара, т.е. как бы задаем и тип, и присваиваем ей значение,
которое извлекается из переданного в качестве параметра данному скрипты значения..
|
"wanted ware count" - это просто имя переменной, одной переменной из трех слов! Пробелы в имени допустимы. Декларировать тип переменной в скриптах Х2 вообще не нужно!
Т.е. после строки 32 имеем фактически $wantedamount = $amount и строка 34 никогда не выполняется, а проверка в 33 - бесполезна.
Насчет 36 правильно Grebomet заметил:
Цитата: |
036 Установить количество товара, который нужно привезти на станцию, равным имеющемуся на данный момент количеству этого товара в трюме.
|
Почти верно, только видимо опечатка: не имеющемуся а отсутствующему (свободному).
Цитата: |
Кстати, очень даже мудрая мысль, т.к. не дает транспорту "зависнуть" на чужой фабрике, если его трюм вдруг чудесным образом пополнился нужным товаром.
|
Неа. Строка 036 выполнится только если скрипт "trade.getwareandreturnhome" был вызван с параметром $amount <= 0. И как такое вообще возможно - непонятно. Очередная защита от глюксов. В общем то, в приведенных мной примерах кода есть смысл, но только если $amount = 0.
В общем ИМХО надо сначала отделить мух от котлет. Т.е. пользовательские pl-скрипты - отдельно, неписевские std - отдельно. Тогда можно будет их здорово оптимизнуть и функционально улучшить.
|
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
2 AFor
Давай в этой темке только про скрипты, причем только торговые?
Привожу отличия новых скриптов (патч 1.1) от старых 1.0.
Script !trade.loop.getwarebest
Код: |
006 while 1
007 @ = wait randomly from 7000 to 15000 ms
заменили на
006 $waittime = 1
007 while 1
008 @ = wait $waittime ms
009 $waittime = random value from 7000 to 15000 - 1
|
Код: |
014 * before doing amount calculation, try to unload already loaded ware
015 if $homebase == [DOCKEDAT]
016 $amount = [THIS] -> get true amount of ware $ware in cargo bay
017 skip if not $amount
018 = [THIS] -> unload $amount units of $ware
019 end
заменили на
016 * before doing amount calculation, try to unload already loaded ware
017 $amount = [THIS] -> get true amount of ware $ware in cargo bay
018 if $amount
019 if $homebase == [DOCKEDAT]
020 = [THIS] -> unload $amount units of $ware
021 else
022 * fly home and unload
023 @ = [THIS] -> call script '!trade.getwareandreturnhome' : ware=$ware destination station=null amount=$amount max.price=null stay if unable to buy=null
024 continue
025 end
026 end
|
Других изменений нет. Поехали дальше (буду добавлять потихоньку, анализ - потом)
Script !trade.getwareandreturnhome
Код: |
007 if [DOCKEDAT] == [HOMEBASE]
008 $wantedamount = [THIS] -> get true amount of ware $ware in cargo bay
009 skip if not $wantedamount
010 = [THIS] -> unload $wantedamount units of $ware
011 end
012
013 skip if [THIS] -> get free amount of ware $ware in cargo bay
014 return 1
заменили на
007 $wantedamount = [THIS] -> get true amount of ware $ware in cargo bay
008 if [DOCKEDAT] == [HOMEBASE] AND $wantedamount
009 = [THIS] -> unload $wantedamount units of $ware
010 $wantedamount = 0
011 end
012
013 $gotamount = 0
014 if not [THIS] -> get free amount of ware $ware in cargo bay
015 if $wantedamount
016 * fly home and unload
017 $station = null
018 $gotamount = $wantedamount
019 else
020 return 1
021 end
022 end
удалили строку
018 $gotamount = 0
|
Больше ничего в скриптах закупки не менялось!
|
|
|
Aggtaa
120 EGP
  Репутация: 8 Сообщения: 93 Откуда: Питер Зарегистрирован: 08.12.2003
 |
|
ты кидай с расцветкой, как diff выдает. так читать проще.
_________________ Aggtaa |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Т.е. по сути в алгоритм закупки патч вносит лишь две вещи:
1) Новый механизм задержек wait. Как он работает - не совсем понятно.
2) Где бы не был наш транспорт, если у него на борту есть хоть единица груза (за покупкой которого он полетел), он вернется на базу и разгрузится.
Т.е. те проблемы, что обсуждались выше в этой теме, патч 1.1 не решает!
|
|
|
Aggtaa
120 EGP
  Репутация: 8 Сообщения: 93 Откуда: Питер Зарегистрирован: 08.12.2003
 |
|
akm : |
006 $waittime = 1
007 while 1
008 @ = wait $waittime ms
009 $waittime = random value from 7000 to 15000 - 1
|
Работает так же, за исключением того, что корабль теперь реагирует на приказ сразу, без задержки.
_________________ Aggtaa |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Да, так оно и есть. Фикшу свой пред. пост.
|
|
|
Пассажир
|
|
2 akm
2 dusk
Может я чего не знаю, но типа ребята, как вы скрипты смотреть можете а? Поделитесь инфой... неужель нашёл кто-то как редактор скриптов активировать?
[edit]
Тю... все нашел
|
|
|
GTD RAI.D
100 EGP
 Репутация: -10 Сообщения: 319 Откуда: Earth Зарегистрирован: 07.04.2003
 |
|
2AKM:
Где эти скрипты менятьть можо?, я в программировании нигугу а вы я смотрю, уже скриптами швыряетесь?.>>
|
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Мы пока только анализ делали того, что имеем от Эгософт. Редактировать их можно просто в ноутпаде, но геморно. А главная трабла: чтобы отредактированный скрипт заработал, нужно начать игру сначала Т.е. в Х2 версии 1.0 скрипты грузятся из папочки Scripts только однократно, когда New Game. Затем они берутся из сейвов (чего там только не берется из сейвов)
Вот я например жду патча 1.1. А вдруг там эту хрень пофиксили и будет возможность заниматься хоть какой-то отладкой. Надежда умирает последней...
|
|
|
Aggtaa
120 EGP
  Репутация: 8 Сообщения: 93 Откуда: Питер Зарегистрирован: 08.12.2003
 |
|
2акм: нет.
_________________ Aggtaa |
|
|
BabyWolf
294 EGP
   Рейтинг канала: 1(3) Репутация: 72 Сообщения: 579 Откуда: Новосибирск Зарегистрирован: 03.12.2003
 |
|
akm : |
Чтобы отредактированный скрипт заработал, нужно начать игру сначала Т.е. в Х2 версии 1.0 скрипты грузятся из папочки Scripts только однократно, когда New Game. Затем они берутся из сейвов (чего там только не берется из сейвов)
|
Вариант отладки - это патч! Который при загрузке конвертирует сэйвы и меняет в них скрипты. Подправить скрипт, подсунуть сэйв 1.0, проверить.
|
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Вот и у меня такая же идея Только конвертацию делает не патч, а сам Х2.ехе, т.е. ждем nocd-версию...
Т.е. на худой конец так и будем делать, однако в этом случае скорее всего будем ограничены теми скриптами, что были изменены этим патчем.
|
|
|
Пассажир
|
|
ASKirilL : |
akm : |
Есть маленькая надежда, что они сделают загрузку скриптов именно из папки Scripts, иначе те фичи, что они обещали, работать попросту не будут.
|
Гы.... А он навернож неспроста будить с сейвом что-то мутить...
Хорошо, если будет удалять из него скрипты, и начинать после этого грузать из папки скриптов...
А если он просто в сайве заменит старые скрипты на новые??....
|
Насколько я понимаю, в сейве должны сохраняться не только скрипты, но и какие-то состояния интерпретатора (скомпилированный исполняемый код, локальные переменные..., если конечно в момент сохранения какие-то скрипты не завершили свое исполнение). Если это так, то нельзя просто взять и поменять скрипты в сейвах, т.к. нужно будет сконвертировать и состояния интерпретатора, иначе не понятно с какого места продолжить исполнение нового скрипта...
Видимо поэтому скрипты хранятся прямо в сейвах, а не в папках.
Другое дело, что подобных неприятностей можно избежать хранением предыдущих версий скриптов. Т.е. после загрузки сейва обновлять базу скриптов из папок, доисполнять старые скрипты с того места, где они были прерваны, а в остальном - использовать новые.
P.S. Я не знаю, каким образом реализовано сохранение сейчас, но уверен, что не от хорошей жизни разработчики запихнули скрипты в сейвы.
|
|
|
Keynol
130 EGP
  Репутация: 11 Сообщения: 358
Зарегистрирован: 05.07.2001
 |
|
а от какой ? ну нафига это было делать ?
|
|
|
|
|
|
Канал X2: The Threat: «Торговля скриптами» |
|