суббота, 21 июля 2012 г.

Давайте сделаем рогалик. Глава 28: Ювелирные изделия

В Подземелье Судьбы есть 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 просто задает имя предмета в зависимости от идентификатора материала из которого он изготовлен. Конечно, как мы это уже делали со всеми другими предметами, нам нужно обновить все подпрограммы работы с инвентарем для обработки предметов данного типа. Я дам вас взглянуть на код реализации, но процесс точно такой же, как и для остальных предметов.


Это все что необходимо для реализации ювелирных изделий в игре. Поскольку команды работы с инвентарем были обобщены для обработки любого типа предмета, то ничего в коде инвентаря изменять не нужно. Вот почему мы потратили так много времени для обобщения кода программы. Мы можем просто добавить новые предметы, обновить перечень методов работы инвентаря и у нас появится новый тип предметов в игре. В результате расширение игры значительно упрощается.

1 комментарий:

  1. Мастер перевода вернулся!! Спасибо за очередные переведенные статьи.

    ОтветитьУдалить