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

Программирование с нуля - это совсем просто! 149) Программирование ролевой игры: Квесты-5


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

149) Программирование ролевой игры: Квесты-5

Последний выпуск по этой теме был N 144.

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

  { ----------------- }
  procedure CallQuest(hn, mn: Integer);
  var i,n: Integer;
  begin
  n := 0;
  for i := 1 to MaxQuests do
    if Quests[i].MainInd = mn then
       begin
       if QuestFinished(i)
          then ShowInfo(STR_QFIN)
          else ShowInfo(STR_QIS);
       Exit
       end;
  ...

Текстовая константа:

  STR_QFIN = ' Квест выполнен! ' ;

Функция QuestFinished выполнит проверку завершенности i-го квеста, выдаст премию, после чего квест будет удален. Отметим, что в такой схеме премию получит не обязательно тот персонаж, который выполнял задание, а тот, который сообщил об этом. Такую особенность можно отнести к оригинальной идее игры (как говорят программисты, "это не баг, а фича") - появляется возможность "прокачки" конкретного героя, а остальные будут работать на него без наград.

  { ----------------- }
  function QuestFinished(i: Integer): Boolean;
  var n: Integer;
  begin
  QuestFinished := false;

  case Quests[i].QType of

   qKillTarget:
     begin
     if Monsters[ Quests[i].TargetId ].HP <= 0 then
        begin
        QuestFinished := true;
        Quests[i].MainInd := 0;
        Quests[i].TargetId := 0;

        n := GetMoneyNo(Heroes[CurHero]);
        if n > 0 then
           inc( Heroes[CurHero].Items[n].Ints[intMoney],
                Quests[i].Money )

        else if n < 0 then
           begin
           Heroes[CurHero].Items[-n] := ItemTypes[8];
           Heroes[CurHero].Items[-n].Ints[intMoney] :=
              Quests[i].Money;
           end;

        IncXP( Heroes[CurHero],Quests[i].XP );
        end;
     end;

  end;

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

Еще одна важная вещь - это возможность удаления какого-то ранее принятого квеста. Ведь это может произойти вследствие случайного столкновения с мирным персонажем, или окажется, что некоторый квест выполнить сложно или невозможно (монстр находится в ловушке между непроходимыми тайлами).

Пусть некоторый квест будет удален, если игрок в процедуре ShowJournal просто введет его номер. Если же указан ноль, то процедура закрывается.

  { ----------------- }
  procedure ShowJournal;
  var i,n: Integer;
      s: string;
  begin
  while true do
   begin
   ClrScr;
   GoToXY(1,2);
   for i := 1 to MaxQuests do
    if Quests[i].MainInd>0 then
       begin
       WriteLn(i, ' ) ' ,GenerateQuestDescr(i));
       end;
   ReadLn(n);

   if n in [1..MaxQuests] then
     begin
     Quests[n].MainInd := 0;
     Quests[n].TargetId := 0;
     end
   else Exit
   end;

Бесконечный цикл введен здесь для того, чтобы после удаления квеста экран не закрывался, а перерисовывался с новыми значениями (точнее, без удаленных квестов).

Далее - реализуем квест с доставкой предмета.

Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):

тут, 2017.zip, 18793 байта


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

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои учебные курсы "Технологии Delphi/C++/C#. Разработка приложений для бизнеса".
http://shop.piter.com/display.phtml?a_id=17681&web_ok=all

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


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


В избранное