Еще одна вещь, которая поможет персонажу выжить в подземелье, это улучшение его характеристик. У нас уже есть описание клавиши для этого действия на основном экране, клавиша "х". Так что нам нужно просто добавить функциональность.
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
Как вы можете видеть, все подпрограммы работают идентичным образом. Вначале мы убеждаемся что задано положительное, отличное от нуля значение на которое нужно увеличить характеристику, а затем увеличиваем ее. После пересчитываем зависящие от данной характеристики факторы боя, максимальное значения для здоровья и маны персонажа. Здесь реализовал положительный побочный эффект. Если при изменении характеристик увеличивается максимальное значение маны или здоровья, то текущее значение становится равным максимальному.
Это все что необходимо для прокачки персонажа. Я думаю, вы можете заметить, что в тщательно структурированную по модульному принципу программу мы можем легко добавить дополнительный функционал с минимальный количеством отрицательных побочных эффектов.
Хорошая работа, спасибо.
ОтветитьУдалить