Можно всё, но придется тебе это делать самому.
Вот здесь мы отрисовали предметы, верно? Соответственно вводим дополнительную проверку - если предмет найден.Код: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, "?????????").
Вот, собственно, и все. Действуй!
Социальные закладки