пятница, 16 марта 2012 г.

Давайте сделаем рогалик. Глава 21: Прокачка персонажа

Еще одна вещь, которая поможет персонажу выжить в подземелье, это улучшение его характеристик. У нас уже есть описание клавиши для этого действия на основном экране, клавиша "х". Так что нам нужно просто добавить функциональность.

dod.bas
'Прокачка персонажа.
         If ckey = "x" Then
            ImproveCharacter
            'Необходимо перерисовать фоновое изображение.
            DrawBackground mainback()
            DrawMainScreen
         EndIf

Как вы видите, мы вызываем новую подпрограмму ImproveCharacter.

dod.bas
'Используя опыт улучшаем атрибуты персонажа.
  Sub ImproveCharacter ()
    Dim As Integer sel, xp
   
    'Проверим, достаточно ли у нас опыта.
    If pchar.CurrXP > 10 Then
      Do
         If pchar.CurrXP > 10 Then
            'Отобразим текущие значения характеристик.
            pchar.PrintStats
            PutTextShadow "Cost = 10 XP to 1 point improvement.", 49, 10
            PutTextShadow "Enter attribute 1 to 5 to improve, enter to exit: ", 51, 10
            'Позиция для строки ввода.
            Locate 53, 10
            'Получим введенное пользователем значение.
            Input sel
            'Если выбран какой либо атрибут для удучшения. 
            If sel = 1 Then
               pchar.ImproveStrength 1
               'Уменьшим текущий опыт персонажа.
               xp = pchar.CurrXP
               xp -= 10
               pchar.CurrXP = xp 
            EndIf
            If sel = 2 Then
               pchar.ImproveStamina 1
               'Уменьшим текущий опыт персонажа.
               xp = pchar.CurrXP
               xp -= 10
               pchar.CurrXP = xp 
            EndIf
            If sel = 3 Then
               pchar.ImproveDexterity 1
               'Уменьшим текущий опыт персонажа.
               xp = pchar.CurrXP
               xp -= 10
               pchar.CurrXP = xp 
            EndIf      
            If sel = 4 Then
               pchar.ImproveAgility 1
               'Уменьшим текущий опыт персонажа.
               xp = pchar.CurrXP
               xp -= 10
               pchar.CurrXP = xp 
            EndIf
            If sel = 5 Then
               pchar.ImproveIntelligence 1
               'Уменьшим текущий опыт персонажа.
               xp = pchar.CurrXP
               xp -= 10
               pchar.CurrXP = xp 
            EndIf
         Else
            sel = 0
         End If
      Loop Until sel = 0
    Else
      PrintMessage "Not enough XP to spend."
    End If
  End Sub

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

Затем мы используем простую команду Input для получения данных от пользователя. Пользователь должен указать номер улучшаемого параметра. Что бы выйти пользователю достаточно просто нажать клавишу «ввод» что вернет значение 0 в переменную sel. Так же выход будет произведен автоматически если персонаж исчерпал свой опыт.

Когда мы улучшаем атрибуты. мы должны, также, улучшить и зависящие от них боевые факторы персонажа и уровень его здоровья и маны. Поэтому мы добавили несколько подпрограмм для нашего объекта персонажа, которые облегчат их обновление.

character.bi
'Улучшает атрибут и обновляет связанные с ним навыки.
  Sub character.ImproveStamina(increase As Integer)
    'Убедимся что задано значение на сколько увеличить.
    If increase > 0 Then
      'Обновим параметр
      _cinfo.staatt(0) = _cinfo.staatt(0) + increase
      'Обновим боевые факторы. 
      _cinfo.currhp = _cinfo.stratt(0) + _cinfo.staatt(0)
      _cinfo.maxhp = _cinfo.currhp 
      _cinfo.currmana = _cinfo.intatt(0) + _cinfo.staatt(0) 
      _cinfo.maxmana = _cinfo.currmana
      _cinfo.mcfsk(0) = _cinfo.intatt(0) + _cinfo.staatt(0)
    EndIf
  End Sub
  
  'Улучшает атрибут и обновляет связанные с ним навыки.
  Sub character.ImproveDexterity(increase As Integer)
    'Убедимся что задано значение на сколько увеличить.
    If increase > 0 Then
      'Обновим параметр
      _cinfo.dexatt(0) = _cinfo.dexatt(0) + increase
      'Обновим боевые факторы. 
      _cinfo.acfsk(0) = _cinfo.stratt(0) + _cinfo.dexatt(0)
      _cinfo.pcfsk(0) = _cinfo.dexatt(0) + _cinfo.intatt(0)
    EndIf
  End Sub
  
  'Улучшает атрибут и обновляет связанные с ним навыки.
  Sub character.ImproveAgility(increase As Integer)
    'Убедимся что задано значение на сколько увеличить.
    If increase > 0 Then
      'Обновим параметр
      _cinfo.aglatt(0) = _cinfo.aglatt(0) + increase
      'Обновим боевые факторы. 
      _cinfo.ucfsk(0) = _cinfo.stratt(0) + _cinfo.aglatt(0)
      _cinfo.mdfsk(0) = _cinfo.aglatt(0) + _cinfo.intatt(0)
      _cinfo.cdfsk(0) = _cinfo.stratt(0) + _cinfo.aglatt(0)
    EndIf
  End Sub
  
  'Улучшает атрибут и обновляет связанные с ним навыки.
  Sub character.ImproveIntelligence(increase As Integer)
    'Убедимся что задано значение на сколько увеличить.
    If increase > 0 Then
      'Обновим параметр
      _cinfo.intatt(0) = _cinfo.intatt(0) + increase
      'Обновим боевые факторы. 
      _cinfo.currmana = _cinfo.intatt(0) + _cinfo.staatt(0) 
      _cinfo.maxmana = _cinfo.currmana
      'Update the combat factors.
      _cinfo.pcfsk(0) = _cinfo.dexatt(0) + _cinfo.intatt(0)
      _cinfo.mcfsk(0) = _cinfo.intatt(0) + _cinfo.staatt(0)
      _cinfo.mdfsk(0) = _cinfo.aglatt(0) + _cinfo.intatt(0)
    EndIf
  End Sub

Как вы можете видеть, все подпрограммы работают идентичным образом. Вначале мы убеждаемся что задано положительное, отличное от нуля значение на которое нужно увеличить характеристику, а затем увеличиваем ее. После пересчитываем зависящие от данной характеристики факторы боя, максимальное значения для здоровья и маны персонажа. Здесь реализовал положительный побочный эффект. Если при изменении характеристик увеличивается максимальное значение маны или здоровья, то текущее значение становится равным максимальному.

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

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