Форум HeroesWorld-а - Показать сообщение отдельно - Скрипты
Тема: Скрипты
Показать сообщение отдельно
#3451
Старый 23.08.2021, 10:07
  #3451
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1965
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1965
Выставка наград
По умолчанию
Re: Скрипты

Азгалор.
for e, enemy in enemy_creatures do
      for f, friend in friend_creatures do
	 if GetHeroCreatures(heroes, enemy) > 0 and GetHeroCreatures(heroes, enemy) <= 99 then
         reputation = reputation - 1
         sleep(1)
         elseif GetHeroCreatures(heroes, enemy) >= 100 then
         reputation = reputation - 2
         sleep(1)
	 elseif GetHeroCreatures(heroes, friend) > 0 then
         reputation = reputation + 1
            end
         end
      end

Банально пройдёмся вместе со счётчиком. Первая итерация цикла e,enemy in enemy creatures. В ней - цикл на 21 прокрут (внутренний цикл f, firend in friend_creatures). Проверка наличия злых существ идёт внутри внутреннего цикл, простите за тавтологию. А значит при наличии 1 существа из "злых" он проведёт одну и ту же проверку 21 раз, пока не закончится внутренний цикл! То есть за 1 злое существо списывается аж 21 репутация smile Отсюда и другие приколы. Решение - циклы должны быть не вложенными, а отдельными (думаю, вам не нужно показывать, как их разделить; проверка злых существ в злом цикле for, проверка хороших - в хорошем цикле for.

Есть и более элегантное решение. Первое. Создадим глобальную таблицу "репутация", через которую будем вести привязку всех переменных и таблиц. Все id внести в одну таблицу с именованными полями:

reputation = {}
reputation.heroes = {'Валерия', 'Ласло'}
reputation.value = 1--Значение репутации
reputation.creatures = {
[1] = {id = 1, mode = 'good', rep_decline = {['<100'] = +1, ['>100'] = +2},},
[2] = {id = 2, mode = 'good', rep_decline = {['<100'] = +1, ['>100'] = +2},},
[3] = {id = 101, mode = 'bad', rep_decline = {['<100'] = -1, ['>100'] = -2},},
[4] = {id = 114, mode = 'bad', rep_decline = {['<100'] = -1, ['>100'] = -2},},
[5] = {id = 98, mode = 'bad', rep_decline = {['<100'] = -1, ['>100'] = -2},},
--И так далее
}



Так мы сможем варьировать влияние на репутацию для каждого отдельного существа.

function reputation.condition()
for n, hero in reputation.heroes do
  for key, cr_properties in reputation.creatures do
     if GetHeroCreatures(hero, cr_properties.id)>0 and GetHeroCreatures(hero, cr_properties.id)<100 then
       reputation.value = reputation.value + cr_properties.rep_decline['<100']
     elseif GetHeroCreatures(hero, cr_properties.id)>100 then
       reputation.value = reputation.value + cr_properties.rep_decline['>100']
     end
  end
end

При таком решении даже не нужно поле "хороший/плохой", но для наглядности пусть присутствует. Соответственно, через глоабльную таблицу reputation создаём таблицу влияния на репутацию посещения зданий (таким же Макаром); пишем функцию для триггеров касания всех этих объектов. Ключами в полях таблицы здания будут не 1,2,3,итд, как выше, а имена зданий.

reputation.buildings = {
['ИмяЗдания1'] = {rep_decline = +100},
['ИмяЗдания2'] = {rep_decline = -200},
['ИмяЗдания3'] = {rep_decline = +55},
--И так далее
}

function reputation.buildings_visit(hero,obj)
  reputation.value = reputation.value + reputation.buildings[obj].rep_decline
end

function reputation.building_triggers()
  for name, prop in reputation.buildings do
    Trigger(OBJECT_TOUCH_TRIGGER, name, 'reputation.buildings_visit')
  end
end

--Не забудем вызвать "навешивание" триггеров. Оно будет идти автоматически для всех объектов, указанных в таблице
reputation.building_triggers()

Такие глобальные таблицы нужны, чтобы при больших объёмов скриптов не пересекались названия переменных. При желании, можете абсолютно везде выше стереть строчки reputation. и всё будет работать.

__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием