Урок 31. Продаем вываленные из монстров предметы
Последнее, чего пока не хватает магазину - это возможности героя продавать в нем свой забранный на поле брани товар. Для этого нам сначала надо узнать, сколько каждый из предметов стоит. Пока мы такую информацию не выводили, поэтому дополним функцию GetItemName сведениями о цене предмета:
function GetltemName(Itm: TGameltem): string;
begin
case Itm.IType of
ItemAmmo:GetltemName:=Itm.Name+ ' ( '
IntToStr(Itm.Ints[intAmmo])+ ' ) [ ' +
IntToStr(Itm.Price)+' ] ';
itemRangedWeapon:
GetItemName:=Itm.Name+'(‘+IntToStr(Itm.Ints[intRangedAmmo])+
' ) [ ' +IntToStr(Itm.Price)+ ' ] ' ;
MemMagik:GetltemName:=MagikltemsName[
itm.ints [intMagikType] ] +' ( ' +IntToStr(Itm.Ints[intMagikNum])+
( I ' + IntToStr(Itm.Price)+ ' ] ' ;
itemMoney: GetltemName := Itm.Name +
' ( ' +IntToStr(Itm.Ints[intMoney])+ ' ) ' ;
else GetltemName := Itm.Name +' [ ' +IntToStr (Itm. Price) + ' ] ';
end ;
end;
Теперь определим подходящий способ продажи предметов. По хорошему нам желательно разместить интерфейс магазина с интерфейсом инвентаря героя, эта задача не очень сложна в идеологическом плане, однако весьма трудоемка в плане техническом, так как требует довольно большого объема работы. Чтобы не перегружать материал чисто техническими особенностями, оставляем данную задачу на откуп читателям, а в программе реализуем демонстрационный режим продаж. Допустим, если, находясь в интерфейсе магазина, игрок введет отрицательный номер, то этот номер будет трактоваться как номер предмета из инвентаря героя, который надлежит продать. Так как само окно инвентаря в текущем контексте будет недоступно, играющему придется перед заходом в магазин запомнить, мин; предметы он хочет продать, и затем вводить соответствующие номера слотов инвентаря со знаком минус. Это неудобство, отметим еще раз, связано только с демонстрационным режимом создания программы. соответствующий код процедуры GoToShop, в месте, где мы проверяли значение " и иного номера в переменную п, модифицирован так:
…
ReadLn (n) ;
If n = 0 then
Break
else if (-n) in [1..MaxHeroItems] then
begin
if heroes[curhero].items(-7).item in itemHeadWeapon
itemArmor, ltemAmmo, ItemRangedWeapon, itemMagik] then
begin
ShowInfo(STR_SELL_ITEM + Getltemname(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[-ij.IType:=itemMoney;
end;
end;
end
else if i <= 0 then
ShowInfo(STR_NO_MONEY)
else if n in [1..MaxShopIterns] then
begin
…
Теперь прерывание цикла - выход из магазина - происходит лишь при вводе нуля, а если
указан отрицательный помер, то он трактуется как номер предмета (слота) в инвентаре героя, который должен быть продан. Только дополнительно проверяется значение переменной i (номер слота, в котором хранятся деньги) - если их нету, то соответствующий предмет (золотые) должен быть создан.
На этом программирование работы с магазинами считаем завершенным.
Далее - реализуем сохранение и восстановление игры в файле.
Источник: Delgame.at.ua
|