+1
Era is for H3 what fire invention was to humanity!
I would never have worked so much for 3.58.
Pouah! Start map, find erm error turn 145, restart map, find error turn 245, restart.

totkotoriy, спасибо за добрый отзыв. В свою очередь хочу передать благодарность ZVS, MoP, Sav-у, Bes-у, SyDr-у, Валерию и ещё доброй д.жине людей, благодаря которым стало возможным сделать то, что было сделано.
Valery, don't even remind that hell! Btw, I used DEE program to upload scripts to existing game at those times

По-моему я нашёл ошибку. Пишу
Если верить справке, должно создать массив из 200 целых элементов (они 4-байтовые хоть?) и вернуть индекс в v1. Но v1=-2 и понятно, что никак к массиву не обратиться.
Эра 2.4 (из первого сообщения), новее не нашёл.
Возвращается автоматически выделенный ID массива. Автоматические выделенные ID или слоты начинаются с -2 и являются отрицательными числами. Дальше
Хмм... действительно, ошибка в другом. Даже не знаю Эра тут виновата или нет, но такого быть не должно. Вот мой код:
Получилось обойти этот загадочный баг вот таким костылём:
Ну и не говоря о том, что в ЕРМ = и ? в FU:P работают исключительно с v-переменными, но это уже проблема Вога, а не Эры.
y-переменные затираются раньше, чем выполняется P?[...]. Это известная вещь, исправлена в 3.59.
x1..x16 тоже глобальные, так что ?x1 довольно опасно.
Как скопировать строковое значение из массива в массив напрямую? Потому что как-то мало толку от длинных строк если их нельзя получить кроме как через z-переменную.
Знаю, но в настоящий момент никак. Ну то бишь нужно написать несложную функцию. Добавлять подстроки с 2.46 стало легко:
Code:
[+] Added new modifier syntax for SN command parameters:
SN:X$ (without &), SN:M#/$, SN:M#/#/$, SN:W#/$.
Traditional "d" adds 0 or empty string, d[...] is equivalent to d+.
d+, d-, d*, d:, d& (string concatenation).
Example: !!SN:W^Gold^/y1 W^Gold^/d-500 W^Gold^/d*11 W^Gold^/d:10; Gold = y1 -500 * 1.1
Код для копирования длинной строки в другую длинную ниже:
Quote:!?FU(array item to item copy);
; x1 - array 1 ID (source)
; x2 - array 1 index (source)
; x3 - array 2 ID (destination)
; x4 - array 2 index (destination)
!!SN:Mx1/?y1/x2 Ky1/?y2; y1 - source] string address, y2 - string length
!!if&y2=0:;
!!SN:Mx3/x4/^^; zero length string
!!el:;
!!VRy3:Sy2 :4 +1; y3 - length of buffer in integers
!!SN:M-1/y3/0/0; allocate temporal array
!!VRy4:Sv1; y4 - temporal array
!!SN:My4/?y5/0; y5 - temporal buffer address
!!SN:Ky2/y1/y5; copy source string to temporal buffer
!!VRy6:Sy5+y2; y6 - address of terminating byte
!!UN:Cy6/1/0; write terminating byte
что за ерунду я пишу? )
!!en:;
(09.09.2014 00:31)Berserker Wrote: [ -> ]команды Эры, принимающие строки, одинаково хорошо переваривают и адреса pchar-ов
О, точно то что надо. Спасибо.
igrik, да нет )
Все команды Эры получают параметры в виде 4-байтовых чисел. Для строк это обычно адрес первого символа. Когда ты пишешь z1, команда получает адрес ЕРМ-переменной. Когда ^hello^, строка сперва сохраняется во временном буфере, затем команде передаётся её адрес, после чего буфер освобождается.
!!SN:M(src array)/?y1/(src index); записывает в y1 адрес первого символа строки в указанном массиве
!!SN:M(dst array)/(dst index)/y1; устанавливает новое значение элемента массива. Команде передаётся адрес строки )
Таким образом, длинные строки (> 512 байт) можно копировать между собой и использовать как буфер для накопления:
!!SN:M../../d&^ соединение строк^;
Вот ещё баг. Эра не понимает ссылки на переменные типа zx4. Например, вот эта команда не работает:
Ещё мод WoG Rus требует Secondary Skills Scrolling (иначе игра вылетает при открытии окна героя), про это нигде не сказано.