Botojan, могу дать только пару замечаний, не знаю насколько они критичны конкретно в вашем случае.
if newowner == PLAYER_1 == nil then
Не рекомендую использовать такой зубодробительный синтаксис. Велика вероятность ошибиться.
""Bobruisk"", ""TownCaptured""
Совсем не уверен, будут ли корректно обрабатываться такие двойные-двойные кавычки.
for i = 1, 14 do
total = total + GetHeroCreatures( heroname, i ) * costs[i];
end;
Привязка к замку ордена порядка заключается в пределах цикла 1, 14 - это идентификаторы существ данного замка. Ищите нужные вам идентификаторы в документации.
AddHeroCreatures( heroname, 15 + i, factor[i + 15] * coeff );
Аналогично, магическое число 15 это сдвиг к идентификаторам существ демонов.