Как сделать?
…
Farfignugen:
И в итоге надо получить что бы бойцы сортировались по рейтингу и им присваивались в массив места и все это отображалось как то так.
Как я понял, тебе нужно отсортировать один массив, а позже перетасовать другие массивы соответственно первому. Для этого я специально писал две функции:
Spoiler
! array.sort
$args[0] = $args[0] & ! название сортируемого массива. Может сортировать как текстовые значения, так и числовые
$args[1] = $args[1] & ! параметр, который указывает в какую сторону сортируется массив. 'up' или '' - значения будут располагаться от большего к меньшему 'down' - значения будут располагаться от меньшего к большему.
$args[2] = $replace($args[2],'$') & ! имя массива, в который будут помещены номера элементов исходного массива в порядке сортировки
if $args[3]='': $args[3] = $args[0] & ! имя массива, в который будут помещены результаты сортировки. Т.е. отсортированные значения можно поместить в другой массив, не трогая исходный. Если не указать, результат сортировки будет помещён в исходный массив.
killvar 'easy_math_sort_array'
killvar 'easy_math_copy_array'
if instr($args[0],'$')=1: $args['$']='$' else $args['$']=''
copyarr $args['$']+'easy_math_copy_array',$args[0]
if $args[2]!'':
args['i']=0
:for
if args['i']<arrsize($args['$']+'easy_math_copy_array'):
easy_math_sort_array[args['i']]=args['i']
args['i']+=1
jump 'for'
end
end
args['i'] = 0
:prohody
if args['i']<arrsize($args['$']+'easy_math_copy_array'):
args['j']=args['i']
:sorting
if args['j']<arrsize($args['$']+'easy_math_copy_array'):
dynamic "if (<<$args['$']>>easy_math_copy_array[args[0]] < <<$args['$']>>easy_math_copy_array[args[1]] and ($args[2]='' or $args[2]='up')) or (<<$args['$']>>easy_math_copy_array[args[0]] > <<$args['$']>>easy_math_copy_array[args[1]] and $args[2]='down'):
<<$args['$']>>args['tmp'] = <<$args['$']>>easy_math_copy_array[args[0]]
<<$args['$']>>easy_math_copy_array[args[0]] = <<$args['$']>>easy_math_copy_array[args[1]]
<<$args['$']>>easy_math_copy_array[args[1]] = <<$args['$']>>args['tmp']
if $args[3]!'':
args['temp'] = easy_math_sort_array[args[0]]
easy_math_sort_array[args[0]] = easy_math_sort_array[args[1]]
easy_math_sort_array[args[1]] = args['temp']
end
end",args['i'],args['j'],$args[1],$args[2]
args['j']+=1
jump 'sorting'
end
args['i']+=1
jump 'prohody'
end
if $args[2]!'': copyarr $args[2],'easy_math_sort_array'
copyarr $args[3],$args['$']+'easy_math_copy_array'
killvar 'easy_math_sort_array'
killvar $args['$']+'easy_math_copy_array'
Не смотри, что громоздко, это только на первый взгляд. На самом деле код, выполняющий сортировку не такой уж и большой. В основном, перед ним, и после, находятся разные проверки и защита от дурака. Следующая программа, используя результаты из первой, переставит элементы других массивов на новые “правильные” места:
Spoiler
! array.retape
$args[0] = $args[0] & ! массив, элементы которого нужно перетасовать
$args[1] = $replace($args[1],'$') & ! массив, в который внесены номера элементов отсортированного массива (в его изначальном варианте) в порядке сортировки.
if $args[2] = '': $args[2] = $args[0] & ! имя массива, в который можно сохранить результат перетасовки. Можно не указывать, тогда результаты сохранятся в исходный массив.
killvar 'easy_math_sort_array'
killvar $args['$']+'easy_math_copy_array'
if instr($args[0],'$')=1: $args['$']='$' else $args['$']=''
copyarr 'easy_math_sort_array',$args[1]
args['i']=0
:for
if args['i'] < arrsize('easy_math_sort_array'):
dynamic $args['$']+"easy_math_copy_array[args[0]] = "+$args[0]+"[args[1]]",args['i'],easy_math_sort_array[args['i']]
args['i']+=1
jump 'for'
end
copyarr $args[2],$args['$']+"easy_math_copy_array"
Теперь для наглядности, пример:
Spoiler
reit[0]=15
reit[1]=10
reit[2]=25
$arm[0]='might'
$arm[1]='sparrow'
$arm[2]='hand'
pow[0]=333
pow[1]=444
pow[2]=55
gs 'array.sort','reit','down','res_array'
! {результат получится такой:
reit[0]=10
reit[1]=15
reit[2]=25
res_array[0]=1
res_array[1]=0
res_array[2]=2
! переставляем элементы в других массивах:}
gs 'array.retape','$arm','res_array'
gs 'array.retape','pow','res_array'
! {результат:
$arm[0]='sparrow'
$arm[1]='might'
$arm[2]='hand'
pow[0]=444
pow[1]=333
pow[2]=55
! res_array теперь можно уничтожить}
killvar 'res_array'
Т.е. был у нас герой с рейтингом 10, и стоял он на второй строчке хитпарада, владел оружием ‘sparrow’ и силой 444, мы переместили его на верхнюю строчку и он сохранил за собой и “оружие” и “силу”. :)
Nex,
Спасибо, я попробую так сделать…
А переменная мне нужна была, что бы сделать предмет численным, как тут быть тогда?
В запасе имеется <<mistloot>> шт.
Тогда вот так:
IF astraluck = 1:
astraloot = rand(1, 25)
IF astraloot = 13:
mistloot = mistloot + 1
MSG "В результате Ваших действий ..."
IF NO OBJ "Материя мироздания":
ADDOBJ "Материя мироздания"
END
END
END
Вообще MSG лучше не использовать. Это распространённая ошибка начинающих авторов.
Nex,
Спасибо за помощь :cool:
На счёт MSG приму к сведению.
Такой вопрос, товарищи.
Пишу под AeroQSP нужно чтобы при нажатии на стрелку в окне основного описания изменялось значение переменной и обновлялось собственно описание.
Spoiler
*pl '<<pSTR>>'
*pl '<<pSPD>>'
*pl '<<pPER>>'
*pl '<<pINT>>'
*pl '<a href="EXEC:pSTR = pSTR + 1"> <img src="img/Вверх.jpg"> </a>'
*pl '<a href="EXEC:pSTR = pSTR - 1"> <img src="img/Вниз.jpg"> </a>'
Пока что он выводит значения переменных, изменяет их по нажатию на стрелки вверх и вниз, но не обновляет значения в окне.
Подвох в том, что не хочется использовать ссылки на действия.
Bumbr,
Добавь в ссылки переход на эту же самую локацию (gt $curloc). Должно выглядеть примерно так:
*pl '<a href="EXEC:pSTR = pSTR + 1 & gt $curloc"> <img src="img/Вверх.jpg"> </a>'
*pl '<a href="EXEC:pSTR = pSTR - 1 & gt $curloc"> <img src="img/Вниз.jpg"> </a>'
Нужно сделать таблицу где в первом столбце картинка 80х80 занимающая две строки, а во втором две строки с картинками 40х40
Spoiler
'<table>
<tr>
<td rowspan=2><a href="EXEC: gs $pl, $stattxt, $лицо"> <img src="<<$face>>Face<<face>>.jpg"></a></td>
<td><a href="EXEC: увел = 1 & хар = 5 & gt $curloc"> <img src="<<$int>>Влево.jpg"></a></td>
</tr>
<tr>
<td><a href="EXEC: увел = 0 & хар = 5 & gt $curloc"> <img src="<<$int>>Вправо.jpg"></a></td>
</tr>
</table>'
Приведенный код с точки зрения html вроде правильный, однако вторая картинка 40х40 переносится на следующую строку.
Проверил. Всё правильно выводит, вообще-то. Напутал я тут rowspan colspan, но нет. В классическом плеере нормально отображается. Только набирает переводов строк. Поэтому лучше построенную таблицу записывать в одну строку.
В классическом плеере и у меня правильно отображается. В этом вся суть проблемы, что написано правильно, а отображается - нет. Я не могу понять чем AeroQSP отличается от классики, что таблицы коверкаются.
Еще отметил что если при помощи colspan переместить картинки 40х40 под 80х80 то отображается всё корректно.
Еще столкнулся с тему, что не могу выставить MAINDESC_X=0 и MAINDESC_Y=0. Точнее выставить могу, но отображается всё, как при MAINDESC_X=3 MAINDESC_Y=3. Причём MAINDESC_X=1 MAINDESC_Y=1 и MAINDESC_X=-1 MAINDESC_Y=-1 отображаются правильно.
Очень тяжело даётся переход на AeroQSP.
Эти переменные нельзя выставить в значение 0. Возможно, это будет исправлено в следующих версиях.
‘<table>
<tr>
<td rowspan=2><a href=“EXEC: gs $pl, $stattxt, $лицо”> <img src=“<<$face>>Face<<face>>.jpg”></a></td>
<td><a href=“EXEC: увел = 1 & хар = 5 & gt $curloc”> <img src=“<<$int>>Влево.jpg”></a></td>
</tr>
<tr>
<td><a href=“EXEC: увел = 0 & хар = 5 & gt $curloc”> <img src=“<<$int>>Вправо.jpg”></a></td>
</tr>
</table>’
Здесь проблема в том, что нужно убрать переводы строк (вариант - выводить построчно через *p).
Пробелы непосредственно перед <img> лучше убрать.
“rowspan” в AeroQSP не поддерживается (но и в классике он тоже плохо поддерживается), поддерживается только “colspan”.
Byte:
Здесь проблема в том, что нужно убрать переводы строк (вариант - выводить построчно через *p).
Пробелы непосредственно перед <img> лучше убрать.
Ну это не такая уж большая проблема.
Данный код, оформленный в функцию, убирает переводы строк из текста и пробелы (в начале и в конце каждой строки):
! Присваиваем результату функции значение — переданный текст
$Result = $ARGS[0]
:метка_перебор_строк
! Ищем символ перевода строки
ARGS[0] = strpos($Result,'\n')
if ARGS[0]:
! Если перевод строки найден — вырезаем его
$Result = trim(mid($Result, 1, ARGS[0] - 1)) + trim(mid($Result, ARGS[0] + 1))
jump 'метка_перебор_строк'
end
У меня эта функция называется m2ts. Вызов функции, соответственно, выглядит так: $Текст=m2ts($Текст) или *NL m2ts($Текст). Если убирать пробелы не нужно, то достаточно убрать из кода все вызовы trim().
Olegus t.Gl. для этого можно использовать стандартную ф-ю REPLACE.
Byte:
Olegus t.Gl. для этого можно использовать стандартную ф-ю REPLACE.
Но с лидирующими и хвостовыми пробелами в строках она не справится.
Olegus t.Gl.:
Farfignugen:
И в итоге надо получить что бы бойцы сортировались по рейтингу и им присваивались в массив места и все это отображалось как то так.
Мне же нужно хранить данные массива в текстовом массиве и распределять эти массивы между собой по величине параметра рейтинг. Иначе я не смогу ни статистику вести бойцов, не вызывать нужные параметры.
Возможно тебе поможет модуль работы с таблицами данных. Я обновил версию, там как раз есть команда сортировки таблицы по нескольким колонкам.
Спасибо. У вас вообще отличные модули. Особенно модуль меню понравился. Удобная вещь.