Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

T-800 mod для Free Heroes II

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 09 ноя 2015, 06:03

Владимир писал(а):

Mein Gott, что это?
Цитата:
bool Settings::(int f) const { return campain_days & f; }

Побитовое умножение целых, одно из которых - простой счётчик... что бы это значило?


Что значит не знаю :smile24: просто подумал так: тип игры в сейвах сохраняется. И игра его из сейвов загружает точно. Поэтому я скопировал строчки для GameType обозвал CampainDays вместо GameType везде аналогично прописал чтобы при сборке проект не ругался. Потом подставил в СampainDays что они равны 100, запустил игру и посмотрел что будет. И получилось как-то странно Если из игры не выходить сохранять игру и загружать из сейва она помнит что СampainDay равно 100 а если выйти и загрузить игру из сейва пишет что СampainDays равны 0.

Цитата:
Что делать? Разбираться с форматом сохранённых игр для кампании. Смотреть, куда там пишется счётчик дней, и как он потом используется при загрузке из файла.


А посмотрел в примечаниях в game_io.cpp вроде игра сохраняет в сейва все настройки что у нее есть в памяти а потом загружает обратно из файла в память в файле

Код: Выделить всё
/***************************************************************************
 *   Copyright (C) 2009 by Andrey Afletdinov <fheroes2@gmail.com>          *
 *                                                                         *
 *   Part of the Free Heroes2 Engine:                                      *
 *   http://sourceforge.net/projects/fheroes2                              *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <sstream>
#include <cstring>
#include <ctime>
#include "zzlib.h"
#include "text.h"
#include "settings.h"
#include "kingdom.h"
#include "heroes.h"
#include "castle.h"
#include "dialog.h"
#include "army.h"
#include "world.h"
#include "interface_gamearea.h"
#include "settings.h"
#include "tools.h"
#include "game.h"
#include "game_over.h"
#include "game_static.h"
#include "monster.h"
#include "game_io.h"

static u16 SAV2ID2 = 0xFF02;
static u16 SAV2ID3 = 0xFF03;

namespace Game
{
    struct HeaderSAV
    {
   enum { IS_COMPRESS = 0x8000, IS_LOYALTY = 0x4000 };

   HeaderSAV() : status(0)
   {
   }

   HeaderSAV(const Maps::FileInfo & fi, bool loyalty) : status(0), info(fi)
   {
       time_t rawtime;
       std::time(&rawtime);
       info.localtime = rawtime;

       if(loyalty)
      status |= IS_LOYALTY;

#ifdef WITH_ZLIB
       status |= IS_COMPRESS;
#endif
   }

   u16      status;
   Maps::FileInfo   info;
    };

    StreamBase & operator<< (StreamBase & msg, const HeaderSAV & hdr)
    {
   return msg << hdr.status << hdr.info;
    }

    StreamBase & operator>> (StreamBase & msg, HeaderSAV & hdr)
    {
   return msg >> hdr.status >> hdr.info;
    }
}

bool Game::Save(const std::string &fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    const bool autosave = (System::GetBasename(fn) == "autosave.sav");
    const Settings & conf = Settings::Get();

    // ask overwrite?
    if(System::IsFile(fn) &&
   ((!autosave && conf.ExtGameRewriteConfirm()) || (autosave && Settings::Get().ExtGameAutosaveConfirm())) &&
   Dialog::NO == Dialog::Message("", _("Are you sure you want to overwrite the save with this name?"), Font::BIG, Dialog::YES|Dialog::NO))
    {
   return false;
    }

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "wb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    u16 loadver = GetLoadVersion();
    if(! autosave) Game::SetLastSavename(fn);

    // raw info content
    fs << static_cast<char>(SAV2ID3 >> 8) << static_cast<char>(SAV2ID3) <<
   GetString(loadver) << loadver << HeaderSAV(conf.CurrentFileInfo(), conf.PriceLoyaltyVersion());
    fs.close();

    ZStreamFile fz;
    fz.setbigendian(true);

    // zip game data content
    fz << loadver << World::Get() << Settings::Get() <<
   GameOver::Result::Get() << GameStatic::Data::Get() << MonsterStaticData::Get() << SAV2ID3; // eof marker

    return !fz.fail() && fz.write(fn, true);
}

bool Game::Load(const std::string & fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    Settings & conf = Settings::Get();
    // loading info
    Game::ShowLoadMapsText();

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "rb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    char major, minor;
    fs >> major >> minor;
    const u16 savid = (static_cast<u16>(major) << 8) | static_cast<u16>(minor);

    // check version sav file
    if(savid != SAV2ID2 && savid != SAV2ID3)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", incorrect SAV2ID");
   return false;
    }

    std::string strver;
    u16 binver = 0;
    HeaderSAV header;

#ifdef FORMAT_VERSION_3225
    if(savid == SAV2ID2)
    {
   // skip 4 byte
   u32 unused;
   fs >> unused;
    }
#endif

    // read raw info
    fs >> strver >> binver >> header;
    size_t offset = fs.tell();
    fs.close();

#ifndef WITH_ZLIB
    if(header.status & HeaderSAV::IS_COMPRESS)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", zlib: unsupported");
   return false;
    }
#endif

    ZStreamFile fz;
    fz.setbigendian(true);

    if(! fz.read(fn, offset))
    {
   DEBUG(DBG_GAME, DBG_INFO, ", uncompress: error");
   return false;
    }

    if((header.status & HeaderSAV::IS_LOYALTY) &&
   !conf.PriceLoyaltyVersion())
   Dialog::Message("Warning", _("This file is saved in the \"Price Loyalty\" version.\nSome items may be unavailable."), Font::BIG, Dialog::OK);

    //SaveMemToFile(std::vector<u8>(fz.data(), fz.data() + fz.size()), "gdata.bin");
    fz >> binver;

    // check version: false
    if(binver > CURRENT_FORMAT_VERSION || binver < LAST_FORMAT_VERSION)
    {
   std::ostringstream os;
   os << "usupported save format: " << binver << std::endl <<
        "game version: " << CURRENT_FORMAT_VERSION << std::endl <<
        "last version: " << LAST_FORMAT_VERSION;
    Dialog::Message("Error", os.str(), Font::BIG, Dialog::OK);
    return false;
    }

    DEBUG(DBG_GAME, DBG_TRACE, "load version: " << binver);
    SetLoadVersion(binver);
    u16 end_check = 0;

    fz >> World::Get() >> Settings::Get() >>
   GameOver::Result::Get() >> GameStatic::Data::Get() >> MonsterStaticData::Get() >> end_check;

    World::Get().PostFixLoad();

   /* T-800 */
   std::cout  << Settings::Get().CampainDays();
   std::cout  << " Дни при cтарте кампании \n";   
    /* T-800*/

    if(fz.fail() || (end_check != SAV2ID2 && end_check != SAV2ID3))
    {
   DEBUG(DBG_GAME, DBG_WARN, "invalid load file: " << fn);
   return false;
    }

    SetLoadVersion(CURRENT_FORMAT_VERSION);

    Game::SetLastSavename(fn);
    conf.SetGameType(conf.GameType() | Game::TYPE_LOADFILE);
   /* T-800*/
   conf.SetCampainDays(conf.CampainDays());
   //conf.SetCampainDays(200);
   //std::cout  << conf.CampainDays();
   //std::cout  << " Дни при сохранении \n";
   std::cout  << Settings::Get().CampainDays();
   std::cout  << " Дни при cтарте кампании \n";   
    /* T-800*/
   
    return true;
}

