Объявления
Поздравляем
VDV_forever


Друзья, если не получается зарегистрироваться, напишите на почту 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 » 03 ноя 2015, 16:45

Bruzon писал(а):

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


Ну, fheroes2 - это не оригинальная игра, как например Price of Loyalty или Succession Wars. Да и к тому же им никто не занимался кроме автора, а ему наверное скучно стало одному проектом заниматься поэтому и изменений не вносит в код команд и искусственный интеллект оставил таким простым. чтобы каждый мог изменить как ему надо.
Вернуться к началу

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

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

Сообщение t800 » 04 ноя 2015, 05:34

У меня каникулы до 12 ноября. Решил доделать рейтинги. Вчера узнал что в оригинальных героях количество дней сыгранных за предыдущий эпизод кампании сохраняется в сейвах в Campaign.Days. Посмотеле в исходниках fheroes2 там конечно такого нет потому, что автор вообще кампанией не занимался. Все что он сделал касающегося кампании это сделал TYPE_CAMPAIGN вот он в game.h прописан котрый действительно сохраняется в сейвах

Код: Выделить всё
void Init(void);

    const std::string & GetLastSavename(void);
    void      SetLastSavename(const std::string &);
    void      SetLoadVersion(int);
    int         GetLoadVersion(void);

    // type_t
    enum { TYPE_MENU = 0, TYPE_STANDARD = 0x01, TYPE_CAMPAIGN = 0x02, TYPE_HOTSEAT = 0x04, TYPE_NETWORK = 0x08, TYPE_BATTLEONLY = 0x10, TYPE_LOADFILE = 0x80, TYPE_MULTI = TYPE_HOTSEAT | TYPE_NETWORK };
    // distance_t
    enum { VIEW_TOWN  = 0, VIEW_CASTLE = 1, VIEW_HEROES = 2, VIEW_TELESCOPE = 3, VIEW_OBSERVATION_TOWER = 4, VIEW_MAGI_EYES = 5, VIEW_LIGHT_HOUSE = 6 };

    enum
    {
   EVENT_NONE,
   EVENT_BUTTON_NEWGAME,
   EVENT_BUTTON_LOADGAME,
   EVENT_BUTTON_HIGHSCORES,
   EVENT_BUTTON_CREDITS,
   EVENT_BUTTON_STANDARD,
   EVENT_BUTTON_CAMPAIN,
   EVENT_BUTTON_MULTI,
   EVENT_BUTTON_SETTINGS,
   EVENT_BUTTON_SELECT,
   EVENT_BUTTON_HOTSEAT,
   EVENT_BUTTON_NETWORK,
   EVENT_BUTTON_HOST,
   EVENT_BUTTON_GUEST,
   EVENT_BUTTON_BATTLEONLY,
   EVENT_DEFAULT_READY,
   EVENT_DEFAULT_EXIT,
   EVENT_DEFAULT_LEFT,
   EVENT_DEFAULT_RIGHT,
   EVENT_SYSTEM_FULLSCREEN,
   EVENT_SYSTEM_SCREENSHOT,
   EVENT_SYSTEM_DEBUG1,
   EVENT_SYSTEM_DEBUG2,
   EVENT_SLEEPHERO,
   EVENT_ENDTURN,
   EVENT_NEXTHERO,
   EVENT_NEXTTOWN,
   EVENT_CONTINUE,
   EVENT_SAVEGAME,
   EVENT_LOADGAME,
   EVENT_FILEOPTIONS,
   EVENT_PUZZLEMAPS,
   EVENT_INFOGAME,
   EVENT_DIGARTIFACT,
   EVENT_CASTSPELL,
   EVENT_DEFAULTACTION,
   EVENT_OPENFOCUS,
   EVENT_SYSTEMOPTIONS,
   EVENT_BATTLE_CASTSPELL,
   EVENT_BATTLE_RETREAT,
   EVENT_BATTLE_SURRENDER,
   EVENT_BATTLE_AUTOSWITCH,
   EVENT_BATTLE_OPTIONS,
   EVENT_BATTLE_HARDSKIP,
   EVENT_BATTLE_SOFTSKIP,
   EVENT_MOVELEFT,
   EVENT_MOVERIGHT,
   EVENT_MOVETOP,
   EVENT_MOVEBOTTOM,
   EVENT_MOVETOPLEFT,
   EVENT_MOVETOPRIGHT,
   EVENT_MOVEBOTTOMLEFT,
   EVENT_MOVEBOTTOMRIGHT,
   EVENT_SCROLLLEFT,
   EVENT_SCROLLRIGHT,
   EVENT_SCROLLUP,
   EVENT_SCROLLDOWN,
   EVENT_CTRLPANEL,
   EVENT_SHOWRADAR,
   EVENT_SHOWBUTTONS,
   EVENT_SHOWSTATUS,
   EVENT_SHOWICONS,
   EVENT_SWITCHGROUP,
   EVENT_EMULATETOGGLE,
   EVENT_LAST
    };


