Можно всё, но придется тебе это делать самому. :)
Вот здесь мы отрисовали предметы, верно? Соответственно вводим дополнительную проверку - если предмет найден.Код:def draw_drop_item(first)
item = (first ? @enemigo.drop_item1 : @enemigo.drop_item2)
contents.draw_text((first ? 35 : 226), 260, 92, 92, FalVocab[1])
if item.kind == 0
contents.draw_text((first ? 0 : 200), 284, 92, 92, FalVocab[3])
return
end
case item.kind
when 1; drop_item = $data_items[item.item_id]
when 2; drop_item = $data_weapons[item.weapon_id]
when 3; drop_item = $data_armors[item.armor_id]
end
draw_icon(drop_item.icon_index,(first ? 94 : 300), 318)
contents.draw_text((first ? 0 : 200), 284, 92, 92, drop_item.name)
end
Тут 90% кодеров предложат тебе сделать глобальный массив переключателей. Так вот - НИ В КОЕМ СЛУЧАЕ!
Лезешь в справку по мейкеру и ищешь класс зловредного монстрюгана. Все встроенные классы, экземпляры которых грузятся из игровых баз, входят в модуль RPG. Соответственно. Ищешь RPG::Enemy - класс врагов.
Внизу страницы увидишь код этого класса. Копируешь к себе в проект, вставляешь над Main. Если ты придерживаешься той парадигмы, которая настойчиво советует дополнять имеющиеся классы, а не переписывать их заново - то флаг тебе в руки, удаляй все, кроме объявления класса и добавляй новые свойства. Я терпеть не могу, когда код неполный и непонятно - в каких закромах искать тот или иной метод, поэтому оставил бы весь код целиком, опять же дополнив собственным свойствами:
attr_accessor :isDropedItem1
attr_accessor :isDropedItem2
Что такое аттрибуты, более подробно можешь почитать в русской справке от Ripp3r и Warrior, но если в кратце - это локальные переменные класса, доступные на чтение/запись извне. accessor - можно записывать и считывать writter - только записывать reader - только считывать. Поскольку нам нужно и установить и считать - оставляем accessor. Если соблюдать правила, то неплохо бы добавить в код и выдранный из правки блок инициализации, установив твоим новым свойствам значения по-умолчанию в false.
Мы определились - как хранить информацию о том выпали ли предметы. Теперь реализация. Где выпадают предметы? Правильно - в Scene_Battle => лезем туда. Сразу же загоняем в поиск уже знакомое свойство drop_item и тут же находим вызов метода display_drop_items. Лезем искать его самого, находим.
Что мы видем? Что все очень грустно, и разработчики не взаимодействуют напрямую с врагами, при подборе предметов, а расчитывают их выпадение на всю группу. Впрочем, никакой катастрофы тут нет. Ведь подсчитываются они в одном случае - при победе в битве, а, значит. мы можем без зазрения совести изменить тот метод. Лезем в Game_Troop.Код:#--------------------------------------------------------------------------
# * Display Gained Drop Items
#--------------------------------------------------------------------------
def display_drop_items
drop_items = $game_troop.make_drop_items
for item in drop_items
$game_party.gain_item(item, 1)
text = sprintf(Vocab::ObtainItem, item.name)
$game_message.texts.push(text)
end
wait_for_message
end
Снова забиваем в поиск "drop" и находим очередной метод:
Итак, теперь у нас есть экземпляр врага и можно действовать.Код:#--------------------------------------------------------------------------
# * Create Array of Dropped Items
#--------------------------------------------------------------------------
def make_drop_items
drop_items = []
for enemy in dead_members
for di in [enemy.drop_item1, enemy.drop_item2]
next if di.kind == 0
next if rand(di.denominator) != 0
if di.kind == 1
drop_items.push($data_items[di.item_id])
elsif di.kind == 2
drop_items.push($data_weapons[di.weapon_id])
elsif di.kind == 3
drop_items.push($data_armors[di.armor_id])
end
end
end
return drop_items
end
Сразу после строчки next if rand(di.denominator) != 0, которая определит - не выпал ли предмет, вставляем свой страшный код:
Если di равно первому выпадающем предмету, установить $game_enemies[enemy.id].isDropedItem1 равным true, иначе - $game_enemies[enemy.id].isDropedItem2
Наконец, последний штрих: возвращаясь к исходному методу, добавляем в самое начало условие: if (first ? @enemigo.isDropedItem1 : @enemigo.isDropedItem2) == true, то - выполняем старый код, иначе, contents.draw_text((first ? 0 : 200), 284, 92, 92, "?????????").
Вот, собственно, и все. Действуй! :)