bool Game::LoadSAV2FileInfo(const std::string & fn,  Maps::FileInfo & finfo)
{
    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "rb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    char major, minor;
    fs >> major >> minor;
    const u16 savid = (static_cast<u16>(major) << 8) | static_cast<u16>(minor);

    // check version sav file
    if(savid != SAV2ID2 && savid != SAV2ID3)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", incorrect SAV2ID");
   return false;
    }

    std::string strver;
    u16 binver = 0;
    HeaderSAV header;

#ifdef FORMAT_VERSION_3225
    if(savid == SAV2ID2)
    {
   // skip 4 byte
   u32 unused;
   fs >> unused;
    }
#endif
    // read raw info
    fs >> strver >> binver >> header;

    // hide: unsupported version
    if(binver > CURRENT_FORMAT_VERSION || binver < LAST_FORMAT_VERSION)
   return false;

#ifndef WITH_ZLIB
    // check: compress game data
    if(header.status & HeaderSAV::IS_COMPRESS)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", zlib: unsupported");
   return false;
    }
#endif

    finfo = header.info;
    finfo.file = fn;

    return true;
}


Вот тут сохраняет


Код: Выделить всё
bool Game::Save(const std::string &fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    const bool autosave = (System::GetBasename(fn) == "autosave.sav");
    const Settings & conf = Settings::Get();

    // ask overwrite?
    if(System::IsFile(fn) &&
   ((!autosave && conf.ExtGameRewriteConfirm()) || (autosave && Settings::Get().ExtGameAutosaveConfirm())) &&
   Dialog::NO == Dialog::Message("", _("Are you sure you want to overwrite the save with this name?"), Font::BIG, Dialog::YES|Dialog::NO))
    {
   return false;
    }

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "wb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    u16 loadver = GetLoadVersion();
    if(! autosave) Game::SetLastSavename(fn);

    // raw info content
    fs << static_cast<char>(SAV2ID3 >> 8) << static_cast<char>(SAV2ID3) <<
   GetString(loadver) << loadver << HeaderSAV(conf.CurrentFileInfo(), conf.PriceLoyaltyVersion());
    fs.close();

    ZStreamFile fz;
    fz.setbigendian(true);

    // zip game data content
    fz << loadver << World::Get() << Settings::Get() <<
   GameOver::Result::Get() << GameStatic::Data::Get() << MonsterStaticData::Get() << SAV2ID3; // eof marker

    return !fz.fail() && fz.write(fn, true);
}


И как понял вот здесь игра сохраняет все свои установки (Settings::Get()) в сейв

Код: Выделить всё
    fz << loadver << World::Get() << Settings::Get() <<
   GameOver::Result::Get() << GameStatic::Data::Get() << MonsterStaticData::Get() << SAV2ID3; // eof marker


А значит должна и Settings::Get().CampainDays() в сайв сохранять.
А значит должна и загружать оттуда

Код: Выделить всё
bool Game::Load(const std::string & fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    Settings & conf = Settings::Get();
    // loading info
    Game::ShowLoadMapsText();

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "rb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    char major, minor;
    fs >> major >> minor;
    const u16 savid = (static_cast<u16>(major) << 8) | static_cast<u16>(minor);

    // check version sav file
    if(savid != SAV2ID2 && savid != SAV2ID3)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", incorrect SAV2ID");
   return false;
    }

    std::string strver;
    u16 binver = 0;
    HeaderSAV header;

#ifdef FORMAT_VERSION_3225
    if(savid == SAV2ID2)
    {
   // skip 4 byte
   u32 unused;
   fs >> unused;
    }
#endif

    // read raw info
    fs >> strver >> binver >> header;
    size_t offset = fs.tell();
    fs.close();

#ifndef WITH_ZLIB
    if(header.status & HeaderSAV::IS_COMPRESS)
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", zlib: unsupported");
   return false;
    }
