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

Всё об игре Quake

Модераторы: t800, Скрипач

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

Сообщение t800 » 20 ноя 2015, 19:33

Решил скопировать свою тему с HandBookHMM и свои сообщения на DF2 по разработке Кампании для fheroes2 сюда чтобы ничего не потерялось

Я хочу сделать компанию для 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 build-essential


Потом другую

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


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

Как это сделать?
Последний раз редактировалось t800 16 июл 2016, 16:33, всего редактировалось 5 раз(а).
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

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

Сообщение t800 » 20 ноя 2015, 19:35

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

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

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

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


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

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



Правда не могу понять что надо как сделать чтобы после окончания первого эпизода сразу запускался следующий и чтобы нельзя было запустить до того как сыграл предыдущий потому что сейчас они все запускаются
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

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

Сообщение t800 » 20 ноя 2015, 19:39

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

Для этого в файле `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;
}


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



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

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

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

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

Сообщение t800 » 20 ноя 2015, 19:42

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



Для этого просто надо было переименовать файлы оригинальных кампаний из .НС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 и загружала следующую по списку.
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

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

Сообщение t800 » 27 июн 2016, 10:26

Наконец то закончил с Компаниями для Free Heroes вроде все работает!



Если кто хочет можете протестировать и написать в этой теме (или в T-800 Мod ) что вы думаете о кампаниях и удачно ли это вышло.

Вот ссылка для скачивания на новый движок с настроеными компаниями (T-800 и две оригинальные из Heroes2 за Роланда и Арчибальда) В архиве исходники и уже собранная игра под Ubuntu

http://wiki.kvkozyrev.org/fheroes/fheroes2_cam_v1.zip

(Примечание: Для запуска игры необходимы файлы heroes2.agg и heroes2x.agg из оригинальных Heroes2 - их надо положить в папку Data )

Насколько я понимаю также игру можно собрать под Windows и Андроид потому что за основу я брал оригинальные исходники про которые было написано что они собираются под Linux, Windows и Андроид
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

След.

Вернуться в Quake

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

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

cron