Азгалор.
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 репутация
Отсюда и другие приколы. Решение - циклы должны быть не вложенными, а отдельными (думаю, вам не нужно показывать, как их разделить; проверка злых существ в злом цикле 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. и всё будет работать.