Текущее время: 15 сен 2019, 22:14



Ответить на тему  [ Сообщений: 10 ] 
Помогу со скриптами 
Автор Сообщение
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Помогу со скриптами
В своё время на портале sudden-strike.ru тема пользовалась большой популярностью и давно назрела необходимость её реанимировать.
Перед тем, как задать вопрос - НАСТОЯТЕЛЬНО рекомендуется ВНИМАТЕЛЬНО прочитать следующее:
Разработка карт
Разработка миссий
Логические команды
Руководство пользователя Sudden Strike 2 (Противостояние 4)
Сохранённая часть темы с портала sudden-strike.ru
Особенности движка и редактора

Теперь несколько аксиом:
    1. Все скрипты работают
    2. Если скрипт не работает - то Вы ошиблись
    3. Скриптам всё равно, что думаете Вы - у них свой "процессор"
    4. Если Вы и скрипты "думаете" различно - проверьте, правильно ли Вы реализовали свою идею в уловиях
    5. Скрипты "читаются" постоянно, последовательно сверху вниз. После считывания крайнего пороцесс повторяется.
    6. Игра не "тормозит" от большого количества скриптов.
      В движке нет ограничений на количество. (возможно! это и не так, но Вы НИКОГДА не напишете их столько, чтобы это проверить).
      ~5000 скриптов обрабатываются движком за 2-4 сек. (в зависимости от мощности компьютера).
    7. Не используйте одинаковые условия в двух (и более) скриптах.
      Если какой-либо параметр задействован в нескольких, добавьте еще один (во ВСЕ скрипты, где он присутствует) использовав логический оператор "И".
      Строго говоря, это не обязательно, но потом не "dash2" на "не работает" или "работает не так".
    8. Старайтесь избегать "жестких" условий - и Вы "закроете" 50% проблем.
    9. Не стройте миссию линейно (всегда просчитывайте и прописывайте в скриптах ВСЕ варианты).
      Вам же не придется потом писать, что миссия не завершается, т.к. игрок свернул "у того столба" направо, а не на лево.
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


05 июл 2017, 16:38
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Если всё же что-то у вас не работает, то ЕДИНСТВЕННО правильным алгоритмом Ваших дествий должно быть следующее:
    1. Проверяем, что условие выполняется
    2. Проверяем, что реакция (ответ на условие) выполняется