#endif

    ZStreamFile fz;
    fz.setbigendian(true);

    if(! fz.read(fn, offset))
    {
   DEBUG(DBG_GAME, DBG_INFO, ", uncompress: error");
   return false;
    }

    if((header.status & HeaderSAV::IS_LOYALTY) &&
   !conf.PriceLoyaltyVersion())
   Dialog::Message("Warning", _("This file is saved in the \"Price Loyalty\" version.\nSome items may be unavailable."), Font::BIG, Dialog::OK);

    //SaveMemToFile(std::vector<u8>(fz.data(), fz.data() + fz.size()), "gdata.bin");
    fz >> binver;

    // check version: false
    if(binver > CURRENT_FORMAT_VERSION || binver < LAST_FORMAT_VERSION)
    {
   std::ostringstream os;
   os << "usupported save format: " << binver << std::endl <<
        "game version: " << CURRENT_FORMAT_VERSION << std::endl <<
        "last version: " << LAST_FORMAT_VERSION;
    Dialog::Message("Error", os.str(), Font::BIG, Dialog::OK);
    return false;
    }

    DEBUG(DBG_GAME, DBG_TRACE, "load version: " << binver);
    SetLoadVersion(binver);
    u16 end_check = 0;

    fz >> World::Get() >> Settings::Get() >>
   GameOver::Result::Get() >> GameStatic::Data::Get() >> MonsterStaticData::Get() >> end_check;

    World::Get().PostFixLoad();

   /* T-800 */
   std::cout  << Settings::Get().CampainDays();
   std::cout  << " Дни при cтарте кампании \n";   
    /* T-800*/

    if(fz.fail() || (end_check != SAV2ID2 && end_check != SAV2ID3))
    {
   DEBUG(DBG_GAME, DBG_WARN, "invalid load file: " << fn);
   return false;
    }

    SetLoadVersion(CURRENT_FORMAT_VERSION);

    Game::SetLastSavename(fn);
    conf.SetGameType(conf.GameType() | Game::TYPE_LOADFILE);
   /* T-800*/
   conf.SetCampainDays(conf.CampainDays());
   //conf.SetCampainDays(200);
   //std::cout  << conf.CampainDays();
   //std::cout  << " Дни при сохранении \n";
   std::cout  << Settings::Get().CampainDays();
   std::cout  << " Дни при cтарте кампании \n";   
    /* T-800*/
   
    return true;
}


Вот здесь

Код: Выделить всё
  fz >> World::Get() >> Settings::Get() >>
   GameOver::Result::Get() >> GameStatic::Data::Get() >> MonsterStaticData::Get() >> end_check;

    World::Get().PostFixLoad();

   /* T-800 */
    std::cout  << Settings::Get().CampainDays();
   std::cout  << " Дни при cтарте кампании \n";   
    /* T-800*/


Но почемуто если перезапустит программу и загрузить игру из сейва

Код: Выделить всё
std::cout  << Settings::Get().CampainDays();
std::cout  << " Дни при cтарте кампании \n";   


Пишет что Settings::Get().CampainDays() равно нулю, а если не выходить из программы пишет что равно 100.
Как я и установил при запуске Кампании в new_game.cpp

Код: Выделить всё
int Game::NewCampain(void)
{
  // Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
  // Settings & conf = Settings::Get();
  // conf.SetGameType(Game::TYPE_CAMPAIGN);
  // VERBOSE("New Campain Game: under construction.");
  // return Game::NEWCAMPAIN;
  // Загрузка карты компании 
   Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    Display & display = Display::Get();
    display.Fill(ColorBlack);

    // image background
    const Sprite &back = AGG::GetICN(ICN::HEROES, 0);
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);
    back.Blit(top);

    cursor.Show();
    display.Flip();

    //std::string file = Dialog::SelectFileLoad();
    std::string file = Dialog::SelectFileCampainLoad();
   //std::string file = "files/campain/test.sav";
   Settings::Get().SetCampainDays(100);
   if(file.empty() || !Game::Load(file)) return MAINMENU;
   //Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
   //Settings::Get().SetCampainDays(500);
   std::cout  << Settings::Get().CampainDays();
    return STARTGAME;

}


Вот в этой строчке:

Код: Выделить всё
Settings::Get().SetCampainDays(100);


