четверг, 15 марта 2012 г.

Давайте сделаем рогалик. Глава 20: Суть отдыха

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

Первое что нужно сделать, это обновить список доступных команд, отображаемых на главном экране. Добавим к ним команду «отдыхать», привязанную к клавише «r».

dod.bas
PutText "Commands", row, col, fbYellowBright
   row += 2
   PutText "Move:.Arrows or Numpad", row, col
   row += 1
   PutText "?.....Help", row, col
   row += 1
   PutText "i.....Inventory", row, col
   row += 1
   PutText "x.....Improve Character", row, col
   row += 2
   PutText ">.....Down Level", row, col
   row += 1
   PutText "<.....Up Level", row, col
   row += 1
   PutText "n.....Inspect Tile", row, col
   row += 1
   PutText "s.....Search Area", row, col
   row += 1
   PutText "t.....Target Enemy", row, col
   row += 1
   PutText "c.....Cast Spell", row, col
   row += 1
   PutText "g.....Get Item", row, col
   row += 1
   PutText "p.....Pick Lock", row, col
   row += 1
   PutText "b.....Bash Door", row, col
   row += 1
   PutText "r.....Rest (1 Mana = 1 HP)", row, col

Мы добавляем проверку нажатия клавиши «r» в основной цикл программы.

dod.bas
...
         'Отдых персонажа.
         If ckey = "r" Then
            RestCharacter
            DrawMainScreen
            level.MoveMonsters
         EndIf
  ...

В коде обработки нажатия клавиши «r» мы вызываем подпрограмму RestCharacter — непосредственно для самого отдыха, перерисовываем экран игры и позволяем выполнить какое либо действия монстрам. Если игрок захочет отдохнуть не далеко от монстра, то это, очевидно, ничем хорошим для персонажа не закончиться.

dod.bas
'Отдых персонажа с конвертированием 1 маны в 1 здоровье.
  Sub RestCharacter ()
    Dim As Integer cman, chp, thp
  
    'Получим текущие значения маны и здоровья.
    cman = pchar.CurrMana
    chp = pchar.CurrHP
    thp = pchar.MaxHP
    'Проверим, необходим ли персонажу отдых.
    If chp = thp Then
      PrintMessage pchar.CharName & " doesn't need to rest."
    Else
      'Убедимся что есть мана.
      If cman = 0 Then
         PrintMessage pchar.CharName & " doesn't have any mana to spend."
      Else
         'Уменьшим ману и увеличим здоровье.
         cman -= 1
         pchar.CurrMana = cman
         chp += 1
         pchar.CurrHP = chp
         PrintMessage pchar.CharName & " spent 1 mana for 1 health point."
      EndIf
    EndIf
  End Sub

Мы получаем текущие значения маны и здоровья персонажа. Необходимо убедиться что здоровье у персонажа не полное (иначе отдых ему не нужен), а также в том, что мана не закончилась. Если эти условия соблюдены, то мы вычитаем единицу из маны и добавляем единицу к текущему здоровью персонажа.

Для того чтобы персонаж мог восстанавливать свой уровень маны, мы добавим предмет для ее восстановления «мана орб».

inv.bi
'ID еды.
  Enum supplyids
    supSupplyNone  'Не еда.
    supHealingHerb 'Лечебная трава, лечит 50% от максимального здоровья.
    supHunkMeat    '25% от максимального здоровья.
    supBread       '10% от максимального здоровья.
    supManaOrb     '10% от максимального кол-ва маны.
  End Enum

Мы просто добавили еще один id для типа предметов «еда». Также нам нужно обновить подпрограмму их создания.

inv.bi:GenerateSupplies
Case supManaOrb   
         inv.desc = "Mana Orb"
         inv.supply.noise = 4
         inv.icon = Chr(229)
         inv.iconclr = fbYellowGreen
         inv.supply.eval = FALSE
         inv.supply.use = useEatDrink
         'Установим магические характеристики.
         If isMagic = TRUE Then
            inv.supply.evaldr = RandomRange(currlevel, currlevel * 2)
            inv.supply.effect = effMaxMana
            inv.supply.sdesc = "Restore Mana"
         Else 
            'Установим секретное описание.
            inv.supply.sdesc = inv.desc
         EndIf

Если мана орб содержит магию, то он будет восстанавливать ману до максимального значения. Последнее что нам осталось обновить, это реализацию команды «Съесть/Выпить».

dod.bas:ProcessEatDrink
...
            ElseIf inv.supply.id = supManaOrb Then
              'Восстанавливает 10% маны.
               pchar.CurrMana = pchar.CurrMana + (pchar.MaxMana * .1)
               If pchar.CurrMana > pchar.MaxMana Then
                  pchar.CurrMana = pchar.MaxMana
                  desc2 = " added some mana!"
               EndIf
               'Если содержит магию.
               If (evalstate = TRUE) And (evalDR > 0) Then
                  'Восстанавливает ману полностью.
                  If pchar.CurrMana = pchar.MaxMana Then
                     desc2 = " restored all your mana!"
                  End If
               EndIf
            EndIf
  ...

Этот маленький раздел обрабатывает восстановление маны, если персонаж употребляет мана орб.

Совсем небольшое обновление программы, но оно позволит нашему персонажу прожить немного дольше во враждебном мире Подземелья Судьбы.

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