По какой-то странной (мне не понятной) причине люди, которые обращаются за помощью НЕ СЛЫШАТ того, что им говорят и на вопрос "проверил ли ты условие" отвечают: "ну как же, ведь у меня..... бла-бла-бла!"
По п.1 именно ПРОВЕРЯЕМ, а не думаем: ну, у меня же .... - т.е. получаем ОТ ДВИЖКА подтверждение.
Как это сделать?
В самом простом варианте (если условие простое, т.е. односложное - просто вывести сообщение (например, с именем скрипта) - убрав при этом всё остальное, типа ...отправить ... завести ... и пр.
Если условий несколько и простого вывода сообщения не достаточно (Вы его не видете) - разбейте свой скрипт на несколько (по кол. условий) и проверьте каждое отдельно.

Бывает крайне полезно отслеживать в реальном времени какие-либо условия (что, кстати, поможет Вам еще и понять логику работы скриптов). Например, у Вас скрипт с условием:
Юнитов гр."A1">0 в зоне z01 и юнитов гр."B1">0 в зоне z02 и юнитов гр."C1">0 в зоне z03[/i]
    => сделать что-то
и Вы хотите отслеживать их наличие в указанных зонах. Для этого добавляем три скрипта непоследственно ПЕРЕД своим
    1. Юнитов гр."A1">0 в зоне z01
      => сказать фразу {текст}=A1>0 в зоне 01
    2. Юнитов гр."B1">0 в зоне z02
      => сказать фразу {текст}=B1>0 в зоне 02
    3. Юнитов гр."C1">0 в зоне z03
      => сказать фразу {текст}=C1>0 в зоне 03
ВАЖНО! Тестовые ообщения лучще располагать внизу списка, начиная с самого крайнего - так Вы не затронете свои (из самой миссии) тексты.
Теперь у Вас постоянно будет "бежать" столбик с сообщениями:
    A1>0 в зоне 01
    B1>0 в зоне 02
    C1>0 в зоне 03
Если какого-то из сообщений не появилось - условие не выполняется (т.е. юнитов группы в зоне нет)

Более сложный вариант: нам надо отслеживать ИЗМЕНЕНИЯ состояния (условия), т.е., например, изменение наличия (или количества) юнитов гр."A1" в зоне 01. Для этого воспользуемся ячейками для "запоминания" текущего состояния нашего условия. Пишем:
    1. Начало миссии
      => занести в ячейку с01 число 99
    2. Юнитов гр."A1"=0 в зоне z01 и НЕ верно, что число в ячейке с01=0
      => занести в ячейку с01 число 0
      => сказать фразу {текст}=A1=0 в зоне 01
    3. Юнитов гр."A1">0 в зоне z01 и НЕ верно, что число в ячейке с01=1
      => занести в ячейку с01 число 1
      => сказать фразу {текст}=A1>0 в зоне 01
Третий скрипт можно заменить на такие:
    3. Юнитов гр."A1"=1 в зоне z01 и НЕ верно, что число в ячейке с01=1
      => занести в ячейку с01 число 1
      => сказать фразу {текст}=A1=1 в зоне 01
    4. Юнитов гр."A1"=2 в зоне z01 и НЕ верно, что число в ячейке с01=2
      => занести в ячейку с01 число 2
      => сказать фразу {текст}=A1=2 в зоне 01
    5. Юнитов гр."A1"=3 в зоне z01 и НЕ верно, что число в ячейке с01=3
      => занести в ячейку с01 число 3
      => сказать фразу {текст}=A1=3 в зоне 01
    6. Юнитов гр."A1">3 в зоне z01 и НЕ верно, что число в ячейке с01=4
      => занести в ячейку с01 число 4
      => сказать фразу {текст}=A1>3 в зоне 01
И тогда мы будем видеть сообщения о кол. юнитов в зоне только при изменении этого количества + будем знать сколько именно их там находится.
ВАЖНО! Обратите внимание на отличие скрипта №6 (крайнего) от остальных.

Подобную систему можно использовать для контроля ЛЮБЫХ условий - все зависит только от Вашей фантазии.
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


05 июл 2017, 17:26
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Добавил файлик:
Некоторые особенности движка и редактора
Полезно знать при работе с редактором и создании своих карт/миссий (будет дополняться).
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


13 июл 2017, 13:26
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
К сожалению, в игре отсутствует генератор случайных чисел (точнее, в самом движке он есть и активно используется, но вот в редакторе - не доступен). И для картодела становится проблемой выполнение некоторых действий "случайно", вне зависимости от поведения игрока. Привязка же к одному или даже нескольким конкретным действиям игрока, как правило, не дают желаемого результата.

Естественно, на любой карте есть войска как игрока, так и противника Что важно: если действия компа во многом зависят от нас, то как будет строить оборону и проводить наступление игрок предугадать обычно не всегда возможно. Кроме того, для решения своих задач мы используем зоны на карте. Вот эти два элемента (зоны и перемещения юнитов игрока) мы и задействуем!
Прежде всего определимся с необходимой вариативностью (т.е. с размером числового ряда, достаточного нам для операций). Для примера выберем 50. Далее мы выделяем под работу генератора две ячейки (одна у нас будет переменной, а вторая самим рабочим оператором).
Смысл дальнейших действий сводится к следующему: в зависимости от обстоятельств суммировать некие числа в переменной. На что тут необходимо обратить особое внимание:
    1. Начинать работу скриптов именно с генератора, т.е. он должен отработать ДО того, как пойдут все Ваши скрипты (иными словами - находиться сверху)
    2. Генератор должен работать постоянно, т.е. на КАЖДОМ проходе просмотра скриптов. На самом деле не обязательно делать это постоянно, более того: иногда даже вредно (в зависимости опять-таки от потребностей. В помощь тут циклический будильник для выполнения работы раз в 10 сек... 1мин... 5 мин... - кому как надо.
    3. В конце каждого прохода сохранять результат своей работы (в ячейке, которую мы и будем использовать для своих реакций).
    4. Обеспечить разовую отработку скриптов на каждом проходе.
Теперь примеры. Скажем, у нас будет:
С1 - переменная
С2 - вывод итога
С3 - счетчик
Далее пишем:
    число в ячейке С3 точно 1 => добавить в ячейку С1 количество юнитов в группе А0 + увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 2 => добавить в ячейку С1 количество юнитов в группе А1 + увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 3 => добавить в ячейку С1 количество юнитов в группе А2 + увеличить число в ячейке С3 на 1
и т.д. для всех групп, которые у нас есть или для части (на Ваш выбор)
    1 замечание: НАСТОЯТЕЛЬНО не рекомендую использовать вычитание - движек ведёт себя непредсказуемо с отрицательными числами!
    2 замечание: кто-то скажет, что использовать тут С3 нет обязательно, но такой подход ко всему позволит исключить любые неопределённости, и в итоге - избавит от ошибок.
    3 замечание: использование скрипта добавить в ячейку количество юнитов в группе даёт компактность всей конструкции, но никак не завязано на зоны, т.е. при отсутствии боевой движухи мало что даст;
Можно сделать так:
    число в ячейке С3 точно 1 и юнитов группы А1 в зоне 5 больше, чем 0 => увеличить число в ячейке С1 на число 5 + увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 2 и юнитов группы А1 в зоне 8 больше, чем 0 => увеличить число в ячейке С1 на число 8 + увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 3 и юнитов группы D3 в зоне 18 больше, чем 0 => увеличить число в ячейке С1 на число 18 + увеличить число в ячейке С3 на 1
и т.д. для всех групп и зон, которые хотим учитывать
Самый качественный подсчёт даст следующий метод:
    число в ячейке С3 точно 1 и юнитов группы А1 в зоне 5 точно 0 => увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 1 и юнитов группы А1 в зоне 5 точно 1 => увеличить число в ячейке С1 на число 1+ увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 1 и юнитов группы А1 в зоне 5 точно 2 => увеличить число в ячейке С1 на число 2 + увеличить число в ячейке С3 на 1
... и так до максимального числа юнитов в группе А1, потом то же для всех других зон:
    число в ячейке С3 точно 2 и юнитов группы А1 в зоне 8 точно 0 => увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 2 и юнитов группы А1 в зоне 8 точно 1 => увеличить число в ячейке С1 на число 1+ увеличить число в ячейке С3 на 1
    число в ячейке С3 точно 2 и юнитов группы А1 в зоне 8 точно 2 => увеличить число в ячейке С1 на число 2 + увеличить число в ячейке С3 на 1
и т.д.
Вообще говоря, так можно обсчитать практически любые действия на карте и суммировать результат в ячейке.
В заключении осталось выполнить некоторые арифметические действия:
- скажем, вариантов у нас получилось 78 (и значит крайнее значение С3 было 78)
- напомню - мы остановились на числе 50, поэтому надо "загнать" полученный результат в эти рамки и не потерять уникальности, для чего делаем следующее:
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 400 => уменьшить число в ячейке С1 на 400
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 200 => уменьшить число в ячейке С1 на 200
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 100 => уменьшить число в ячейке С1 на 100
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 50 => уменьшить число в ячейке С1 на 50
    число в ячейке С3 точно 79 => Занести в ячейку С2 число в ячейке С1 + Занести в ячейку С3 число 1
Всё! Теперь мы можем в скриптах оперировать значением в ячейке С2 (которое лежит в пределах от 0 до 50) и кроме того, добавлять произвольные числа в С1 в любых скриптах далее, что отразится в результате следующего прохода.
    1 замечание: значение С1 можно оставить (и суммировать дальше), а можно занулить - как хотите
    2 замечание: при уменьшении итогового значения С1 важно не скупиться и ГАРАНТИРОВАННО перекрыть возможный максимальный порог. Иначе вся работа в небо и работать ничего не будет
    3 замечание: начинать надо именно с максимального значения и ступень должна быть кратна двум, т.е.:
    при 20 получим числовой ряд: 1280/640/320/160/80/40/20
    при 50 получим числовой ряд: 3200/1600/800/400/200/100/50
    при 70 получим числовой ряд: 4480/2240/1120/560/280/140/70
И заключительное пояснение: что же нам делать с итогом (значением С2)?
Напомню: значение в ячейке - это точно такое же условие, как и все прочие. Причём мы можем использовать любые комбинации. Например:
    больше 0 и меньше 26 - даст 50% вероятность
    больше 0 и меньше 11 - даст 20% вероятность
    больше 20 и меньше 31 - даст 20% вероятность
    больше 37 и меньше 48 - даст 20% вероятность
    (больше 15 и меньше 24) или точно 31 или точно 43 - даст 20% вероятность
    точно 1 или точно 4 или точно 5 или точно 8 или 12 или 36 или 38 или 41 или 47 или 50 - тоже даст 20% вероятность
Словом, в качестве условия можно использовать ЛЮБЫЕ комбинации!

Обращаю Ваше внимание на 0!
Если мы напишем:
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 50 => уменьшить число в ячейке С1 на 50
то получим числовой ряд от 1 до 51 (т.е. 0 сюда не попадёт!)
Если же напишем:
    число в ячейке С3 точно 79 и число в ячейке С1 больше, чем 50 => уменьшить число в ячейке С1 на 51
то получим числовой ряд от 0 до 50 (т.е. в том числе и 0!)
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


14 июл 2017, 14:04
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Каждому опытному игроку известна такая "фишка": при острой нехватке пехоты можно задействовать имеющихся на карте животных. Конечно, это будет не полноценный боевой юнит, но в качестве орудийного расчета, наблюдателя в здании или даже разведчика-смертника - вполне подойдёт. Как правило, животные вводятся в миссии для антуража и обычно принадлежат группе "нейтрал", но ничто не мешает "переманить" их на свою сторону офицером или генералом. Как этого избежать?
Вариант, при котором такой юнит не имеет поведения мы даже не будем рассматривать, т.к. болванчик/статуя в виде коровы или овцы - это (на мой взгляд) запредельное неуважение к игрокам.
Если же они "живые" и имеют хоты бы минимальный набор поведения - значит имеют они и свою группу.
В этом случае блокировать использование игроком животных очень просто!
Допускаем, что наши коровки имеют группу B1 и принадлежат игроку "нейтрал" (это логично, поскольку их не станет расстреливать ни один из участников конфликта). Пишем простенький скрипт:

    (Более чем 0 юнитов игрока "игрок" в группе B1) или (Более чем 0 юнитов игрока "противник" в группе B1) или (Более чем 0 юнитов игрока "союзник" в группе B1) =>
    Передать группу B1 игроку "нейтрал"
    Установить поведение для группы B1 ....

Обращаю Ваше внимание на два момента:
    1. Настоятельно рекомендуется перечислить ВСЕХ игроков на карте.
    2. Необходимость ещё раз установить группе поведение после смены (принадлежности) игроку.
"Выключать" такой скрипт не надо, игра будет постоянно (при каждом проходе) проверять наличие указанной группы у всех других игроков и срабатывать ТОЛЬКО в случае, если таковых будет более нуля.
Удачи!
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


08 ноя 2017, 13:46
Профиль ICQ
Лейтенант
Аватар пользователя

Зарегистрирован: 12 янв 2012, 10:30
Сообщений: 3359
Сообщение Re: Помогу со скриптами
Я им просто высокую мораль и опыт ставлю - вроде прокатывает.
.
_________________
Изображение


09 ноя 2017, 10:40
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
kit писал(а):
Я им просто высокую мораль и опыт ставлю - вроде прокатывает.
Против лома (генерала) - нет приёма! "hunter"
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


09 ноя 2017, 14:21
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Каждый уважающий себя картодел стремится вдохнуть жизнь в своё творение. Одним из наиболее часто встречающихся приёмов (если, конечно, у нас не "Сталинград" и не упорное противостояние непосредственно на линии фронта) - размещение на карте животных. Для того, чтобы они не изображали собой статуи достаточно просто установить им поведение:
Пусть у нас будет группа А0 в зоне 01
Пехота охранять зону
    + "хаотично распределиться в зоне" - даст эффект именно "пасущегося" стада
    + (не забываем!) "не использовать незанятые орудия"
    + (не забываем!) "ПТО - не занимать, занятые покинуть"
    + (не забываем!) "здания не занимать"
Если мы к стаду добавим пастуха - будет ещё лучше:
Группа А1 в той же зоне 01
Пехота следовать за группой
    + "хаотично распределиться в зоне"
    + "случайно изменять преследуемый юнит"
    + (не забываем!) "не использовать незанятые орудия"
    + (не забываем!) "ПТО - не занимать, занятые покинуть"
    + (не забываем!) "здания не занимать"
Дополнительно ставим пастуху:
Взаимодействовать с группой А0
Взаимодействовать в зоне 01

Поведение можно установить как в свойствах группы, так и скриптом.
Теперь наши коровки будут пастись в указанной зоне, а пастух станет за ними бдительно следить! :)

Весьма важно (против особо хитрых игроков) добавить сюда и блокировку от захвата коров и пастуха (из поста выше):
(Более чем 0 юнитов игрока "игрок" в группе А0) или (Более чем 0 юнитов игрока "противник" в группе А0) или (Более чем 0 юнитов игрока "союзник" в группе А0) =>
    Передать группу А0 игроку "нейтрал"
    Установить поведение для группы А0
    => (дублируем установку поведения в скрипте)
Повторяем то же самое и для пастуха.

Вроде бы всё хорошо, но есть одна заковыка: если рядом начнётся бой и по стаду "прилетит" - коровы и рогами не поведут. Будем это исправлять и для создания более простой конструкции нам потребуются ячейки.
За состояние стада будет отвечать ячейка 0 и её значения, равные
0 - будет соответствовать нормальному состоянию
1 - поиску стада
2 - панике (атаке)
3 - отсутствию пастуха (бесконтрольному блужданию стада)

Для реализации при старте заносим в ячейку 0 значение 0

Пишем скрипт атаки на коров или пастуха:
число в ячейке 0 менее чем 2 и ( группа А0 атакована менее чем 10 сек. назад или группа А1 атакована мене чем 10 сек. назад ) =>
    Установить АИ зона 1 группы А0 в 2
    Установить АИ зона 1 группы А0 в 2
    Установить АИ поведение группы А0 в Пехота охранять зону
    Установить АИ зона 1 группы А1 в 2
    Установить АИ зона 1 группы А1 в 2
    Установить АИ поведение группы А1 в Пехота охранять зону
    занести в ячейку 0 число 2
При срабатывании этого скрипта стадо и пастух начнут разбегаться в панике.

Пишем скрипт отсутствия опасности для коров и пастуха:
число в ячейке 0 строго 2 и активных (на карте) юнитов в группе А1 более чем 0 и неверно что группа А0 атакована менее чем 10 сек. назад и неверно что группа А1 атакована мене чем 10 сек. назад=>
    Установить АИ зона 1 группы А0 в 1
    Установить АИ зона 1 группы А0 в 1
    Установить АИ поведение группы А0 в Пехота охранять зону
    Установить АИ зона 1 группы А1 в 2
    Установить АИ зона 1 группы А1 в 2
    Установить АИ поведение группы А1 в Пехота охранять зону
    занести в ячейку 0 число 1
При срабатывании этого скрипта стадо начнёт снова собираться в зоне 1, а пастух будет бегать от одной коровы к другой, имитируя попытки их найти/собрать вместе.

Пишем скрипт сбора коров в зоне выпаса:
число в ячейке 0 строго 1 и активных (на карте) юнитов в группе А1 более чем 0 и неверно что группа А0 атакована менее чем 10 сек. назад и неверно что группа А1 атакована мене чем 10 сек. назад и более чем 90% юнитов группы А0 в зоне 1=>
    Установить АИ зона 1 группы А1 в 1
    Установить АИ зона 1 группы А1 в 1
    Установить АИ поведение группы А1 в Пехота следовать за группой
    занести в ячейку 0 число 0
При срабатывании этого скрипта пастух побежит в зону 1 и опять будет бегать от одной коровы к другой.

Обращаю Ваше внимание на это:
Скрипт атаки на коров или пастуха:
число в ячейке 0 менее чем 2
Именно МЕНЕЕ! чем два - таким образом скрипт будет срабатывать на атаку против пастуха и стада в любой момент, независимо от того, в каком состоянии они находятся - просто пасутся или уже опять бредут на выпас!

ВАЖНО!
Скрипты блокировки переманивания стада и пастуха необходимо продублировать для ВСЕХ состояний (значений в ячейке 0), т.к. устанавливать поведение мы им будем также различное!

Всё. Вроде бы должно работать безупречно, но тут нас поджидает засада от ФГ: если корова или пастух будут СРАЗУ убиты (а не ранены), то скрипт "отсутствия опасности для коров и пастуха" сработает СРАЗУ, поскольку уже не будет на карте ни одного юнита, который бы был атакован более чем (сколько-то времени назад) - что разрушит нашу стройную конструкцию!

Вы можете предложить свои варианты, а можете просто фиксировать "падёж" в стаде. Для этого будем считать наших коровок (и пастуха) и в ячейке 2 и сравнивать их количество с сохранённым в ячейке 1. Коров у нас 6 + 1 пастух, добавляем в стартовый скрипт действие:
занести в ячейку 1 число 7
занести в ячейку 2 число 0


и напишем ещё один скрипт (подсчёта текущего количества)
Считаем коров и пастуха
число в ячейке 0 менее чем 3 (т.к. значение 3 соответствует смерти пастуха и менять при нём мы уже ничего не будем ) =>
    добавить к ячейке 2 число активных (на карте) юнитов в группе А0
    число в ячейке 2 увеличить на номер 1
    (добавляем пастуха)

Поместим его в самом верху, после стартового - он будет вести арифметику при каждом проходе
Теперь нам остаётся только изменить условия атаки стада:
число в ячейке 0 менее чем 2 и ( группа А0 атакована менее чем 10 сек. назад или группа А1 атакована мене чем 10 сек. назад или число в ячейке 2 менее, чем число в ячейке 1) =>
    Установить АИ зона 1 группы А0 в 2
    Установить АИ зона 1 группы А0 в 2
    Установить АИ поведение группы А0 в Пехота охранять зону
    Установить АИ зона 1 группы А1 в 2
    Установить АИ зона 1 группы А1 в 2
    Установить АИ поведение группы А1 в Пехота охранять зону
    занести в ячейку 0 число 2

    завести будильник 0 на 1 мин.
Теперь стадо разбежится даже в том случае, если бомбой убьет сразу всех, кроме кого-то одного!

Пишем скрипт для возобновления подсчёта
звенит будильник 0 и число в ячейке строго 0 =>
    занести в ячейку 1 значение ячейки 2
    выключить будильник 0
Теперь стадо будет собираться в случае, если после ранения кого-либо пройдёт более минуты + после смерти коровы пройдёт более минуты.
Вложение:
cattle.zip


У вас нет доступа для просмотра вложений в этом сообщении.
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


03 ноя 2018, 18:14
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Одним из наиболее важных условий правильной работы скриптов является уникальность условий в каждом конкретном случае (на самом деле это не совсем так: возможно использование абсолютно одинаковых условий в разных скриптах при совершенно различных реакциях, но это всё же особый разговор).
При большом количестве скриптов это становится проблемой. Вообще, независимо от количества скриптов и сложности миссии правильным решением будет использование блочной, или модульной структуры: когда за работу (действия) конкретной группы юнитов отвечает свой, независимый блок, никак не пересекающийся с другими блоками.
Тема эта очень обширна и охватить её одним разом невозможно, поэтому будем "погружаться" постепенно.
Допустим, у нас есть миссия (не важно, в процессе создания или практически готовая). Как типовой (и наиболее часто используемый) вариант: некая линия фронта, на которой и будут происходить бои. Опять же, как правило, имеется несколько зон, где ожидается атака игрока и имеется какое-либо противодействие со стороны AI.
Мы расширим имеющийся (не важно какой и как реализованный) функционал - добавив отдельный и универсальный модуль.

Начнём с того, что создадим "запрос о помощи": при старте миссии заносим в выбранную для этого ячейку (допустим, 10) число 0 - это у нас будет "вызов".
Каждый возможный участок (зону) условно закрепляем за своим числом. Например, у нас 5 зон (их номера не принципиальны, но для простоты пусть будут с 1 по 5, сопоставим им те же числовые значения) - т.е. значение будет "указателем" на источник опасности.
Как частность - можно и варьировать "степень" опасности, для 1 степени заносим значения 1-5, для второй - 11-15 и для третьей - 21-25 - например, в зависимости от "массовости" натиска (т.е. значение в ячейке у нас становится ещё и вариатором степени угрозы).

Далее есть нюанс: если миссия простая или Вы не предполагаете атаку на двух участках (т.е. мы не боимся, что в одном проходе по скриптам значение будет перезаписано) - делаем просто:

в уже имеющиеся скрипты на зону при атаке игрока в реакции просто добавляем:
    занести в ячейку 10 число х
    где х - значение, соответствующее зоне атаки

Если важно сохранять ВСЕ возможные варианты - немного усложняем:

копируем исходное условие (скрипт, первый - не трогаем!), а вот во вторую копию добавляем:
    в условие:
    И число в ячейке строго 0
    В реакцию же пишем только:
    занести в ячейку 10 число х
    где х - опять же, значение, соответствующее зоне атаки
    ВСЁ остальное удаляем!

На этом можно и закончить вводную часть - мы имеем маркер вызова, НИКАК не связанный с основным массивом нашей миссии (скриптов).
Для особо продвинутых можно добавить и "очередь" таких вызовов - это довольно просто:
Скажем, мы хотим хранить до трех запросов в перспективе. для этого выделяем три ячейки:
с10 (как основную)
с11 и с12 - как "очередь"
Все запросы при такой организации будут заноситься в ячейку с12 и далее, по мере освобождения (или отсутствия вообще) "смещаться" к основному (ячейка с10) маркеру. Для этого пишем простенький блок:
    число в ячейке с11 точно 0 и число в ячейке с12 больше 0 => занести в ячейку с11 значение с12
    число в ячейке с10 точно 0 и число в ячейке с11 больше 0 => занести в ячейку с10 значение с11

Таким образом, мы будем иметь в памяти до трёх вызовов о "помощи", которые можем использовать в дальнейшем на своё усмотрение.
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


13 дек 2018, 14:25
Профиль ICQ
Мл. Лейтенант

Зарегистрирован: 12 янв 2012, 05:22
Сообщений: 1768
Откуда: МВО
Сообщение Re: Помогу со скриптами
Итак, запрос у нас есть. Что же мы с ним будем делать?

Чип и Дейл спешат на помощь "pioneer"

Вариантов может быть множество, рассмотрим наиболее очевидные и схематично - т.е. пока без конкретной реализации поведения.
Условимся, что имеем мы три абстрактные блока скриптов, каждый из которых управляет свой группой и никак не связан с "основным течением" нашей миссии. Всё, что нам надо знать - такие группы есть и за их поведение отвечает какая-либо ячейка памяти (за каждую группу - своя). Допустим, у нас будет:
    с51 - 1 группа
    с52 - 2 группа
    с53 - 3 группа
Выглядит это так:
    с5Х = 0 - группа "отдыхает", т.е. не занята и готова помочь
    с5Х > 0 - группа "работает"
    Иногда бывает полезно отметить и "смерть" группы:
    с5Х = 99 - группа накрылась "медным тазом" (значение произвольное, не суть)

Обращаю внимание ещё раз: будем рассматривать ТОЛЬКО различные процедуры АКТИВАЦИИ помощи и варианты подхода к этому вопросу, о самой работе таких блоков - позже.

1 вариант (самый простой) - один запрос - одна помощь от одной группы:
    Число в ячейке с51 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с51 число с10
      занести в ячейку с10 число 0
    Число в ячейке с52 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с52 число с10
      занести в ячейку с10 число 0
    Число в ячейке с53 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с53 число с10
      занести в ячейку с10 число 0
В данном случае помощь придёт один раз от группы, которая свободна в данный момент и находиться ВЫШЕ (поэтому наиболее приоритетный вариант и надо указывать первым)
Если свободной группы нет - вызов будет висеть, пока его кто-то не примет или пока значение (зона запроса) не изменится - тут он тоже будет "висеть" до принятия, но уже на другую зону - тут зависит от Ваших настроек выше.

2 вариант (тоже простой), но помощь идет от ВСЕХ свободных групп:
    Число в ячейке с51 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с51 число с10
    Число в ячейке с52 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с52 число с10
    Число в ячейке с53 точно 0 и и число в ячейке с10 больше 0 =>
      занести в ячейку с53 число с10
    число в ячейке с10 больше 0 =>
      занести в ячейку с10 число 0
В данном случае на запрос откликнутся ВСЕ свободные группы, после чего запрос аннулируется (обратите внимание на последний скрипт). Это не вполне корректное решение, т.к. если заняты все группы - то не поможет никто.
Данная дилемма тоже решаема, но сложнее и мы не будем тут её рассматривать.

3 вариант (1 гибридный). При условии, что у нас варьируется "степень" опасности (и с10= 1-5 / 11-15 / 21-25). Сводится к тому, что каждая группа у нас среагирует ТОЛЬКО на свою степень опасности:
    Число в ячейке с51 точно 0 и и число в ячейке с10 больше 0 и число в ячейке с10 меньше 10 =>
      занести в ячейку с51 число с10
    Число в ячейке с52 точно 0 и и число в ячейке с10 больше 10 и число в ячейке с10 меньше 20 =>
      занести в ячейку с52 число с10
    Число в ячейке с53 точно 0 и и число в ячейке с10 больше 20 и число в ячейке с10 меньше 30 =>
      занести в ячейку с53 число с10
Тут группа 1 "побежит" при 1 степени натиска, группа 2 - при второй и группа 3 - при третьей. Как быть в случае, если никто не "побежал" - решать Вам. Можно так же, как и во втором варианте, просто отключить:
    число в ячейке с10 больше 0 =>
      занести в ячейку с10 число 0
Можно "ступенчато" понижать запрос и в конце его "вырубить" совсем:
    число в ячейке с10 больше 10 =>
      уменьшить значение в ячейке с10 на число 10
    число в ячейке с10 больше 0 и число в ячейке с10 меньше 10 =>
      занести в ячейку с10 число 0
Данный вариант страдает теми же недостатками, что и предыдущий - т.е. если заняты все группы - то не поможет никто.

4 вариант (2 гибридный). Так же варьируется "степень" (с10= 1-5 / 11-15 / 21-25). Сводится к тому, что каждая группа, среагировав - будет видоизменять степень запроса:
    Число в ячейке с51 точно 0 и и число в ячейке с10 больше 0 и число в ячейке с10 меньше 10 =>
      занести в ячейку с51 число с10
      занести в ячейку с10 число 0
    Число в ячейке с51 точно 0 и и число в ячейке с10 больше 10 =>
      занести в ячейку с51 число с10
      уменьшить значение в ячейке с10 на число 10
    Число в ячейке с52 точно 0 и и число в ячейке с10 больше 0 и число в ячейке с10 меньше 10 =>
      занести в ячейку с52 число с10
      занести в ячейку с10 число 0
    Число в ячейке с52 точно 0 и и число в ячейке с10 больше 10 =>
      занести в ячейку с52 число с10
      уменьшить значение в ячейке с10 на число 10
    Число в ячейке с53 точно 0 и и число в ячейке с10 больше 0 и число в ячейке с10 меньше 10 =>
      занести в ячейку с53 число с10
      занести в ячейку с10 число 0
    Число в ячейке с53 точно 0 и и число в ячейке с10 больше 10 =>
      занести в ячейку с53 число с10
      уменьшить значение в ячейке с10 на число 10
Характерен тем, что запрос будет "висеть" до тех пор, пока на найдётся свободная группа/группы для поддержки + возможна "отработка" нескольких групп по одному запросу одновременно или по мере освобождения.

Конечно, этим не ограничиваются возможности и варианты, всё зависит от Вашей фантазии, но, скорее всего, они будут различными производными от рассмотренных вариантов.
Ещё раз отмечу важный момент: построенная нами система вызовов НЕЗАВИСИМА от прочих условий, может быть расписана своим блоком скриптов (каждая!) и при этом находиться в любом месте.
Не забываем (во избежание проблем) занести в стартовом скрипте нули в нужные ячейки, в нашем случае:
    Начало миссии =>
      занести в ячейку с10 число 0
      занести в ячейку с51 число 0
      занести в ячейку с52 число 0
      занести в ячейку с53 число 0
      выключить это условие


Примечание к вар. 2 и 3
Отсутствие поддержки со стороны групп (когда все заняты) можно обойти, причём различными способами:
    - завести будильник (дать время на завершение их текущей "работы")
    - добавить ещё одну ячейку, в которой будем фиксировать факт активации помощи (заносить туда ненулевое значение) и уже только при наличии там какого-то числа "обнулять" запрос
    - расписать (усложнить) скрипты таким образом, чтобы они сами фиксировали факт активации
В целом, это несколько выходит за рамки нашей задачи сейчас и, скорее всего, только усложнит восприятие основного построения.

Продолжение следует ....
.
_________________
Изображение
Приумножая познания, приумножаешь и скорбь.....(с)


13 дек 2018, 18:44
Профиль ICQ
Показать сообщения за:  Сортировать по:  
Ответить на тему   [ Сообщений: 10 ] 

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware for PTF.
Русская поддержка phpBB