[youtube]http://youtu.be/hzwAza5BAt8[/youtube]
Вернуться к началу

offlineАватара пользователя
Владимир  
Эксперт
Эксперт
 
Сообщения: 1032
Зарегистрирован: 30 окт 2012, 18:37
Пол: Не указан
Награды: 3
Высшая медаль (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (1)
Поблагодарили: 615 раз.

Re: Кампания во Free Heroes II

Сообщение Владимир » 09 ноя 2015, 07:08

:smile15:
Неужели нельзя разобрать и использовать формат сохранёнок в точности как в оригинальной H2?
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 09 ноя 2015, 07:45

Владимир писал(а):

:smile15:
Неужели нельзя разобрать и использовать формат сохранёнок в точности как в оригинальной H2?


Ну если взять сохраненку оригинальных героев ее fheroes2 не откроет и наоборот. У них же сейвы разные совсем. И струтура у них разная. И при просмотре в hex редакторе они совсем разные.
Вернуться к началу

offlineАватара пользователя
Владимир  
Эксперт
Эксперт
 
Сообщения: 1032
Зарегистрирован: 30 окт 2012, 18:37
Пол: Не указан
Награды: 3
Высшая медаль (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (1)
Поблагодарили: 615 раз.

Re: Кампания во Free Heroes II

Сообщение Владимир » 09 ноя 2015, 08:09

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

Если не получается/ лень делать, смотрите, что и как сохраняется в файлы в новом формате.

Судя по поведению программы в вашей редакции, campdays ведёт себя просто как глобальная переменная.
? Чему равен campdays, когда вы (1) зашли в кампанию, (2) сохранились, (3) нажали загрузить, вышли в меню, но ничего не загружали.
По идее, в (3), он должен быть не определён, и если там 100 - то всё плохо.

Найдите конкретные места кода, где сохранёнка пишется и где она читается, а там будем смотреть. То, что у вас выше - это не конкретные места кода, это как минимум "что-то через 3 вызова других функций".
Найдите всё про
Где и как конструируется сложный тип, куда помещаются gametype, campdays и прочая инфа для сохранённой игры. (не только вызов функции "построить от...", но и саму функцию). Где переменная этого типа отправляется на запись. Как читается сохранённая игра. Где происходит вот это campdays=что-то прочитанное.

...плюсы - зло.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 09 ноя 2015, 10:28

Владимир писал(а):

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

Если не получается/ лень делать, смотрите, что и как сохраняется в файлы в новом формате.

Судя по поведению программы в вашей редакции, campdays ведёт себя просто как глобальная переменная.
? Чему равен campdays, когда вы (1) зашли в кампанию, (2) сохранились, (3) нажали загрузить, вышли в меню, но ничего не загружали.
По идее, в (3), он должен быть не определён, и если там 100 - то всё плохо.

Найдите конкретные места кода, где сохранёнка пишется и где она читается, а там будем смотреть. То, что у вас выше - это не конкретные места кода, это как минимум "что-то через 3 вызова других функций".
Найдите всё про
Где и как конструируется сложный тип, куда помещаются gametype, campdays и прочая инфа для сохранённой игры. (не только вызов функции "построить от...", но и саму функцию). Где переменная этого типа отправляется на запись. Как читается сохранённая игра. Где происходит вот это campdays=что-то прочитанное.

...плюсы - зло.


Наверное брать за образец GameType было не самой лучшей мыслью, потому что я сейчас посмотре у меня и GameType
все время прыгает и до сохранения и после сохранения он разный

Код: Выделить всё
16:15:30: [ERROR]   GetMaxMode:  GetMaxMode: no modes available
1 Тип игры
0 Дни при cтарте кампании
1 Дни
199 Рейтинг
0 Дни кампании
129 Тип игры

----------------------------------------------
16:15:56: [ERROR]   GetMaxMode:  GetMaxMode: no modes available
2 Тип игры
2 Дни при cтарте кампании
130 Тип игры
2 Дни при cтарте кампании
1 Дни
139 Рейтинг
2 Дни кампании

----------------------------------------------
130 Тип игры
0 Дни при cтарте кампании
0 Дни при cтарте кампании
1 Дни
139 Рейтинг
0 Дни кампании


Думаю, может действивительно взять за образец World.CountDay() и по подобию сделать World.CountCampainDay()
а то как-то странно этот GameType себя ведет... Не понятно :smile26: ...
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 09 ноя 2015, 11:46

Хотя я сейчас посмотрел у World.CountDay() нет возможности их установки, т.е. нет такой команды Set.World.CountDay()

И сколько не смотрю вроде нигде нет никаких других команд по сохранению в сейвы, только

Код: Выделить всё
bool Game::Save(const std::string &fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    const bool autosave = (System::GetBasename(fn) == "autosave.sav");
    const Settings & conf = Settings::Get();

    // ask overwrite?
    if(System::IsFile(fn) &&
   ((!autosave && conf.ExtGameRewriteConfirm()) || (autosave && Settings::Get().ExtGameAutosaveConfirm())) &&
   Dialog::NO == Dialog::Message("", _("Are you sure you want to overwrite the save with this name?"), Font::BIG, Dialog::YES|Dialog::NO))
    {
   return false;
    }

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "wb"))
    {
   DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
   return false;
    }

    u16 loadver = GetLoadVersion();
    if(! autosave) Game::SetLastSavename(fn);

    // raw info content
    fs << static_cast<char>(SAV2ID3 >> 8) << static_cast<char>(SAV2ID3) <<
   GetString(loadver) << loadver << HeaderSAV(conf.CurrentFileInfo(), conf.PriceLoyaltyVersion());
    fs.close();

    ZStreamFile fz;
    fz.setbigendian(true);

    // zip game data content
    fz << loadver << World::Get() << Settings::Get() <<
   GameOver::Result::Get() << GameStatic::Data::Get() << MonsterStaticData::Get() << SAV2ID3; // eof marker

    return !fz.fail() && fz.write(fn, true);
}
Вернуться к началу