У меня вопрос а как мне создать Campaign.Days и чтобы они сохранялись в сейвах и складывались при смене эпизода?
Вернуться к началу

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

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

Сообщение Bruzon » 05 ноя 2015, 12:24

Я ради интереса поменял настройки вручную в файле fheroes2.cfg
Но в игре ничего не изменилось. Может, я что-то не так делаю? Открыл его ворд-падом, поменял значения, сохранил, не меняя формат.
Вот, посмотрите - может, что не так?
Вложения
fheroes2.rar
(770 байт) Скачиваний: 258
Вернуться к началу

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

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

Сообщение t800 » 05 ноя 2015, 14:29

Bruzon писал(а):

Я ради интереса поменял настройки вручную в файле fheroes2.cfg
Но в игре ничего не изменилось. Может, я что-то не так делаю? Открыл его ворд-падом, поменял значения, сохранил, не меняя формат.
Вот, посмотрите - может, что не так?


Да не не так делаете. Если строчка начинается со значка # то программа ее ИГНОРИРУЕТ

У вас сейчас вот так

Код: Выделить всё
# heroes move speed: 0 - 10
# heroes speed = 10#
# AI move speed: 0 - 10
# ai speed = 10#
#
# battle speed: 0 - 10
# battle speed = 10#
# scroll speed: 1 - 4
# scroll speed = 4#


А должно быть вот так

Код: Выделить всё
# heroes move speed: 0 - 10
heroes speed = 10
# AI move speed: 0 - 10
ai speed = 10
# battle speed: 0 - 10
battle speed = 10
# scroll speed: 1 - 4
scroll speed = 4
Вернуться к началу

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

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

Сообщение Bruzon » 05 ноя 2015, 22:24

Ух, спасибо за ликбез! Я же не программист, просто юзер, скриптов и языков не понимайт)
А нельзя никак сделать, чтобы настройки сами сохранялись с автосэйвом игры? А то обычному пользователю даже сам файл найти непросто)
И еще музыку бы поменять - уж больно назойливая она там)
Но опять же - не буду настаивать, у вас же своя миссия - сделать кампанию все-таки, в первую очередь.
Вернуться к началу

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

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

Сообщение t800 » 06 ноя 2015, 07:18

Bruzon писал(а):

Ух, спасибо за ликбез! Я же не программист, просто юзер, скриптов и языков не понимайт)
А нельзя никак сделать, чтобы настройки сами сохранялись с автосэйвом игры? А то обычному пользователю даже сам файл найти непросто)
И еще музыку бы поменять - уж больно назойливая она там)
Но опять же - не буду настаивать, у вас же своя миссия - сделать кампанию все-таки, в первую очередь.


Ну я тоже не программист. Я в школе учусь. Ну, я планирую вместо главной темы в меню поставить музыку из Терминатора, и также и в новый замок вставить, но для этого не нужно изменять код команд. Музыка меняется в ресурсах (файлах heroes2.agg и heroes2x.agg) Просто возьмите программки см. https://sites.google.com/site/sergroj/rus/heroes распакуйте heroes2.agg и найдите музыку что хотите поменять и запакуйте обратно.
Вернуться к началу

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

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

