В Подземелье Судьбы есть 2 вида украшений, это кольца и ожерелья. Эти предметы могут быть магическими и давать различные полезные свойства персонажу который их носит. И кольца и ожерелья работают одинаковым образом, поэтому мы не будем заводить доля них разные структуры данных, а добавим одну, содержащую поле указывающее на тип украшения.
inv.bi'Идентификаторы украшений Enum jewleryids jewNone jewSteel jewBronze jewCopper jewBrass jewSilver jewGold jewAgate jewOpal jewAmethyst jewRuby jewEmerald jewJade jewPearl jewQuartz jewSapphire jewDiamond End Enum 'Типы украшений Enum jewtype jNone jRing jNecklace End Enum 'Структура данных украшений Type jewelrytype id As jewleryids 'Идентификатор jtype As jewtype 'Кольцо или ожерелье evaldr As Integer 'Сложность опознания. Evaldr > 0 для магических предметов. eval As Integer 'Флаг опознания. spell As spellid 'Магическое заклинание. noise As Integer 'Генерируемый шум. use As itemuse 'Как предмет используется. jslot(1 To 2) As wieldpos 'Занимаемые слоты при одевании. Могут занимать до 2-х слотов. End Type
Обратите внимание, что у нас есть два перечисления для наших ювелирных изделий. Jewleryids указывает на то, из чего украшение изготовлено, а jewtype — на тип украшения.
Описание типа jewelrytype, это наше стандартное перечисление для разных типов предметов, которые вы видели раньше, а jewtype дает нам знать что это за украшение, например кольцо или ожерелье. Определив оба типа украшений в одном типе данных мы упростили управление данными типами предметов. Мы можем сделать это, так как действительно у нас есть только один тип предмета — украшение, содержащий в себе 2 подтипа, кольца и ожерелья.
inv.bi
'Создает украшения. Sub GenerateJewlery(inv As invtype, currlevel As Integer) Dim item As jewleryids Dim jtype As jewtype Dim As Integer isMagic item = RandomRange(jewSteel, jewDiamond) jtype = RandomRange(jRing, jNecklace) isMagic = ItemIsMagic(currlevel) 'Магический предмет. If IsMagic = TRUE Then inv.jewelry.evaldr = GetScaledFactor(charint, currlevel) inv.jewelry.spell = splNone EndIf inv.jewelry.eval = FALSE 'Общее для всех предметов. inv.jewelry.id = item inv.jewelry.jtype = jtype inv.iconclr = fbTurquoise inv.jewelry.use = useWieldWear inv.jewelry.noise = 1 If jtype = jRing Then inv.icon = "o" inv.jewelry.jslot(1) = wRingRt inv.jewelry.jslot(2) = wRingLt inv.desc = " Ring" Else inv.icon = "0" inv.jewelry.jslot(1) = wNeck inv.jewelry.jslot(2) = wNone inv.desc = " Necklace" EndIf Select Case item Case jewSteel inv.desc = "Steel" & inv.desc Case jewBronze inv.desc = "Bronze" & inv.desc Case jewCopper inv.desc = "Copper" & inv.desc Case jewBrass inv.desc = "Brass" & inv.desc Case jewSilver inv.desc = "Silver" & inv.desc Case jewGold inv.desc = "Gold" & inv.desc Case jewAgate inv.desc = "Agate" & inv.desc Case jewOpal inv.desc = "Opal" & inv.desc Case jewAmethyst inv.desc = "Amethyst" & inv.desc Case jewRuby inv.desc = "Ruby" & inv.desc Case jewEmerald inv.desc = "Emerald" & inv.desc Case jewJade inv.desc = "Jade" & inv.desc Case jewPearl inv.desc = "Pearl" & inv.desc Case jewQuartz inv.desc = "Quartz" & inv.desc Case jewSapphire inv.desc = "Sapphire" & inv.desc Case jewDiamond inv.desc = "Diamond" & inv.desc End Select End Sub
Создаются ювелирные изделия достаточно легко. Мы генерируем идентификатор предмета типа jewleryids (из чего сделан), а после определяем подтип в поле jtype. В зависимости от подтипа мы заполняем значения слотов, в которые он может быть экипирован. Для колец это могу быть wRingRt или wRingLt, что означает что персонаж может носить 2 кольца. Для ожерелий это wNeck, означающее что персонаж может носить одно ожерелье. Конструкция Select Case просто задает имя предмета в зависимости от идентификатора материала из которого он изготовлен. Конечно, как мы это уже делали со всеми другими предметами, нам нужно обновить все подпрограммы работы с инвентарем для обработки предметов данного типа. Я дам вас взглянуть на код реализации, но процесс точно такой же, как и для остальных предметов.
Это все что необходимо для реализации ювелирных изделий в игре. Поскольку команды работы с инвентарем были обобщены для обработки любого типа предмета, то ничего в коде инвентаря изменять не нужно. Вот почему мы потратили так много времени для обобщения кода программы. Мы можем просто добавить новые предметы, обновить перечень методов работы инвентаря и у нас появится новый тип предметов в игре. В результате расширение игры значительно упрощается.
Мастер перевода вернулся!! Спасибо за очередные переведенные статьи.
ОтветитьУдалить