offlineBruzon  
Новичок
Новичок
 
Сообщения: 24
Зарегистрирован: 30 окт 2015, 22:24
Пол: Не указан
Поблагодарили: 4 раз.

Re: Кампания во Free Heroes II

Сообщение Bruzon » 09 ноя 2015, 15:04

Я распаковал heroes2.agg а в нем муз. файлы с расширением 82.М - чем его открывать? Гугл на эту тему молчит))
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 09 ноя 2015, 16:40

Bruzon писал(а):

Я распаковал heroes2.agg а в нем муз. файлы с расширением 82.М - чем его открывать? Гугл на эту тему молчит))


см. viewtopic.php?f=40&t=118&start=20#p9173
или конвертором из tools http://sourceforge.net/projects/fheroes ... p/download
Вернуться к началу

offlineBruzon  
Новичок
Новичок
 
Сообщения: 24
Зарегистрирован: 30 окт 2015, 22:24
Пол: Не указан
Поблагодарили: 4 раз.

Re: Кампания во Free Heroes II

Сообщение Bruzon » 09 ноя 2015, 17:12

t800 писал(а):

Bruzon писал(а):

Я распаковал heroes2.agg а в нем муз. файлы с расширением 82.М - чем его открывать? Гугл на эту тему молчит))


см. viewtopic.php?f=40&t=118&start=20#p9173
или конвертором из tools http://sourceforge.net/projects/fheroes ... p/download

Спасибо!
Кое как открыл с помощью CoolEdit'a, выставив правильное значение бит-рейта: 8 бит и частоту 22050ГЦ, пришлось порыть на вики)
И теперь главный вопрос - как все это обратно запаковать в игру? Он не сохраняет файлы с расширением 82.M
Может быть, сохранить как PCM а потом вручную переименовать в 82.М?
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Кампания во Free Heroes II

Сообщение t800 » 11 ноя 2015, 05:47

Кажется получилось! :smile21: :smile21:

Сперва я в game_io.cpp закомментировал строчку

Код: Выделить всё
//conf.SetGameType(conf.GameType() | Game::TYPE_LOADFILE);


И тогда после персохранений цифирки для GameType у меня перестали все время меняться, а стал оставться тем котрфый я прописывал при старте кампании. И призагрузке из сейва стал выдаваться те цифирки что я ему прописал. Тогда я подумал, значит с Типом игры все нормально и он действительно сохраняет в сейфах те цифирки что я ему записываю.
И подумал почему же CampainDays() не сохраняется и все время при загрузке из сейва выдает одни нули.
И тут я подумал что может для GameType где-нибудь еще что-нибудь прописано. И сделал поиск на слову game_type
И нашел его в еще трех местах в файле settings.cpp! :smile21: И ее скопировал и тут же рядом прописал capmain_days

Цитата:
/* constructor */
Settings::Settings() : debug(DEFAULT_DEBUG), video_mode(0, 0), game_difficulty(Difficulty::NORMAL),
font_normal("dejavusans.ttf"), font_small("dejavusans.ttf"), size_normal(15), size_small(10),
sound_volume(6), music_volume(6), heroes_speed(DEFAULT_SPEED_DELAY), ai_speed(DEFAULT_SPEED_DELAY), scroll_speed(SCROLL_NORMAL), battle_speed(DEFAULT_SPEED_DELAY),
blit_speed(0), game_type(0), campain_days(0) , preferably_count_players(0), port(DEFAULT_PORT), memory_limit(0)
{
ExtSetModes(GAME_SHOW_SDL_LOGO);
ExtSetModes(GAME_AUTOSAVE_ON);

opt_global.SetModes(GLOBAL_SHOWRADAR);
opt_global.SetModes(GLOBAL_SHOWICONS);
opt_global.SetModes(GLOBAL_SHOWBUTTONS);
opt_global.SetModes(GLOBAL_SHOWSTATUS);
if(System::isEmbededDevice())
{
opt_global.SetModes(GLOBAL_POCKETPC);
ExtSetModes(POCKETPC_HIDE_CURSOR);
ExtSetModes(POCKETPC_TAP_MODE);
ExtSetModes(POCKETPC_DRAG_DROP_SCROLL);
}
}


И еще вот здесь

Цитата:
StreamBase & operator<< (StreamBase & msg, const Settings & conf)
{
return msg <<
// lang
conf.force_lang <<
// current maps
conf.current_maps_file <<
// game config
conf.game_difficulty <<
conf.game_type <<
conf.campain_days <<

conf.preferably_count_players <<
conf.debug <<
conf.opt_game << conf.opt_world << conf.opt_battle << conf.opt_addons <<
conf.players;
}

StreamBase & operator>> (StreamBase & msg, Settings & conf)
{
std::string lang;

msg >> lang;

if(lang != "en" && lang != conf.force_lang && !conf.Unicode())
{
std::string msg("This is an saved game is localized for lang = ");
msg.append(lang);
msg.append(", and most of the messages will be displayed incorrectly.\n \n");
msg.append("(tip: set unicode = on)");
Dialog::Message("Warning!", msg, Font::BIG, Dialog::OK);
}

int debug;
u32 opt_game = 0; // skip: settings

// map file
msg >> conf.current_maps_file >>
conf.game_difficulty >> conf.game_type >> conf.campain_days >>
conf.preferably_count_players >> debug >>
opt_game >> conf.opt_world >> conf.opt_battle >> conf.opt_addons >>
conf.players;

#ifndef WITH_DEBUG
conf.debug = debug;
#endif

return msg;
}


Собрал проект! И все получилось! Теперь у меня CampainDays сохраняется в сейвах и при загрузке из сейвов. Выдает то цифирки что я им прописал при старте карты!

[youtube]http://youtu.be/gAQURSzw_Kw[/youtube]
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron