Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание ролевой компьютерной игры 34) Продаем вываленные из монстров предметы


Школа программирования

Разработка ролевой игры

34) Продаем вываленные из монстров предметы

Последнее, чего пока не хватает магазину - это возможности героя продавать в нем свой собранный на поле брани товар. Для этого нам сначала надо узнать, сколько каждый из предметов стоит. Пока мы такую информацию не выводили, поэтому дополним функцию GetItemName сведениями о цене предмета:

  { ----------------- }
  function GetItemName(Itm: TGameItem): string;
  begin
  case Itm.IType of

    itemAmmo: GetItemName := Itm.Name +
    ' ( ' +IntToStr(Itm.Ints[intAmmo])+ ' ) [ ' +
                IntToStr(Itm.Price)+ ' ] ' ;

    itemRangedWeapon:
              GetItemName := Itm.Name +
  ' ( ' +IntToStr(Itm.Ints[intRangedAmmo])+
                ' ) [ ' +IntToStr(Itm.Price)+ ' ] ' ;

   itemMagik: GetItemName := MagikItemsName[ Itm.Ints[intMagikType] ] +
                             ' ( ' +IntToStr(Itm.Ints[intMagikNum])+ ' ) [ ' +
                             IntToStr(Itm.Price)+ ' ] ' ;

    itemMoney: GetItemName := Itm.Name +
    ' ( ' +IntToStr(Itm.Ints[intMoney])+ ' ) ' ;

  else GetItemName := Itm.Name + ' [ ' +IntToStr(Itm.Price)+ ' ] ' ;
  end;
  end;

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

Соответствующий код процедуры 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):

http://russianenterprisesolutions.com/sbo/download/1146.zip 14946 байтов


(c) 2004-2006 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное