Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

T-800 mod для Free Heroes II

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

T-800 mod для Free Heroes II

Сообщение t800 » 01 сен 2015, 10:41

Я хочу сделать компанию для T-800 Mod во Free Heroes II (сейчас компаний во Free Heroes II нет)
Для этого я скачал исходники они выложены на сайте http://sourceforge.net/p/fheroes2/code/HEAD/tree/trunk/
их можно скачать по ссылке Download snapshot

В исходниках я нашел файл который делает меню новой игры fheroes2/src/fheroes2/game/game_newgame.cpp

Я сделал в файле game_newgame поиск по слову Сampain и нашел команды что делают кнопку компании.
Они есть но выключены значками //

//Button buttonCampainGame(top.x + 455, top.y + 110, ICN::BTNNEWGM, 2, 3);
//buttonCampainGame.Draw();

Вот они эти строчки
http://sourceforge.net/p/fheroes2/code/ ... e.cpp#l175
http://sourceforge.net/p/fheroes2/code/ ... e.cpp#l181

Я убрал значки // в этих строчках у себя в файле game_newgame и захотел проверить появится ли кнопка в игре

Для этого я зашел в каталог проекта и сперва дал команду

Код: Выделить всё
sudo apt-get install libsdl1.2-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev


А потом

Код: Выделить всё
make all


И компилятор создал мне файл fheroes2

Я его запустил и там появилась кнопка компании

Изображение

Но когда я не нее нажимаю кнопка нажимается но ничего не происходит

Изображение

Сейчас у меня файл game_newgame.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 "gamedefs.h"
#include "agg.h"
#include "dialog.h"
#include "text.h"
#include "cursor.h"
#include "settings.h"
#include "button.h"
#include "pocketpc.h"
#include "world.h"
#include "game.h"

int Game::NewStandard(void)
{
    Settings & conf = Settings::Get();
    conf.SetGameType(Game::TYPE_STANDARD);
    conf.SetPreferablyCountPlayers(0);
    return Game::SELECTSCENARIO;
}

int Game::NewBattleOnly(void)
{
    Settings & conf = Settings::Get();
    conf.SetGameType(Game::TYPE_BATTLEONLY);

    return Game::NEWMULTI;
}

int Game::NewHotSeat(void)
{
    Settings & conf = Settings::Get();
    conf.SetGameType(conf.GameType() | Game::TYPE_HOTSEAT);

    if(conf.GameType(Game::TYPE_BATTLEONLY))
    {
    conf.SetPreferablyCountPlayers(2);
    world.NewMaps(10, 10);
    return StartBattleOnly();
    }
    else
    {
    const u32 select = conf.QVGA() ? 2 : SelectCountPlayers();
    if(select)
    {
        conf.SetPreferablyCountPlayers(select);
        return Game::SELECTSCENARIO;
    }
    }
    return Game::MAINMENU;
}

int Game::NewCampain(void)
{
    Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
    VERBOSE("New Campain Game: under construction.");
    return Game::NEWGAME;
}

#ifdef NETWORK_ENABLE
int Game::NewNetwork(void)
{
    Settings & conf = Settings::Get();
    conf.SetGameType(conf.GameType() | Game::TYPE_NETWORK);

    // cursor
    Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    Display & display = Display::Get();
    //Settings & conf = Settings::Get();

    // 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);

    const Sprite &panel = AGG::GetICN(ICN::REDBACK, 0);
    panel.Blit(top.x + 405, top.y + 5);

    LocalEvent & le = LocalEvent::Get();

    Button buttonHost(top.x + 455, top.y + 45, ICN::BTNNET, 0, 1);
    Button buttonGuest(top.x + 455, top.y + 110, ICN::BTNNET, 2, 3);
    Button buttonCancelGame(top.x + 455, top.y + 375, ICN::BTNMP, 8, 9);

    buttonHost.Draw();
    buttonGuest.Draw();
    buttonCancelGame.Draw();

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

    // newgame loop
    while(le.HandleEvents())
    {
    le.MousePressLeft(buttonHost) ? buttonHost.PressDraw() : buttonHost.ReleaseDraw();
    le.MousePressLeft(buttonGuest) ? buttonGuest.PressDraw() : buttonGuest.ReleaseDraw();
    le.MousePressLeft(buttonCancelGame) ? buttonCancelGame.PressDraw() : buttonCancelGame.ReleaseDraw();

    //if(le.MouseClickLeft(buttonHost) || HotKeyPressEvent(EVENT_BUTTON_HOST)) return NetworkHost();
    //if(le.MouseClickLeft(buttonGuest) || HotKeyPressEvent(EVENT_BUTTON_GUEST)) return NetworkGuest();
    if(HotKeyPressEvent(EVENT_DEFAULT_EXIT) || le.MouseClickLeft(buttonCancelGame)) return MAINMENU;

        // right info
    if(le.MousePressRight(buttonHost)) Dialog::Message(_("Host"), _("The host sets up the game options. There can only be one host per network game."), Font::BIG);
    if(le.MousePressRight(buttonGuest)) Dialog::Message(_("Guest"), _("The guest waits for the host to set up the game, then is automatically added in. There can be multiple guests for TCP/IP games."), Font::BIG);
    if(le.MousePressRight(buttonCancelGame)) Dialog::Message(_("Cancel"), _("Cancel back to the main menu."), Font::BIG);
    }

    return Game::MAINMENU;
}
#endif

int Game::NewGame(void)
{
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    Settings & conf = Settings::Get();

    // reset last save name
    Game::SetLastSavename("");

    if(conf.QVGA()) return PocketPC::NewGame();

    // cursor
    Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

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

    // load game settings
    conf.BinaryLoad();

    // 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);

    const Sprite &panel = AGG::GetICN(ICN::REDBACK, 0);
    panel.Blit(top.x + 405, top.y + 5);

    LocalEvent & le = LocalEvent::Get();

    Button buttonStandartGame(top.x + 455, top.y + 45, ICN::BTNNEWGM, 0, 1);
    Button buttonMultiGame(top.x + 455, top.y + 110, ICN::BTNNEWGM, 4, 5);
    Button buttonSettings(top.x + 455, top.y + 240, ICN::BTNDCCFG, 4, 5);
    Button buttonCancelGame(top.x + 455, top.y + 375, ICN::BTNNEWGM, 6, 7);
    Button buttonBattleGame(top.x + 455, top.y + 175, ICN::BTNBATTLEONLY, 0, 1);


    Button buttonCampainGame(top.x + 455, top.y + 305, ICN::BTNNEWGM, 2, 3);
    //Button buttonMultiGame(top.x + 455, top.y + 175, ICN::BTNNEWGM, 4, 5);
    //Button buttonSettings(top.x + 455, top.y + 240, ICN::BTNDCCFG, 4, 5);
    //Button buttonCancelGame(top.x + 455, top.y + 375, ICN::BTNNEWGM, 6, 7);

    buttonStandartGame.Draw();
    buttonCampainGame.Draw();
    buttonMultiGame.Draw();
    buttonCancelGame.Draw();
    buttonSettings.Draw();

    if(conf.QVGA())
    buttonBattleGame.SetDisable(true);
    else
    buttonBattleGame.Draw();

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

    // newgame loop
    while(le.HandleEvents())
    {
    le.MousePressLeft(buttonStandartGame) ? buttonStandartGame.PressDraw() : buttonStandartGame.ReleaseDraw();
    le.MousePressLeft(buttonCampainGame) ? buttonCampainGame.PressDraw() : buttonCampainGame.ReleaseDraw();
    le.MousePressLeft(buttonMultiGame) ? buttonMultiGame.PressDraw() : buttonMultiGame.ReleaseDraw();
    le.MousePressLeft(buttonCancelGame) ? buttonCancelGame.PressDraw() : buttonCancelGame.ReleaseDraw();
    le.MousePressLeft(buttonSettings) ? buttonSettings.PressDraw() : buttonSettings.ReleaseDraw();
    buttonBattleGame.isEnable() && le.MousePressLeft(buttonBattleGame) ? buttonBattleGame.PressDraw() : buttonBattleGame.ReleaseDraw();

    if(HotKeyPressEvent(EVENT_BUTTON_STANDARD) || le.MouseClickLeft(buttonStandartGame)) return NEWSTANDARD;
    if(HotKeyPressEvent(EVENT_BUTTON_CAMPAIN) || le.MouseClickLeft(buttonCampainGame)) return NEWCAMPAIN;
    if(HotKeyPressEvent(EVENT_BUTTON_MULTI) || le.MouseClickLeft(buttonMultiGame)) return NEWMULTI;
    if(HotKeyPressEvent(EVENT_BUTTON_SETTINGS) || le.MouseClickLeft(buttonSettings)){ Dialog::ExtSettings(false); cursor.Show(); display.Flip(); }
    if(HotKeyPressEvent(EVENT_DEFAULT_EXIT) || le.MouseClickLeft(buttonCancelGame)) return MAINMENU;

    if(buttonBattleGame.isEnable())
    if(HotKeyPressEvent(EVENT_BUTTON_BATTLEONLY) || le.MouseClickLeft(buttonBattleGame)) return NEWBATTLEONLY;

        // right info
    if(le.MousePressRight(buttonStandartGame)) Dialog::Message(_("Standard Game"), _("A single player game playing out a single map."), Font::BIG);
    if(le.MousePressRight(buttonCampainGame)) Dialog::Message(_("Campaign Game"), _("A single player game playing through a series of maps."), Font::BIG);
    if(le.MousePressRight(buttonMultiGame)) Dialog::Message(_("Multi-Player Game"), _("A multi-player game, with several human players completing against each other on a single map."), Font::BIG);
    if(le.MousePressRight(buttonSettings)) Dialog::Message(_("Settings"), _("FHeroes2 game settings."), Font::BIG);
    if(le.MousePressRight(buttonCancelGame)) Dialog::Message(_("Cancel"), _("Cancel back to the main menu."), Font::BIG);
    }

    return QUITGAME;
}

int Game::NewMulti(void)
{
    Settings & conf = Settings::Get();

    if(! (conf.GameType(Game::TYPE_BATTLEONLY)))
    conf.SetGameType(Game::TYPE_STANDARD);

    if(conf.QVGA()) return PocketPC::NewMulti();

    // cursor
    Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    Display & display = Display::Get();

    // 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);

    const Sprite &panel = AGG::GetICN(ICN::REDBACK, 0);
    panel.Blit(top.x + 405, top.y + 5);

    LocalEvent & le = LocalEvent::Get();

    Button buttonHotSeat(top.x + 455, top.y + 45, ICN::BTNMP, 0, 1);
    Button buttonNetwork(top.x + 455, top.y + 110, ICN::BTNMP, 2, 3);
    Button buttonCancelGame(top.x + 455, top.y + 375, ICN::BTNMP, 8, 9);

    buttonHotSeat.Draw();
    buttonCancelGame.Draw();
    buttonNetwork.SetDisable(true);

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

    // newgame loop
    while(le.HandleEvents())
    {
    le.MousePressLeft(buttonHotSeat) ? buttonHotSeat.PressDraw() : buttonHotSeat.ReleaseDraw();
    le.MousePressLeft(buttonCancelGame) ? buttonCancelGame.PressDraw() : buttonCancelGame.ReleaseDraw();

    if(le.MouseClickLeft(buttonHotSeat) || HotKeyPressEvent(EVENT_BUTTON_HOTSEAT)) return NEWHOTSEAT;
    if(HotKeyPressEvent(EVENT_DEFAULT_EXIT) || le.MouseClickLeft(buttonCancelGame)) return MAINMENU;

        // right info
    if(le.MousePressRight(buttonHotSeat)) Dialog::Message(_("Hot Seat"), _("Play a Hot Seat game, where 2 to 4 players play around the same computer, switching into the 'Hot Seat' when it is their turn."), Font::BIG);
    if(le.MousePressRight(buttonCancelGame)) Dialog::Message(_("Cancel"), _("Cancel back to the main menu."), Font::BIG);

#ifdef NETWORK_ENABLE
    if(buttonNetwork.isEnable())
    {
        le.MousePressLeft(buttonNetwork) ? buttonNetwork.PressDraw() : buttonNetwork.ReleaseDraw();
        if(le.MouseClickLeft(buttonNetwork) || HotKeyPressEvent(EVENT_BUTTON_NETWORK)) return NEWNETWORK;
        if(le.MousePressRight(buttonNetwork)) Dialog::Message(_("Network"), _("Play a network game, where 2 players use their own computers connected through a LAN (Local Area Network)."), Font::BIG);
    }
#endif
    }

    return QUITGAME;
}

u32 Game::SelectCountPlayers(void)
{
    // cursor
    Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    Display & display = Display::Get();

    // 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);

    const Sprite &panel = AGG::GetICN(ICN::REDBACK, 0);
    panel.Blit(top.x + 405, top.y + 5);

    LocalEvent & le = LocalEvent::Get();

    Button button2Players(top.x + 455, top.y + 45, ICN::BTNHOTST, 0, 1);
    Button button3Players(top.x + 455, top.y + 110, ICN::BTNHOTST, 2, 3);
    Button button4Players(top.x + 455, top.y + 175, ICN::BTNHOTST, 4, 5);
    Button button5Players(top.x + 455, top.y + 240, ICN::BTNHOTST, 6, 7);
    Button button6Players(top.x + 455, top.y + 305, ICN::BTNHOTST, 8, 9);
    Button buttonCancel(top.x + 455, top.y + 375, ICN::BTNNEWGM, 6, 7);

    button2Players.Draw();
    button3Players.Draw();
    button4Players.Draw();
    button5Players.Draw();
    button6Players.Draw();
    buttonCancel.Draw();

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

    // newgame loop
    while(le.HandleEvents())
    {
    le.MousePressLeft(button2Players) ? button2Players.PressDraw() : button2Players.ReleaseDraw();
    le.MousePressLeft(button3Players) ? button3Players.PressDraw() : button3Players.ReleaseDraw();
    le.MousePressLeft(button4Players) ? button4Players.PressDraw() : button4Players.ReleaseDraw();
    le.MousePressLeft(button5Players) ? button5Players.PressDraw() : button5Players.ReleaseDraw();
    le.MousePressLeft(button6Players) ? button6Players.PressDraw() : button6Players.ReleaseDraw();

    le.MousePressLeft(buttonCancel) ? buttonCancel.PressDraw() : buttonCancel.ReleaseDraw();

    if(le.MouseClickLeft(button2Players) || le.KeyPress(KEY_2)) return 2;
    if(le.MouseClickLeft(button3Players) || le.KeyPress(KEY_3)) return 3;
    if(le.MouseClickLeft(button4Players) || le.KeyPress(KEY_4)) return 4;
    if(le.MouseClickLeft(button5Players) || le.KeyPress(KEY_5)) return 5;
    if(le.MouseClickLeft(button6Players) || le.KeyPress(KEY_6)) return 6;

    if(HotKeyPressEvent(Game::EVENT_DEFAULT_EXIT) || le.MouseClickLeft(buttonCancel)) return 0;

        // right info
    if(le.MousePressRight(button2Players)) Dialog::Message(_("2 Players"), _("Play with 2 human players, and optionally, up, to 4 additional computer players."), Font::BIG);
    if(le.MousePressRight(button3Players)) Dialog::Message(_("3 Players"), _("Play with 3 human players, and optionally, up, to 3 additional computer players."), Font::BIG);
    if(le.MousePressRight(button4Players)) Dialog::Message(_("4 Players"), _("Play with 4 human players, and optionally, up, to 2 additional computer players."), Font::BIG);
    if(le.MousePressRight(button5Players)) Dialog::Message(_("5 Players"), _("Play with 5 human players, and optionally, up, to 1 additional computer players."), Font::BIG);
    if(le.MousePressRight(button6Players)) Dialog::Message(_("6 Players"), _("Play with 6 human players."), Font::BIG);
    if(le.MousePressRight(buttonCancel)) Dialog::Message(_("Cancel"), _("Cancel back to the main menu."), Font::BIG);
    }

    return 0;
}


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

Как это сделать?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3241
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 1485 раз.

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

Сообщение AlexSpl » 01 сен 2015, 16:49

Боюсь, что никак, пока автор не напишет код, реализующий нужный функционал.

Код: Выделить всё
int Game::NewCampain(void)
{
    Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
    VERBOSE("New Campain Game: under construction.");
    return Game::NEWGAME;
}
Вернуться к началу

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

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

Сообщение t800 » 01 сен 2015, 17:32

AlexSpl писал(а):

Боюсь, что никак, пока автор не напишет код, реализующий нужный функционал.

Код: Выделить всё
int Game::NewCampain(void)
{
    Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
    VERBOSE("New Campain Game: under construction.");
    return Game::NEWGAME;
}


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

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

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

Сообщение t800 » 12 сен 2015, 09:49

