Доброго дня уважаемому населению форума.
Возможно, здесь есть те, кто сумеет понять код и подсказать.
Имеется игра Skyborn (версия 1.3, сделана на VX).
В ней есть несколько ошибок в скрипте боевой системы, из-за которых не срабатывают все виды процентных бонусов к урону.
(боевая система авторства Mithran, конкретно этот скрипт – "Master Damage Module")
Вроде как получилось эти ошибки поправить методом научного тыка и подстановкой кода из другого работающего куска, но:
1) нет уверенности, что поправки не будет давать каких-то странных побочных эффектов;
2) на моём уровне (не)понимания Ruby совершенно не ясно, почему последняя правка вообще работает.
Собственно, вот участок скрипта, который давал ошибку:
alias damage_bonuses_unaugged damage_bonuses
def damage_bonuses
hsh = damage_bonuses_unaugged
if self.is_a?(RPG::Weapon) or self.is_a?(RPG::Armor)
item = $data_items[augment_id]
hsh = hsh.merge(item.damage_bonuses_unaugged[get_char]) {|k, v1, v2| (v1 || 0) + (v2 || 0) } unless item.nil?
end
return hsh
end
(тут есть небольшое уточнение – изначально этот участок в игре просто не срабатывал, так как были ещё ошибки в другом месте, и он никогда не вызывался, но если поправить остальное так, чтобы вызовы начали идти, то вот тогда игра начинала вылетать)
Ошибка:
Skyborn
Script 'Mithran_MDM' line 431: TypeError occurred.
cannot convert nil into Hash
ОК
Строка 431 – это "hsh = hsh.merge..."
А вот версия, изменённая по образу и подобию другого подобного участка кода от этого же автора:
alias damage_bonuses_unaugged damage_bonuses
def damage_bonuses
hsh = damage_bonuses_unaugged
if self.is_a?(RPG::Weapon) or self.is_a?(RPG::Armor)
item = $data_items[augment_id]
unless item.nil?
item.damage_bonuses = nil unless item.damage_bonuses.include?(get_char)
hsh = hsh.merge(item.damage_bonuses_unaugged[get_char]) {|k, v1, v2| (v1 || 0) + (v2 || 0) }
end
end
return hsh
end
После неё (и пары других правок, но там ошибки уже понятные) боевая система
пока-а-а что вроде работает, как ей было положено.
Может ли кто-нибудь разбирающийся в скриптах посмотреть на это и сказать, почему именно оно не работало, и нужно ли что-то ещё менять в имеющейся правке?