Current time: 25.11.2024, 12:49 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Ваши вопросы по ERM-скриптам
Author Message
Berserker Offline
Administrators

Posts: 16657
Post: #5371

Одноуровневый список нужен. Для каждой водной клетки в !?PO в одном из полей, где можно хранить значения до 65536 кодировать y * 256 + x координату следующей водной клетки, полагая 0 концом списка. Убедиться, что данное PO-поле для водных объектов или сундуков другими скриптами не используется.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.08.2019 17:20
Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 325
Post: #5372

Berserker, Все-таки только через PO? Я уже думал над этим, но мне не нравится падение совместимости, так как я использую много скриптов. Отлавливать баги потом очень геморрно. Ну ладно, на худой конец попробую так, а то я тут на XXL рандомах поиграться решил, а там восемь игроков, за каждого этот чертов таймер...
В общем, спасибо.


The dreams you kill will break your heart
17.08.2019 19:45
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5373

Можно и через SN:M
1) Подсчитать число водных клеток
2) Выделить массив из N целых чисел (каждое 4 байта) с постоянным хранением.
3) В каждом элементе массива хранить закодированные: координаты водной клетки + индекс следующего элемента массива.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.08.2019 00:49
Find all posts by this user Quote this message in a reply
slater777 Offline

Posts: 136
Post: #5374

Можно через команду !!VRy:Rx делать выборку через интервал? Интересует рандом из 4 чисел: 6,8,10,12.
Вот, как видится на первый взгляд:
!!VRy1: S6 +R6; но тогда в выборку попадут и 7, и 9, и 11. Можно ли ввести какую-то переменную?

UPD: В приципе, решил проблему вот так. Если есть более элегантные решения, дайте знать Sm
(This post was last modified: 18.08.2019 13:55 by slater777.)
18.08.2019 13:22
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5375

!?PI;
!!FU(ClearSimultaneousAnimationsVars):P;

!?FU(ClearSimultaneousAnimationsVars);
!!SN:W^SimulAnim0^/0;
!!SN:W^SimulAnim1^/0;
!!SN:W^SimulAnim2^/0;
!!SN:W^SimulAnim3^/0;
!!SN:W^SimulAnim4^/0;
!!SN:W^SimulAnim5^/0;
!!SN:W^SimulAnim6^/0;
!!SN:W^SimulAnim7^/0;
!!SN:W^SimulAnim8^/0;
!!SN:W^SimulAnim9^/0;
!!SN:W^SimulAnim10^/0;
!!SN:W^SimulAnim11^/0;
!!SN:W^SimulAnim12^/0;
!!SN:W^SimulAnim13^/0;
!!SN:W^SimulAnim14^/0;
!!SN:W^SimulAnim15^/0;
!!SN:W^SimulAnim16^/0;
!!SN:W^SimulAnim17^/0;
!!SN:W^SimulAnim18^/0;
!!SN:W^SimulAnim19^/0;
!!SN:W^SimulAnim20^/0; not used
!!SN:W^SimulAnim21^/0;
!!SN:W^SimulAnim22^/0;
!!SN:W^SimulAnim23^/0;
!!SN:W^SimulAnim24^/0;
!!SN:W^SimulAnim25^/0;
!!SN:W^SimulAnim26^/0;
!!SN:W^SimulAnim27^/0;
!!SN:W^SimulAnim28^/0;
!!SN:W^SimulAnim29^/0;
!!SN:W^SimulAnim30^/0;
!!SN:W^SimulAnim31^/0;
!!SN:W^SimulAnim32^/0;
!!SN:W^SimulAnim33^/0;
!!SN:W^SimulAnim34^/0;
!!SN:W^SimulAnim35^/0;
!!SN:W^SimulAnim36^/0;
!!SN:W^SimulAnim37^/0;
!!SN:W^SimulAnim38^/0;
!!SN:W^SimulAnim39^/0;
!!SN:W^SimulAnim40^/0;
!!SN:W^SimulAnim41^/0; not used

Вся эта простыня кода не нужна. Все несуществующие SN:W переменные возвращают 0 или ^^ как значение по умолчанию.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.08.2019 13:22
Find all posts by this user Quote this message in a reply
Chaomen Offline

Posts: 59
Post: #5376

Это отлично, спасибо.
18.08.2019 17:07
Visit this user's website Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 325
Post: #5377

Berserker, у меня пока выходит вот такой код для создания массива, хранящего координаты клеток с водой.


Я на верном пути? Нужно ли присваивать слотам уникальные номера, как узнать, какой диапазон можно использовать?
Я так понимаю, можно проще, если использовать для хранения слоты с меньшим кол-вом элементов, закодировав координаты. Не понял, зачем нужен индекс следующей клетки.


The dreams you kill will break your heart
(This post was last modified: 18.08.2019 18:10 by ElfbI.)
18.08.2019 18:01
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5378

Приведу псевдокод:

Code:
Кол-во клеток воды = 0

; Первый проход, считываем число клеток воды
Полный цикл по всем уровням карты
  Полный цикл по всем клеткам уровня
    Если клетка — вода
      Кол-во клеток воды += 1
    Конец
  Конец
Конец

!!SN:M-1/кол-во клеток воды/0/1; Создаём массив чисел по числу клеток воды (все 0), v1 = новый уникальный индекс слота
!!SN:W^water_list^/v1; сохранили индекс слота

слот = W^water_list^
i = 0

Полный цикл по всем уровням карты
  Полный цикл по всем клеткам уровня
    Если клетка — вода
      УпакованныеКоординаты = z * 65536 + y * 256 + x
      !!SN:Mслот/i/УпакованныеКоординаты;
      
      i += 1
    Конец
  Конец
Конец

Пусть даны три водяные клетки на карте с координатами (5, 14, 0), (10, 7, 0), (27, 18, 1).
В конце выполнения кода для трёх водяных клеток на карте имеем массив из 3-х элементов.
[0 * 65536 + 14 * 256 + 5, 0 * 65536 + 7 * 256 + 10, 1 * 65536 + 18 * 256 + 27]

Для прохода по всем водным клеткам выполняется цикл

От i = 0 до !!SN:Mслот/?y1 выполнять
  !!SN:Mслот/i/?УпакованныеКоординаты; получили координаты водной клетки
  !!VRy4:SУпакованныеКоординаты:65536; получили z-координату
  УпакованныеКоординаты -= y4 * 65536
  !!VRy3:SУпакованныеКоординаты:256; получили y-координату
  УпакованныеКоординаты -= y3 * 256
  !!VRy2:SУпакованныеКоординаты; получили x-координату
  ; Проверить, нет ли сундука по y2/y3/y4
Конец


SN:M-1 выделить новый свободный отрицательный слот.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.08.2019 18:53
Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 325
Post: #5379

Berserker,
блин, я понял, мой косяк, что я выделяю N слотов под каждую клетку воды с размером 3 (хуl), вместо того, чтобы выделить 1 слот с размером N, и работать с содержимым слота размером (0...N), так?

Про упаковку координат все очевидно, просто не очень хотелось запариваться с формулами)


The dreams you kill will break your heart
18.08.2019 19:17
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5380

Да, один массив нужен.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.08.2019 19:51
Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 325
Post: #5381

Berserker, отлично просто! Еще и в новой для меня SN:M команде разобрался. Вы мне очень помогли!


The dreams you kill will break your heart
18.08.2019 20:00
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5382

Рад был помочь Ab
Спасибо, реквизиты для поддержки проекта обязательно опубликую сегодня-завтра.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.08.2019 20:37
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5383

ElfbI, пробовали новую команду для установки описания существам?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
19.08.2019 01:57
Find all posts by this user Quote this message in a reply
Igor Offline

Posts: 140
Post: #5384

Написал скрипт для определения расстояния между 2мя гексами на поле боя. А как можно и можно ли из него сделать функцию чтобы не дублировать его целиком в каждом скрипте? Функциями пользовался но никогда их не писал. Или такая функция уже есть?
19.08.2019 20:08
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #5385

Писал когда-то на паскале:
Code:
FUNCTION CalculateDistance (SrcPos, DstPos: INTEGER): INTEGER;
VAR
  DistanceX:  INTEGER;
  DistanceY:  INTEGER;
  x1, x2:     INTEGER;
  y1, y2:     INTEGER;

BEGIN
  x1  :=  SrcPos MOD BATTLEFIELD_LINE_SIZE;
  y1  :=  SrcPos DIV BATTLEFIELD_LINE_SIZE;
  x2  :=  DstPos MOD BATTLEFIELD_LINE_SIZE;
  y2  :=  DstPos DIV BATTLEFIELD_LINE_SIZE;

  DistanceY :=  ABS(y1 - y2);
  DistanceX :=  ABS(x1 * 2 - (y1 AND 1) - x2 * 2 + (y2 AND 1)) - DistanceY;
  
  RESULT  :=  (DistanceY * 2 + Math.Max(DistanceX, 0)) DIV 2;
END; // .FUNCTION CalculateDistanc

Может быть кто придумает проще.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
19.08.2019 23:05
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group