Немного разобрался в командах и как их изменять! :smile21: :smile21: :smile21:

Первое! Чтобы легко было менять команды это надо делать не через блокнотик.
А через редактор Anjuta потому что у него подсказки! :smile21: :smile21: :smile21:

Чтобы этот редактор поставить надо дать такую команду

Код: Выделить всё
danya@danya:~$sudo apt-get install anjuta


И в этом реадакторе надо открыть MakeFile в папочке fheroes2 и редактор сразу увидит все файлы и если файл открыть редактор сам делает подсказки.

Я отрыл файл game_newgame.cpp и там где была команда int Game::NewCampain(void)
и вместо них написал такие команды которые я скопировал из файла game_loadgame.cpp
там эти команды загружают сохраненные игры.

Код: Выделить всё
int Game::NewCampain(void)
{
  // Settings::Get().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();
   if(file.empty() || !Game::Load(file)) return MAINMENU;
   return STARTGAME;

}


Но только вместо команды Dialog::SelectFileLoad(); я написал Dialog::SelectFileCampainLoad();
И попробовал собрать игру. Это можно делать прямое в редакторе. Просто нажать Собрать Проект!
Но редактор собрать игру не смог а заругался что команда SelectFileCampainLoad() не описана в каком то
Dialog тогда я решил посмотреть где записана команда SelectFileLoad()

Для этого я дал такую команду

Код: Выделить всё
danya@danya:~$ grep -rl 'SelectFileLoad' fheroes2-code-3277-trunk/fheroes2/src/
fheroes2-code-3277-trunk/fheroes2/src/fheroes2/game/game_loadgame.cpp
fheroes2-code-3277-trunk/fheroes2/src/fheroes2/game/game_newgame.cpp
fheroes2-code-3277-trunk/fheroes2/src/fheroes2/dialog/dialog.h
fheroes2-code-3277-trunk/fheroes2/src/fheroes2/dialog/dialog_selectfile.cpp


Потом открыл в редакторе dialog.h и dialog_selectfile.cpp
Нашел там команды SelectFileLoad

Код: Выделить всё
std::string Dialog::SelectFileLoad(void)
{
   const std::string & lastfile = Game::GetLastSavename();
   return SelectFileListSimple(_("File to Load:"), (lastfile.size() ? lastfile : ""), false);
}


прото скопировал их и изменил FileLoad на FileCampainLoad

Код: Выделить всё
std::string Dialog::SelectFileLoad(void)
{
   const std::string & lastfile = Game::GetLastSavename();
   return SelectFileListSimple(_("File to Load:"), (lastfile.size() ? lastfile : ""), false);
}


И еще я поменял надпись File to Load на Campain to Play
Код: Выделить всё
std::string Dialog::SelectFileCampainLoad(void)
{
   const std::string & lastfile = Game::GetLastSavename();
   return SelectFileListSimple(_("Campain to Play:"), (lastfile.size() ? lastfile : ""), false);
}


И все получилось! Редактор перестал ругаться и собрал игру! :smile21: :smile21: :smile21:

И сейчас когда нажимаешь кнопку компании. Отображаются игры компании.
И можно запустить игры Компании T-800 :smile21: :smile21: :smile21:



Правда не могу понять :smile7: что надо как сделать чтобы после окончания первого эпизода сразу запускался следующий и чтобы нельзя было запустить до того как сыграл предыдущий потому что сейчас они все запускаются :smile5:
Последний раз редактировалось t800 12 сен 2015, 16:24, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
VDV_forever  
имя: Дмитрий
Администратор
 
Сообщения: 3784
Зарегистрирован: 22 мар 2009, 12:36
Пол: Мужчина
Поблагодарили: 934 раз.

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

Сообщение VDV_forever » 12 сен 2015, 09:59

Любопытненько. :smile4: Как закончите выложите ссылку на скачивание, ок? Гляну на мегаизвращенные герои :smile1:
Желательно чтобы сюжетная линия была и интересные квесты. Глядишь турнир запустим :smile6:
http://www.handbookhmm.ru- Познай все тонкости игры!
Вернуться к началу

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

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

Сообщение t800 » 12 сен 2015, 15:07

VDV_forever писал(а):

Любопытненько. :smile4: Как закончите выложите ссылку на скачивание, ок? Гляну на мегаизвращенные герои :smile1:
Желательно чтобы сюжетная линия была и интересные квесты. Глядишь турнир запустим :smile6:



Сюжет совпадает с сюжетом "книг" "Петька и Василий Иванович: Стратегический квест, Цена верности" и ещё там Петька с Василием Ивановичем будут помогать Годзилле, который на Энроте был пленником. :smile29: Но сейчас проблема не в этом. Я сделал так: создал папку /files/campain/ , положил туда сохраненные карты своей кампании, сейчас изменил команды в файлике dailog_selectfile.cpp так чтобы когда нажимаеш кнопку кампания, открывальсь загрузка файлов из папки /files/campain/, и потом молжно играть, а игра сохраняеться как обычно в папку /files/save/

Код: Выделить всё

/***************************************************************************
 *   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 <algorithm>
#include <iterator>
#include <ctime>
#include <cctype>
#include <sstream>
#include <string>

#include "system.h"
#include "dir.h"
#include "agg.h"
#include "text.h"
#include "button.h"
#include "cursor.h"
#include "settings.h"
#include "maps_fileinfo.h"
#include "interface_list.h"
#include "pocketpc.h"
#include "world.h"
#include "game.h"
#include "dialog.h"

std::string SelectFileListSimple(const std::string &, const std::string &, bool);
std::string SelectFileListSimpleCampain(const std::string &, const std::string &, bool);
bool RedrawExtraInfo(const Point &, const std::string &, const std::string &, const Rect &);

class FileInfoListBox : public Interface::ListBox<Maps::FileInfo>
{
public:
    FileInfoListBox(const Point & pt, bool & edit) : Interface::ListBox<Maps::FileInfo>(pt), edit_mode(edit) {};

    void RedrawItem(const Maps::FileInfo &, s32, s32, bool);
    void RedrawBackground(const Point &);

    void ActionCurrentUp(void);
    void ActionCurrentDn(void);
    void ActionListDoubleClick(Maps::FileInfo &);
    void ActionListSingleClick(Maps::FileInfo &);
    void ActionListPressRight(Maps::FileInfo &){};

    bool & edit_mode;
};

void FileInfoListBox::RedrawItem(const Maps::FileInfo & info, s32 dstx, s32 dsty, bool current)
{
    char short_date[20];
    time_t timeval = info.localtime;

    std::fill(short_date, ARRAY_COUNT_END(short_date), 0);
    std::strftime(short_date, ARRAY_COUNT(short_date) - 1, "%b %d, %H:%M", std::localtime(&timeval));
    std::string savname(System::GetBasename(info.file));

    if(savname.size())
    {
   Text text;
   const size_t dotpos = savname.size() - 4;
       if(StringLower(savname.substr(dotpos)) == ".sav") savname.erase(dotpos);
// T-800 Mod убрали .cam из имени игры
      if(StringLower(savname.substr(dotpos)) == ".cam") savname.erase(dotpos);
// T-800 Mod конец
   text.Set(savname, (current ? Font::YELLOW_BIG : Font::BIG));
   text.Blit(dstx + 5, dsty, (Settings::Get().QVGA() ? 190 : 155));
// T-800 Mod  Отключили даты в списке сохраненных игр
   //text.Set(short_date, (current ? Font::YELLOW_BIG : Font::BIG));
   //text.Blit(dstx + 265 - text.w(), dsty);
// T-800 Mod конец       
    }
}

void FileInfoListBox::RedrawBackground(const Point & dst)
{
    const Sprite & panel = AGG::GetICN(ICN::REQBKG, 0);

    if(Settings::Get().QVGA())
    {
   panel.Blit(Rect(0, 0, panel.w(), 120), dst.x, dst.y);
   panel.Blit(Rect(0, panel.h() - 120, panel.w(), 120), dst.x, dst.y + 224 - 120);
    }
    else
   panel.Blit(dst);
}

void FileInfoListBox::ActionCurrentUp(void)
{
    edit_mode = false;
}

void FileInfoListBox::ActionCurrentDn(void)
{
    edit_mode = false;
}

void FileInfoListBox::ActionListDoubleClick(Maps::FileInfo &)
{
    edit_mode = false;
}

void FileInfoListBox::ActionListSingleClick(Maps::FileInfo &)
{
    edit_mode = false;
}

std::string ResizeToShortName(const std::string & str)
{
    std::string res = System::GetBasename(str);
    size_t it = res.find('.');
    if(std::string::npos != it) res.resize(it);
    return res;
}

size_t GetInsertPosition(const std::string & name, s32 cx, s32 posx)
{
    if(name.size())
    {
   s32 tw = Text::width(name, Font::SMALL);
   if(cx <= posx)
       return 0;
   else
   if(cx >= posx + tw)
       return name.size();
   else
   {
       float cw = tw / name.size();
       return static_cast<size_t>((cx - posx) / cw);
   }
    }
    return 0;
}

MapsFileInfoList GetSortedMapsFileInfoList(void)
{
    ListFiles list1;
    list1.ReadDir(Settings::GetSaveDir(), ".sav", false);

    MapsFileInfoList list2(list1.size());
    int ii = 0;
    for(ListFiles::const_iterator itd = list1.begin(); itd != list1.end(); ++itd, ++ii) if(!list2[ii].ReadSAV(*itd)) --ii;
    if(static_cast<size_t>(ii) != list2.size()) list2.resize(ii);
    std::sort(list2.begin(), list2.end(), Maps::FileInfo::FileSorting);

    return list2;
}


// T-800 Mod

MapsFileInfoCampainList GetSortedMapsFileInfoCampainList(void)

{
    ListFiles list1;
    list1.ReadDir(Settings::GetCampainDir(), ".cam", false);

    MapsFileInfoList list2(list1.size());
    int ii = 0;
    for(ListFiles::const_iterator itd = list1.begin(); itd != list1.end(); ++itd, ++ii) if(!list2[ii].ReadSAV(*itd)) --ii;
    if(static_cast<size_t>(ii) != list2.size()) list2.resize(ii);
    std::sort(list2.begin(), list2.end(), Maps::FileInfo::FileSorting);

    return list2;
}

// Конец T-800 Mod 


bool IsPunct(char c)
{
    return true;
}

std::string Dialog::SelectFileSave(void)
{
    const Settings & conf = Settings::Get();
    const std::string & name = conf.CurrentFileInfo().name;

    std::string base = name.size() ? name : "newgame";
    base.resize(std::distance(base.begin(), std::find_if(base.begin(), base.end(), ::ispunct)));
    std::replace_if(base.begin(), base.end(), ::isspace, '_');
    std::ostringstream os;

    os << System::ConcatePath(Settings::GetSaveDir(), base) <<
       // add postfix:
       '_' << std::setw(4) << std::setfill('0') << world.CountDay() << ".sav";
    std::string lastfile = os.str();
    return SelectFileListSimple(_("File to Save:"), lastfile, true);
}

std::string Dialog::SelectFileLoad(void)
{
    const std::string & lastfile = Game::GetLastSavename();
    return SelectFileListSimple(_("File to Load:"), (lastfile.size() ? lastfile : ""), false);
}

std::string Dialog::SelectFileCampainLoad(void)
{
    const std::string & lastfile = Game::GetLastSavename();
    return SelectFileListSimpleCampain(_("Campain to Play:"),(lastfile.size() ? lastfile : ""), false);
}


std::string SelectFileListSimple(const std::string & header, const std::string & lastfile, bool editor)
{
    Display & display = Display::Get();
    Cursor & cursor = Cursor::Get();
    LocalEvent & le = LocalEvent::Get();

    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    const Sprite & sprite = AGG::GetICN(ICN::REQBKG, 0);
    Size panel(sprite.w(), sprite.h());
    bool pocket = Settings::Get().QVGA();
    if(pocket) panel = Size(sprite.w(), 224);

    SpriteBack back(Rect((display.w() - panel.w) / 2, (display.h() - panel.h) / 2, panel.w, panel.h));

    const Rect & rt = back.GetArea();
    const Rect enter_field(rt.x + 42, rt.y + (pocket ? 148 : 286), 260, 16);

    Button buttonOk(rt.x + 34, rt.y + (pocket ? 176 : 315), ICN::REQUEST, 1, 2);
    Button buttonCancel(rt.x + 244, rt.y + (pocket ? 176 : 315), ICN::REQUEST, 3, 4);

    bool edit_mode = false;

    MapsFileInfoList lists = GetSortedMapsFileInfoList();
    FileInfoListBox listbox(rt, edit_mode);

    listbox.RedrawBackground(rt);
    listbox.SetScrollButtonUp(ICN::REQUESTS, 5, 6, Point(rt.x + 327, rt.y + 55));
    listbox.SetScrollButtonDn(ICN::REQUESTS, 7, 8, Point(rt.x + 327, rt.y + (pocket ? 117 : 257)));
    listbox.SetScrollSplitter(AGG::GetICN(ICN::ESCROLL, 3), Rect(rt.x + 328, rt.y + 73, 12, (pocket ? 40 : 180)));
    listbox.SetAreaMaxItems(pocket ? 5 : 11);
    listbox.SetAreaItems(Rect(rt.x + 40, rt.y + 55, 265, (pocket ? 78 : 215)));
    listbox.SetListContent(lists);

    std::string filename;
    size_t charInsertPos = 0;

    if(lastfile.size())
    {
   filename = ResizeToShortName(lastfile);
   charInsertPos = filename.size();

   MapsFileInfoList::iterator it = lists.begin();
   for(; it != lists.end(); ++it) if((*it).file == lastfile) break;

   if(it != lists.end())
       listbox.SetCurrent(std::distance(lists.begin(), it));
   else
           listbox.Unselect();
    }

    if(!editor && lists.empty())
       buttonOk.SetDisable(true);

    if(filename.empty() && listbox.isSelected())
    {
        filename = ResizeToShortName(listbox.GetCurrent().file);
   charInsertPos = filename.size();
    }

    listbox.Redraw();
    RedrawExtraInfo(rt, header, filename, enter_field);

    buttonOk.Draw();
    buttonCancel.Draw();

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

    std::string result;
    bool is_limit = false;

    while(le.HandleEvents() && result.empty())
    {
        le.MousePressLeft(buttonOk) && buttonOk.isEnable() ? buttonOk.PressDraw() : buttonOk.ReleaseDraw();
        le.MousePressLeft(buttonCancel) ? buttonCancel.PressDraw() : buttonCancel.ReleaseDraw();

   listbox.QueueEventProcessing();

        if((buttonOk.isEnable() && le.MouseClickLeft(buttonOk)) || Game::HotKeyPressEvent(Game::EVENT_DEFAULT_READY))
        {
           if(filename.size())
      result = System::ConcatePath(Settings::GetSaveDir(), filename + ".sav");
           else
           if(listbox.isSelected())
          result = listbox.GetCurrent().file;
       }
       else
        if(le.MouseClickLeft(buttonCancel) || Game::HotKeyPressEvent(Game::EVENT_DEFAULT_EXIT))
        {
           break;
   }
   else
        if(le.MouseClickLeft(enter_field) && editor)
   {
       edit_mode = true;
       charInsertPos = GetInsertPosition(filename, le.GetMouseCursor().x, enter_field.x);
       if(Settings::Get().PocketPC())
      PocketPC::KeyboardDialog(filename);
           buttonOk.SetDisable(filename.empty());
       cursor.Hide();
   }
   else
   if(edit_mode && le.KeyPress() &&
       (!is_limit || KEY_BACKSPACE == le.KeyValue()))
   {
       charInsertPos = InsertKeySym(filename, charInsertPos, le.KeyValue(), le.KeyMod());
       buttonOk.SetDisable(filename.empty());
       cursor.Hide();
   }
   if((le.KeyPress(KEY_DELETE) || (pocket && le.MousePressRight())) && listbox.isSelected())
   {
       std::string msg(_("Are you sure you want to delete file:"));
       msg.append("\n \n");
       msg.append(System::GetBasename(listbox.GetCurrent().file));
       if(Dialog::YES == Dialog::Message(_("Warning!"), msg, Font::BIG, Dialog::YES | Dialog::NO))
       {
      System::Unlink(listbox.GetCurrent().file);
      listbox.RemoveSelected();
      if(lists.empty() || filename.empty()) buttonOk.SetDisable(true);
      listbox.SetListContent(lists);
       }
       cursor.Hide();
   }

   if(! cursor.isVisible())
   {
       listbox.Redraw();

       if(edit_mode && editor)
      is_limit = RedrawExtraInfo(rt, header, InsertString(filename, charInsertPos, "_"), enter_field);
       else
       if(listbox.isSelected())
       {
      filename = ResizeToShortName(listbox.GetCurrent().file);
      charInsertPos = filename.size();
      is_limit = RedrawExtraInfo(rt, header, filename, enter_field);
       }
       else
      is_limit = RedrawExtraInfo(rt, header, filename, enter_field);

       buttonOk.Draw();
       buttonCancel.Draw();
       cursor.Show();
       display.Flip();
   }
    }

    cursor.Hide();
    back.Restore();

    return result;
}

// T-800 Mod

std::string SelectFileListSimpleCampain(const std::string & header, const std::string & lastfile, bool editor)
{
    Display & display = Display::Get();
    Cursor & cursor = Cursor::Get();
    LocalEvent & le = LocalEvent::Get();

    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    const Sprite & sprite = AGG::GetICN(ICN::REQBKG, 0);
    Size panel(sprite.w(), sprite.h());
    bool pocket = Settings::Get().QVGA();
    if(pocket) panel = Size(sprite.w(), 224);

    SpriteBack back(Rect((display.w() - panel.w) / 2, (display.h() - panel.h) / 2, panel.w, panel.h));

    const Rect & rt = back.GetArea();
    const Rect enter_field(rt.x + 42, rt.y + (pocket ? 148 : 286), 260, 16);

    Button buttonOk(rt.x + 34, rt.y + (pocket ? 176 : 315), ICN::REQUEST, 1, 2);
    Button buttonCancel(rt.x + 244, rt.y + (pocket ? 176 : 315), ICN::REQUEST, 3, 4);

    bool edit_mode = false;

    MapsFileInfoCampainList lists = GetSortedMapsFileInfoCampainList();
    FileInfoListBox listbox(rt, edit_mode);

    listbox.RedrawBackground(rt);
    listbox.SetScrollButtonUp(ICN::REQUESTS, 5, 6, Point(rt.x + 327, rt.y + 55));
    listbox.SetScrollButtonDn(ICN::REQUESTS, 7, 8, Point(rt.x + 327, rt.y + (pocket ? 117 : 257)));
    listbox.SetScrollSplitter(AGG::GetICN(ICN::ESCROLL, 3), Rect(rt.x + 328, rt.y + 73, 12, (pocket ? 40 : 180)));
    listbox.SetAreaMaxItems(pocket ? 5 : 11);
    listbox.SetAreaItems(Rect(rt.x + 40, rt.y + 55, 265, (pocket ? 78 : 215)));
    listbox.SetListContent(lists);

    std::string filename;
    size_t charInsertPos = 0;

    if(lastfile.size())
    {
   filename = ResizeToShortName(lastfile);
   charInsertPos = filename.size();

   MapsFileInfoCampainList::iterator it = lists.begin();
   for(; it != lists.end(); ++it) if((*it).file == lastfile) break;

   if(it != lists.end())
       listbox.SetCurrent(std::distance(lists.begin(), it));
   else
           listbox.Unselect();
    }

    if(!editor && lists.empty())
       buttonOk.SetDisable(true);

    if(filename.empty() && listbox.isSelected())
    {
        filename = ResizeToShortName(listbox.GetCurrent().file);
   charInsertPos = filename.size();
    }

    listbox.Redraw();
    RedrawExtraInfo(rt, header, filename, enter_field);

    buttonOk.Draw();
    buttonCancel.Draw();

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

    std::string result;
    bool is_limit = false;

    while(le.HandleEvents() && result.empty())
    {
        le.MousePressLeft(buttonOk) && buttonOk.isEnable() ? buttonOk.PressDraw() : buttonOk.ReleaseDraw();
        le.MousePressLeft(buttonCancel) ? buttonCancel.PressDraw() : buttonCancel.ReleaseDraw();

   listbox.QueueEventProcessing();

        if((buttonOk.isEnable() && le.MouseClickLeft(buttonOk)) || Game::HotKeyPressEvent(Game::EVENT_DEFAULT_READY))
        {
           if(filename.size())
      result = System::ConcatePath(Settings::GetCampainDir(), filename + ".cam");
           else
           if(listbox.isSelected())
          result = listbox.GetCurrent().file;
       }
       else
        if(le.MouseClickLeft(buttonCancel) || Game::HotKeyPressEvent(Game::EVENT_DEFAULT_EXIT))
        {
           break;
   }
   else
        if(le.MouseClickLeft(enter_field) && editor)
   {
       edit_mode = true;
       charInsertPos = GetInsertPosition(filename, le.GetMouseCursor().x, enter_field.x);
       if(Settings::Get().PocketPC())
      PocketPC::KeyboardDialog(filename);
           buttonOk.SetDisable(filename.empty());
       cursor.Hide();
   }
   else
   if(edit_mode && le.KeyPress() &&
       (!is_limit || KEY_BACKSPACE == le.KeyValue()))
   {
       charInsertPos = InsertKeySym(filename, charInsertPos, le.KeyValue(), le.KeyMod());
       buttonOk.SetDisable(filename.empty());
       cursor.Hide();
   }
   if((le.KeyPress(KEY_DELETE) || (pocket && le.MousePressRight())) && listbox.isSelected())
   {
       std::string msg(_("Are you sure you want to delete file:"));
       msg.append("\n \n");
       msg.append(System::GetBasename(listbox.GetCurrent().file));
       if(Dialog::YES == Dialog::Message(_("Warning!"), msg, Font::BIG, Dialog::YES | Dialog::NO))
       {
      System::Unlink(listbox.GetCurrent().file);
      listbox.RemoveSelected();
      if(lists.empty() || filename.empty()) buttonOk.SetDisable(true);
      listbox.SetListContent(lists);
       }
       cursor.Hide();
   }

   if(! cursor.isVisible())
   {
       listbox.Redraw();

       if(edit_mode && editor)
      is_limit = RedrawExtraInfo(rt, header, InsertString(filename, charInsertPos, "_"), enter_field);
       else
       if(listbox.isSelected())
       {
      filename = ResizeToShortName(listbox.GetCurrent().file);
      charInsertPos = filename.size();
      is_limit = RedrawExtraInfo(rt, header, filename, enter_field);
       }
       else
      is_limit = RedrawExtraInfo(rt, header, filename, enter_field);

       buttonOk.Draw();
       buttonCancel.Draw();
       cursor.Show();
       display.Flip();
   }
    }

    cursor.Hide();
    back.Restore();

    return result;
}
// T-800 Mod конец


bool RedrawExtraInfo(const Point & dst, const std::string & header, const std::string & filename, const Rect & field)
{
    Text text(header, Font::BIG);
    text.Blit(dst.x + 175 - text.w() / 2, dst.y + 30);

    if(filename.size())
    {
   text.Set(filename, Font::BIG);
   text.Blit(field.x, field.y + 1, field.w);
    }

    return text.w() + 10 > field.w;
}



И мне сейчас надо сделать 3 вещи: первое чтобы не было видно и нельзя было сразу загружать файлы со второго по 4й эпизоды (но это я уже придумал как, их надо просто их переименовать из .cam например в .с2m .c3m в с4m и тогда они в списке не отображаются и загрузить можно только первый эпизод. А вот как сделать чтобы по окончании первой игры сразу загружалась вторая, а после второй сразу третья не знаю. Как это вобще делается? Написать команду что когда закочилась игра на карте с именем T-800 Эпизод-I чтобы загружала игру из папочки /files/campain/ с именем t-800.c2m? Или как? И как считать рейтинг компании тоже придумать не могу. Как это сделать?
Вернуться к началу

offlineАватара пользователя
Orzie  
Ветеран
Ветеран
 
Сообщения: 683
Зарегистрирован: 12 сен 2013, 15:17
Откуда: Томск
Пол: Не указан
Награды: 3
Высшая медаль (1) 3 место 1 этапа по HMM1 (1) Бонусный шлем (1)
Поблагодарили: 440 раз.

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

Сообщение Orzie » 12 сен 2015, 17:13

Цитата:
Глядишь турнир запустим

Свят, свят :)
Вернуться к началу

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

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

Сообщение t800 » 14 сен 2015, 14:56

Разобрался с командой как можно сразу запускать игру кампании а не через меню. :smile21: :smile21: :smile21:

Для этого в файле `src\fheroes2\game\game_over.cpp` в функции GameOver::Result::LocalCheckGameOver поменял 338-339 строки на


Код: Выделить всё

GameOver::DialogWins(result);

if (Settings::Get().GameType(Game::TYPE_CAMPAIGN))
{
   res = Game::NEXTCAMPAIN;
}
else
{
   res = Game::HIGHSCORES;
}


И еще в файлах fheroes2.cpp game.h где строчки с командами NEWCAMPAIN скопировал ниже и поменял
в них NEWCAMPAIN на NEХTCAMPAIN

А в файл newgame.cpp добавил

Код: Выделить всё
int Game::NextCampain(void)
{
   std::string file = "files/campain/T-800 Epizode 1.sav";
   if(file.empty() || !Game::Load(file)) return MAINMENU;
   return STARTGAME;
}


Потом собрал игру и сейчас после окончания первой игры компании сразу же запустилась вторая! :smile21: :smile21: :smile21:



И еще я подумал что для турнира наверное надо будет сделать чтобы вычислялся рейтиг кампании.

А чтобы можно было сделать много сюжетных линии наверно надо чтобы игра следующие эпизоды не сама из себя брала как я сейчас сделал , а чтобы из текстового файлика t800.txt который положить в папочку campain и чтобы в нем записывать имена сейвов в том порядке как их надо загружать так будет проще эпизоды добавлять и даже КАМПАНИИ! Чтобы так было: кампания называется T-800 берет из файлика T-800.txt , а если называется Chapaev то берет из файлика Chapaev.txt .

Как это лучше сделать?
Вернуться к началу

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

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

Сообщение t800 » 15 сен 2015, 12:23

Добавил оригинальные компании



Для этого просто надо было переименовать файлы оригинальных кампаний из .НС2 сперва в .MP2 потом отрыть эпизоды через Standart Game пересохранить перенести сейвы в папочку campain и переименовать их в .саm и все получилось!

Но никак не могу разобоаться с командами чтобы игра порядок эпизодов брала из текстового файликиков t800.txt good1.txt и evil1.txt которые я положил положить в папочку campain с именами эпизодов

Вот например good1.txt

Код: Выделить всё
CAMPG01.cam
CAMPG02.cam
CAMPG03.cam
CAMPG04.cam
CAMPG05B.cam
CAMPG05.cam
CAMPG06.cam
CAMPG07.cam
CAMPG08.cam
CAMPG09.cam
CAMPG10.cam
CAMPE11.cam


Не могу разобраться какие команды надо вставить в

Код: Выделить всё
int Game::NextCampain(void)
{
   std::string file = "files/campain/T-800 Epizode 1.sav";
   if(file.empty() || !Game::Load(file)) return MAINMENU;
   return STARTGAME;
}



Вместо std::string file = "files/campain/T-800 Epizode 1.sav";
чтобы игра брала список из файла смотрела какую игру она сейчас закончила
например CAMPG01.cam и загружала следующую по списку.
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 61 раз.

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

Сообщение DeathLust » 16 сен 2015, 20:49

Изучаем, как в C++ делается чтение из файла, пишем функцию, которая читает и возвращает содержимое нужной строчки, присваиваем результат строковой переменной file, PROFIT.
Вернуться к началу

След.

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

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

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

cron