Программирование с нуля - это совсем просто! 97) Продаем вываленные из монстров предметы
Школа программирования
Разработка ролевой игры
97) Продаем вываленные из монстров предметы
Продолжение рубрики по программированию ролевой игры. Последний выпуск - см. N 94.
Последнее, чего пока не хватает магазину - это возможности героя продавать в нем свой собранный на поле брани товар. Для этого нам сначала надо узнать, сколько каждый из предметов стоит. Пока мы такую информацию не выводили, поэтому дополним функцию GetItemName сведениями о цене предмета:
{ ----------------- } function GetItemName(Itm: TGameItem): string; begin case Itm.IType of
Теперь определим подходящий способ продажи предметов. По хорошему нам желательно совместить интерфейс магазина с интерфейсом инвентаря героя, эта задача не очень сложна в идеологическом плане, однако весьма трудоемка в плане техническом, так как требует довольно большого объема работы. Чтобы не перегружать материал чисто техническими особенностями, оставляем данную задачу на откуп читателям, а в программе реализуем демонстрационный режим продаж. Допустим, если, находясь в интерфейсе магазина, игрок введет отрицательный
номер, то этот номер будет трактоваться как номер предмета из инвентаря героя, который надлежит продать. Так как само окно инвентаря в текущем контексте будет недоступно, играющему придется перед заходом в магазин запомнить, какие предметы он хочет продать, и затем вводить соответствующие номера слотов инвентаря со знаком минус. Это неудобство, отметим еще раз, связано только с демонстрационным режимом создания программы.
Соответствующий код процедуры GoToShop, в месте, где мы проверяли значение введенного номера в переменную n, модифицирован так:
...
ReadLn(n);
if n = 0 then
Break else
if (-n) in [1..MaxHeroItems] then begin if Heroes[CurHero].Items[-n].IType in [itemHandWeapon, itemArmor,
itemAmmo, itemRangedWeapon, itemMagik] then begin
ShowInfo(STR_SELL_ITEM +
GetItemname(Heroes[CurHero].Items[-n]));
Heroes[CurHero].Items[-n].IType := itemNone;
if i>0 then
Heroes[CurHero].Items[i].Ints[intMoney] :=
Heroes[CurHero].Items[i].Ints[intMoney] +
Heroes[CurHero].Items[-n].Price else
if i<0 then begin
Heroes[CurHero].Items[-i].Ints[intMoney] :=
Heroes[CurHero].Items[-n].Price;
Heroes[CurHero].Items[-i].IType := itemMoney; end; end; end else
if i <= 0 then
ShowInfo(STR_NO_MONEY) else
if n in [1..MaxShopItems] then begin
...
Теперь прерывание цикла - выход из магазина - происходит лишь при вводе нуля, а если указан отрицательный номер, то он трактуется как номер предмета (слота) в инвентаре героя, который должен быть продан. Только дополнительно проверяется значение переменной i (номер слота, в котором хранятся деньги) - если их нету, то соответствующий предмет (золотые) должен быть создан.
На этом программирование работы с магазинами считаем завершенным.
Далее - реализуем сохранение и восстановление игры в файле.
Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):