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

Программирование с нуля - это совсем просто! 185) Программирование ролевой игры: Сохранение и восстановле


185) Программирование ролевой игры: Сохранение и восстановление

Сохраненные в DOS-варианте функции сохранения и восстановления можно "привязать" непосредственно к выбору соответствующих пунктов меню. Добавим в меню такие пункты - "Сохранить" и "Восстановить", а также два невизуальных компонента OpenDialog и SaveDialog. В код процедур обмена с файлами вместо прямого обращения к единому имени файла sav.dat запишем возможность выбора любого имени файла пользователем:

  { ----------------- }
  procedure SaveGame;
  var F: File;
      i: Integer;
  begin
  if not GameForm.SaveDialog1.Execute then Exit;

  Assign(F,GameForm.SaveDialog1.FileName);
  Rewrite(F,1);

  for i := 1 to MaxItems do
    BlockWrite(F, Items[i], SizeOf(Items[i]));

  for i := 1 to MaxHeroes do
    BlockWrite(F, Heroes[i], SizeOf(Heroes[i]));

  BlockWrite(F, CurHero, SizeOf(CurHero));

  BlockWrite(F, GameMap, SizeOf(GameMap));
  BlockWrite(F, CurMap, SizeOf(CurMap));

  for i := 1 to MaxMonsters do
    BlockWrite(F, Monsters[i], SizeOf(Monsters[i]));

  for i := 1 to MaxQuests do
    BlockWrite(F, Quests[i], SizeOf(Quests[i]));

  Close(F);

  ShowInfo(STR_SAVEOK);
  end;

  { ----------------- }
  procedure LoadGame;
  var F: File;
      i: Integer;
  begin

  if not GameForm.OpenDialog1.Execute then Exit;

  Assign(F,GameForm.OpenDialog1.FileName);
  Reset(F,1);

  for i := 1 to MaxItems do
    BlockRead(F, Items[i], SizeOf(Items[i]));

  for i := 1 to MaxHeroes do
    BlockRead(F, Heroes[i], SizeOf(Heroes[i]));

  BlockRead(F, CurHero, SizeOf(CurHero));

  BlockRead(F, GameMap, SizeOf(GameMap));
  BlockRead(F, CurMap, SizeOf(CurMap));

  for i := 1 to MaxMonsters do
    BlockRead(F, Monsters[i], SizeOf(Monsters[i]));

  for i := 1 to MaxQuests do
    BlockRead(F, Quests[i], SizeOf(Quests[i]));

  Close(F);

  ShowInfo(STR_LOADOK);
  ShowGame;
  end;

Продолжим перенос кода из DOS-раздела в Windows-версию. Следующей процедурой, нуждающейся в небольшой адаптации, будет подпрограмма обработки гибели героя.

  { ----------------- }
  procedure HeroDied;
  var i: Integer;
  begin
  ShowInfo(STR_HERO_DIED);

  for i := 1 to MaxHeroes do
   if Heroes[i].HP > 0 then
      begin
      NextHero;
      Exit;
      end;

  Application.Terminate; // завершение приложения
  end;

Далее займемся переносом работы с инвентарем. Она будет выполняться в отдельной форме.

Исходный код текущей версии (в ней обновлены картинки предметов, которые прислал Александр Аргунов; может, кто-нибудь пришлет и картинки монстров?):

dw090208.zip , 29974 байта.


В избранное