Сообщение Bruzon » 07 ноя 2015, 19:42

Спасибо за наводку на прогу.
Кстати, вот сэйв игры, в которой ИИ стоит в своих замках и тупит, вообще не ходит. То ли так запрограммировано, то ли ошибка.
Вложения
Dragon_Island_0169.rar
(253.81 КБ) Скачиваний: 247
Вернуться к началу

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

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

Сообщение t800 » 08 ноя 2015, 05:02

Bruzon писал(а):

Спасибо за наводку на прогу.
Кстати, вот сэйв игры, в которой ИИ стоит в своих замках и тупит, вообще не ходит. То ли так запрограммировано, то ли ошибка.


На этой карте этот герой прописан патрулем, что должен стоять в замке. Если запустить эту карту в оригинальных героях, он точно также стоит, если открыть карту в редакторе и сделать его простым а не патрулем, то герой бегает
с первого же дня и в оригинальных героях и во fheroes2, см. сейв:

Dragon_Island_0169-1.sav.zip
(254.75 КБ) Скачиваний: 253
Вернуться к началу

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

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

Сообщение t800 » 08 ноя 2015, 17:47

Решил делать рейтинги как в оригинальных героях чтобы игра сама сохраняла общие дни кампании в сейвах

Для этого открыл файл settings.cpp нашел там строчки с GameType
скопировал их тут же ниже и везде где было GameType написал CampainDays
И сделал вот так:

Код: Выделить всё
/* check game type */
bool Settings::(int f) const { return game_type & f; }
int Settings::GameType(void) const { return game_type; }

/* set game type */
void Settings::SetGameType(int type) { game_type = type; }

/*  T-800 */
bool Settings::(int f) const { return campain_days & f; }
int Settings::CampainDays(void) const { return campain_days; }

void Settings::SetCampainDays(int days) { campain_days = days; }
/* T-800 */


Запустил проект на сборку он заругался что CampainDays и SetCampainDays не отписаны в Settings тогда
я отрыл файл settings.h нашел где стоят строчки с GameType скопировал ниже и поменял на CampainDays

Код: Выделить всё
    bool      GameType(int) const;
    int      GameType(void) const;
    void      SetGameType(int);
    /* T-800 */
    bool      CampainDays(int) const;
    int      CampainDays(void) const;
    void      SetCampainDays(int);
    /* T-800 */


После чего стал искать в каких еще файлах встречается GameType и нашел
в файле game_io.cpp

Код: Выделить всё
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();

    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.CampainDay());
//           conf.SetCampainDays(200);
   std::cout  << conf.CampainDays();
   std::cout  << "Дни кампании при сохранении игры \n";
   std::cout  << Settings::Get().CampainDays();
   std::cout  << "Дни кампании при старте кампании \n";   
 /* T-800*/
   
    return true;
}


Скопировал строчки с GameType ниже и поменял в них GameType на CampainDays и потом сделал вывод в терминал чтобы посмотреть что они выводят.

Код: Выделить всё
/* T-800*/

        conf.SetCampainDays(conf.CampainDay());
        // conf.SetCampainDays(200);
   std::cout  << conf.CampainDays();
   std::cout  << "Дни кампании при сохранении игры \n";
   std::cout  << Settings::Get().CampainDays();
   std::cout  << "Дни кампании при старте кампании \n";   
 /* T-800*/


Сперва они выводили нули и было не понятно что это значит. Но тогда я решил попробовать
и в файл game_newgame.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); 


И тогда в терминале мне стали выдаваться 100 дней которые я прописал при старте кампании.Но одна проблема! Эти 100 дней почему то не сохраняются при сохранении игры, т.е. если я сохраню игру выйду и загружу из автосейва. То CampainDays будет 0 а не 100. Что делать?
Вернуться к началу

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

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

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

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

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

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

Пред.След.

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

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

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