Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Free Heroes II
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic > Heroes II
Страницы: 1, 2, 3, 4, 5
t800
Цитата(SandySandy @ 02 Feb 2009, 08:25) *
проект лежит здесь:
https://sourceforge.net/projects/fheroes2

Есть все утилиты для распаковки ресурсов.
Играет на любых разрешениях экрана (максимум как позволит карта), на ноутбуках 1280х800 например без проблем.
Играет оригинальная музыка midi.
В режиме боя много ошибок с отрисовкой, но обещаем поправить (пишется новый алгоритм battle).
Есть AI, но пока не нападает а только развивается.
Есть возможность грузить альтернативные спрайты png.
И для разнообразия можно грузить в hotsit, работает.

закачать win32 версию можно здесь:
http://sourceforge.net/project/showfiles.php?group_id=96859

для любителей альтернативных систем там же можно закачать исходники, и собрать самостоятельно.

Все пожелания высказываем здесь.


Здравствуйте я хочу изменить Free Heroes II сделать компании и сетевую игру. Как это сделать?
Orzie
Человека уже пять лет не было здесь.

Отвечу, впрочем, за него - никак не сделаешь.
t800
Цитата(Orzie @ 30 Aug 2015, 07:45) *
Человека уже пять лет не было здесь.

Отвечу, впрочем, за него - никак не сделаешь.


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





Vade Parvis
t800
Цитата(Vade Parvis @ 30 Aug 2015, 13:11) *


Зачем вы кошек показываете? Здесь тема про Free Heroes II. Ответили бы лучше про разработку.
t800
И еще у меня вопросы по сборке Free Heroes II из исходников под Ubuntu.

Я скачал какие-то исходники с http://sourceforge.net/projects/fheroes2/f...2-20111117.zip/

Но они под виндоз а мне нужны под Ubuntu. Уже собранная версия под Ubuntu есть а где взять ее исходники?
На http://sourceforge.net/projects/fheroes2/files/ я их не нашел.
t800
На сайте http://sourceforge.net/p/fheroes2/code/HEAD/tree/trunk/
по ссылке Download snapshot скачал папку fheroes2 и кажется это исходники.
Не могу понять что дальше делать? Как мне собрать игру из исходников под Ubuntu?
И где и что надо изменить чтобы вставить в игру камапанию?
Orzie
Программировать надо, дружок, программировать.
t800
Цитата(Orzie @ 30 Aug 2015, 17:56) *
Программировать надо, дружок, программировать.


Про программировать я понимаю, пишешь в файле команды а потом компьютер их выполняет.

Вот я нашел файл который делает меню новой игры 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/HEA...ewgame.cpp#l175
http://sourceforge.net/p/fheroes2/code/HEA...ewgame.cpp#l181

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

Как мне теперь собрать игру?
Orzie
Тебе понадобится компилятор. Сам я в программировании полный профан, но может быть, сможет помочь кто-то более умелый.

Тем не менее, кампании могли быть выключены не зря, и тебе вполне может потребоваться доделывать фрихероес самому, что ты гарантированно не сможешь.
Эроласт
Цитата
Как мне теперь собрать игру?

На линуксах программы обычно с помощью Makefile собирают. Попробуй в папке с проектом
Код
$ make all
t800
Цитата(Эроласт @ 31 Aug 2015, 13:33) *
Цитата
Как мне теперь собрать игру?

На линуксах программы обычно с помощью Makefile собирают. Попробуй в папке с проектом
Код
$ make all



Попробовал написать make all что-то заругалась:

Код
danya@danya:~/fheroes2-code-3277-trunk/fheroes2$ make all
make -C src WITH_AI=empty
make[1]: sdl-config: Команда не найдена
make[1]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src'
make[1]: sdl-config: Команда не найдена
make[1]: libpng-config: Команда не найдена
make[1]: libpng-config: Команда не найдена
make -C xmlccwrap
make[2]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/xmlccwrap'
g++ -c -MD gzstream.cpp  -O2  -Wall -fsigned-char -DWITH_MIXER -DWITH_IMAGE  -DWITH_ZLIB -DWITH_TTF -DWITH_XML -DWITH_ZLIB -DWITH_ICONV
In file included from gzstream.cpp:29:0:
gzstream.h:35:18: фатальная ошибка: zlib.h: Нет такого файла или каталога
компиляция прервана.
make[2]: *** [gzstream.o] Ошибка 1
make[2]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/xmlccwrap'
make[1]: *** [all] Ошибка 2
make[1]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src'
make: *** [all] Ошибка 2


Что делать?
Эроласт
Цитата
Команда не найдена

Ну так установи.

Если еще не ставил build-essentials - поставь сначала его, затем сделай make еще раз и ставь недостающее.
t800
Цитата(Эроласт @ 31 Aug 2015, 16:08) *
Цитата
Команда не найдена

Ну так установи.

Если еще не ставил build-essentials - поставь сначала его, затем сделай make еще раз и ставь недостающее.


Дал команду

Код
danya@danya:~$ sudo apt-get install sdl-config
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
E: Не удалось найти пакет sdl-config
danya@danya:~$


Дал команду

Код
danya@danya:~$ sudo apt-get install build-essentials
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
E: Не удалось найти пакет build-essentials


Что делать?

у меня Ubuntu 12.04
Эроласт
sudo apt-get update когда в последний раз делал?
t800
Цитата(Эроласт @ 31 Aug 2015, 16:39) *
sudo apt-get update когда в последний раз делал?


Не знаю. Ubuntu когда включаю она сама обновляется.
Эроласт
Ну так сделай.
t800
Написал в гугле sdl-config ubuntu 12.04 и нашел такую команду: sudo apt-get install libsdl1.2-dev

Дал команду

Код
sudo apt-get install libsdl1.2-dev


Теперь опять дал команду make all

Все равно ругается, но уже по другому

Код
danya@danya:~/fheroes2-code-3277-trunk/fheroes2$ make all
make -C src WITH_AI=empty
make[1]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src'
make -C xmlccwrap
make[2]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/xmlccwrap'
make[2]: Цель `all' не требует выполнения команд.
make[2]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/xmlccwrap'
make -C engine
make[2]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/engine'
g++ -c -MD audio_mixer.cpp -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -O2  -Wall -fsigned-char -DWITH_MIXER -DWITH_IMAGE -I/usr/include/libpng12 -DWITH_ZLIB -DWITH_TTF -DWITH_XML -DWITH_ZLIB -DWITH_ICONV
In file included from engine.h:33:0,
                 from audio_mixer.cpp:25:
font.h:35:21: фатальная ошибка: SDL_ttf.h: Нет такого файла или каталога
компиляция прервана.
make[2]: *** [audio_mixer.o] Ошибка 1
make[2]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/engine'
make[1]: *** [all] Ошибка 2
make[1]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src'
make: *** [all] Ошибка 2


Что ему не нравится?
Эроласт
Цитата
Что ему не нравится?

Цитата
фатальная ошибка: SDL_ttf.h: Нет такого файла или каталога
компиляция прервана.


build-essentials поставь.

Код
$ sudo apt-get update
$ sudo apt-get install build-essentials


Если не заработает - гугли что за SDL_ttf.h и где его взять. Как-нибудь так: https://www.google.com/search?q=SDL_ttf.h+no+such+file.
t800
Кажется получилось brags.gif brags.gif

Цитата(Эроласт @ 31 Aug 2015, 17:12) *
build-essentials поставь.

Код
$ sudo apt-get update
$ sudo apt-get install build-essentials


Так не получилось все равно написала

Код
sudo apt-get install build-essentials
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
E: Не удалось найти пакет build-essentials




Цитата
Если не заработает - гугли что за SDL_ttf.h и где его взять. Как-нибудь так: https://www.google.com/search?q=SDL_ttf.h+no+such+file.


Тогда я через ошибку SDL_ttf.h в гугле нашел такую команду: sudo apt-get install libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev

Написал

Код
sudo apt-get install libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev


Потом дал опять команду make all

Компьтер стал что-то долго делать. Десять минут писал какие то.

Код
d.o zzlib.o
a - audio_cdrom.o
a - audio.o
a - audio_mixer.o
a - audio_music.o
a - dir.o
a - display.o
a - engine.o
a - error.o
a - font.o
a - IMG_savepng.o
a - localevent.o
a - rand.o
a - rect.o
a - sdlnet.o
a - serialize.o
a - sprites.o
a - surface.o
a - system.o
a - thread.o
a - tinyconfig.o
a - tools.o
a - translations.o
a - xmi2mid.o
a - zzlib.o
make[2]: Выход из каталога `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/engine'
make -C dist
make[2]: Вход в каталог `/home/danya/fheroes2-code-3277-trunk/fheroes2/src/dist'
cxx: agg.o
cxx: icn.o
cxx: m82.o
cxx: mus.o
cxx: sprite.o
cxx: til.o
cxx: xmi.o
cxx: ai_action.o
cxx: army_bar.o
cxx: army.o
cxx: army_troop.o
cxx: battle_action.o
cxx: battle_arena.o
cxx: battle_army.o
cxx: battle_board.o
cxx: battle_bridge.o
cxx: battle_catapult.o
cxx: battle_cell.o
cxx: battle_command.o
cxx: battle_dialogs.o
cxx: battle_grave.o
cxx: battle_interface.o
cxx: battle_main.o
cxx: battle_only.o
cxx: battle_tower.o
cxx: battle_troop.o
cxx: buildinginfo.o
cxx: captain.o
cxx: castle_building.o
cxx: castle.o
cxx: castle_dialog.o
cxx: castle_mageguild.o
cxx: castle_tavern.o
cxx: castle_town.o
cxx: castle_well.o
cxx: mageguild.o
cxx: dialog_adventure.o
cxx: dialog_arena.o
cxx: dialog_armyinfo.o
cxx: dialog_box.o
cxx: dialog_buyboat.o
cxx: dialog_chest.o
cxx: dialog_file.o
cxx: dialog_frameborder.o
cxx: dialog_gameinfo.o
cxx: dialog_giftresources.o
cxx: dialog_guardian.o
cxx: dialog_levelup.o
cxx: dialog_marketplace.o
cxx: dialog_message.o
cxx: dialog_quickinfo.o
cxx: dialog_recrut.o
cxx: dialog_resourceinfo.o
cxx: dialog_selectcount.o
cxx: dialog_selectfile.o
cxx: dialog_selectitems.o
cxx: dialog_selectscenario.o
cxx: dialog_settings.o
cxx: dialog_skillinfo.o
cxx: dialog_spellinfo.o
cxx: dialog_spriteinfo.o
cxx: dialog_system.o
cxx: dialog_thievesguild.o
cxx: difficulty.o
cxx: fheroes2.o
cxx: game.o
cxx: game_delays.o
cxx: game_highscores.o
cxx: game_hotkeys.o
cxx: game_interface.o
cxx: game_io.o
cxx: game_loadgame.o
cxx: game_mainmenu.o
cxx: game_newgame.o
cxx: game_over.o
cxx: game_scenarioinfo.o
cxx: game_startgame.o
cxx: game_static.o
cxx: button.o
cxx: cursor.o
cxx: interface_border.o
cxx: interface_buttons.o
cxx: interface_cpanel.o
cxx: interface_events.o
cxx: interface_focus.o
cxx: interface_gamearea.o
cxx: interface_icons.o
cxx: interface_radar.o
cxx: interface_status.o
cxx: splitter.o
cxx: statusbar.o
cxx: text.o
cxx: direction.o
cxx: heroes_action.o
cxx: heroes_base.o
cxx: heroes.o
cxx: heroes_dialog.o
cxx: heroes_indicator.o
cxx: heroes_meeting.o
cxx: heroes_move.o
cxx: heroes_recruits.o
cxx: heroes_spell.o
cxx: route.o
cxx: route_pathfind.o
cxx: skill.o
cxx: color.o
cxx: kingdom.o
cxx: kingdom_overview.o
cxx: luck.o
cxx: morale.o
cxx: payment.o
cxx: profit.o
cxx: puzzle.o
cxx: race.o
cxx: speed.o
cxx: week.o
cxx: world.o
cxx: world_loadmap.o
cxx: ground.o
cxx: maps_actions.o
cxx: maps.o
cxx: maps_fileinfo.o
cxx: maps_objects.o
cxx: maps_tiles.o
cxx: maps_tiles_quantity.o
cxx: mp2.o
cxx: position.o
cxx: visit.o
cxx: monster.o
cxx: mounts.o
cxx: objcrck.o
cxx: objdirt.o
cxx: objdsrt.o
cxx: objgras.o
cxx: objlava.o
cxx: objmult.o
cxx: objsnow.o
cxx: objswmp.o
cxx: objtown.o
cxx: objwatr.o
cxx: objxloc.o
cxx: trees.o
cxx: pocketpc_armyinfo.o
cxx: pocketpc_castle.o
cxx: pocketpc_dialog.o
cxx: pocketpc_heroes.o
cxx: pocketpc_kingdom.o
cxx: pocketpc_mainmenu.o
cxx: pocketpc_meeting.o
cxx: pocketpc_selectscenario.o
cxx: pocketpc_thievesguild.o
cxx: artifact.o
cxx: artifact_ultimate.o
cxx: maps_text.o
cxx: resource.o
cxx: spell_book.o
cxx: spell.o
cxx: spell_storage.o
cxx: gamedefs.o
cxx: players.o
cxx: settings.o
cxx: test.o
cxx: test_monstersprite.o
cxx: ai_empty.o


После чего создал мне файл fheroes2 brags.gif brags.gif brags.gif
Эроласт
Цитата
Так не получилось все равно

А, тьфу, s на конце лишняя, надо было
Код
$ sudo apt-get install build-essential

Ну да хрен с ним, если и без него работает.

Цитата
Компьтер стал что-то долго делать. Десять минут писал какие то.

Это он генерировал объектные файлы: промежуточный продукт компиляции, из которых уже собирается готовый бинарник. В последствии, если ты изменишь код в одном файле, то компилятору достаточно будет перекомпилировать только его.
t800
Кнопка компании появилась! brags.gif brags.gif




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




Что делать?


Сейчас у меня файл 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;
}
Orzie
Она и не должна работать, лол. Я же предупреждал. Ты всего лишь вернул картинку в игру, но скорее всего, кода, который заставит её работать, в фрихероес в принципе нет.

Пиши автору, ищи его емейл на сайте проекта. Я сейчас в другом городе и не могу посмотреть свою переписку с ним.
t800
Цитата(Orzie @ 01 Sep 2015, 09:48) *
Пиши автору, ищи его емейл на сайте проекта. Я сейчас в другом городе и не могу посмотреть свою переписку с ним.


Я писал на fheroes2@gmail.com неделю назад еще никто не ответил.

Цитата(Orzie @ 01 Sep 2015, 09:48) *
Она и не должна работать, лол. Я же предупреждал. Ты всего лишь вернул картинку в игру, но скорее всего, кода, который заставит её работать, в фрихероес в принципе нет.


Я нарисовал карты по сценарию. Хочу сделать чтобы когда нажимаю кнопку компания сразу запускалась игра на первой карте, а картинки потом сделаю, вначале пусть сразу играет и чтобы когда игра закончится сразу игра на следующей карте шла. А автор на письмо не отвечает sad.gif
Эроласт
Цитата
Хочу сделать чтобы когда нажимаю кнопку компания сразу запускалась игра на первой карте

Изучай С++, реализуй, в чем проблемы-то? Компилировать вон уже научился)
t800
Цитата(Эроласт @ 01 Sep 2015, 10:45) *
Цитата
Хочу сделать чтобы когда нажимаю кнопку компания сразу запускалась игра на первой карте

Изучай С++, реализуй, в чем проблемы-то? Компилировать вон уже научился)


А вы скажите какие команды надо написать чтобы когда кнопку компании нажимаешь игра на моей карте запускалась и я их выучу.
Эроласт
Ну, во-первых, просто команд (только давай по-нормальному: алгоритма) тебе будет недостаточно, надо еще знать, куда их вставлять; во-вторых, ни того, ни другого не узнать без изучения кода движка.
t800
Цитата(Эроласт @ 01 Sep 2015, 10:24) *
Ну, во-первых, просто команд (только давай по-нормальному: алгоритма) тебе будет недостаточно, надо еще знать, куда их вставлять; во-вторых, ни того, ни другого не узнать без изучения кода движка.


Вставлять в файл game_newgame.cpp он же новую игру запускает потому что называется newgame.

Там про команию есть такие команды

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


Я просмотрел это значит что программа говорит "Новая компания: в стадии строительства"
А надо чтобы не говорила "Новая компания: в стадии строительства" а просто запустила игру на моей карте.
Ей надо вместо команды VERBOSE("New Campain Game: under construction."); дать команду
сразу запустить новую игру на моей карте, просто я не знаю какой командой.
Эроласт
Цитата
надо чтобы не говорила "Новая компания: в стадии строительства" а просто запустила игру на моей карте.

Посмотри, как это реализовано в функции Game::NewStandard.

Но толку? Это будет обычный сценарий, без возможности начала следующего в кампании с переходом героя.
t800
Цитата(Эроласт @ 01 Sep 2015, 11:26) *
Цитата
надо чтобы не говорила "Новая компания: в стадии строительства" а просто запустила игру на моей карте.

Посмотри, как это реализовано в функции Game::NewStandard.

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


Герой же все равно сразу на карте прописан. Можно сделать чтобы после окончания первой игры сразу запускалась игра на второй карте. Правда с рейтингом не понятно что будет. Но это потом можно сделать когда картинки вставлять буду.
t800
Я сейчас хочу сделать так. Нажимаешь кнопку Компания. Сразу запускается игра с карты номер 1. Без выбора и без ничего. Просто Герой сразу на карте оказывается. Если игрок первую игру выигрывает то открывается игра на карте номер 2 и так далее. Должна же быть какая то команда чтобы запустила игру на карте. И чтобы если игрок игру на моей карте закончил сразу запустила игру на второй карте.
Эроласт
Цитата
Ну, во-первых, просто команд (только давай по-нормальному: алгоритма) тебе будет недостаточно, надо еще знать, куда их вставлять; во-вторых, ни того, ни другого не узнать без изучения кода движка.

Причем, куда вставлять - это не просто файл, это еще и функция и порядок в функции.

Херней страдаешь, в общем. То, что ты пытаешься делать, называется программированием, а программировать ты не умеешь. Сперва научись.
t800
Цитата(Эроласт @ 01 Sep 2015, 17:02) *
Цитата
Ну, во-первых, просто команд (только давай по-нормальному: алгоритма) тебе будет недостаточно, надо еще знать, куда их вставлять; во-вторых, ни того, ни другого не узнать без изучения кода движка.

Причем, куда вставлять - это не просто файл, это еще и функция и порядок в функции.

Херней страдаешь, в общем. То, что ты пытаешься делать, называется программированием, а программировать ты не умеешь. Сперва научись.


Но вы ведь умеете. Подскажите куда что вставлять. Я посмотрю и попробую научится.
SaintDark
Цитата(t800 @ 02 Sep 2015, 01:08) *
Но вы ведь умеете. Подскажите куда что вставлять. Я посмотрю и попробую научится.


Ты сейчас предложил сделать дело за тебя. Тебе уже написали, что стоит начать с изучения языка программирования (но имхо, с с++ начинать ой как не стоит, все желание отпадет). Практика, и еще раз практика. Как разберешься в основах, можешь копать глубже. В итоге придешь к желаемому результату. Есть то, что дается не так просто, как хотелось бы.
Эроласт
Цитата
Но вы ведь умеете. Подскажите куда что вставлять. Я посмотрю и попробую научится.

Умею. Но
Цитата
Ну, во-первых, просто команд (только давай по-нормальному: алгоритма) тебе будет недостаточно, надо еще знать, куда их вставлять; во-вторых, ни того, ни другого не узнать без изучения кода движка.


То есть, ты не понял, что такое программирование в принципе. Это не все равно, что скопировать в терминал убунты несколько команд из гугла. Программный код - это сложная система, где все взаимосвязано. Нельзя просто так взять и приписать к существующему коду новый функционал; это все равно, что ты сейчас притащишь партитуру симфонии и спросишь, какие ноты надо вставить, чтобы звучало повеселей.

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

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

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

Код
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);
}


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

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



Правда не могу понять что надо как сделать чтобы после окончания первого эпизода сразу запускался следующий
и чтобы нельзя было запустить до того как сыграл предыдущий потому что сейчас они все запускаются sad.gif
Orzie
Рад, что ты быстро учишься. Но слово Campaign пиши правильно, заклинаю тебя.
Эроласт
Цитата
Чтобы легко было менять команды это надо делать не через блокнотик. А через редактор Anjuta потому что у него подсказки!

Ну да. Это называется IDE, то есть, Integrated Development Environment. Anjuta не единственна в своем роде, существуют и другие подобные. Советую как-нибудь погуглить "linux c++ IDE" и поизучать варианты.

Цитата
после окончания первого эпизода сразу запускался следующий

Можно в файле `src\fheroes2\game\game_over.cpp` в функции GameOver::Result::LocalCheckGameOver поменять 338-339 строки на
Код
GameOver::DialogWins(result);

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

Тогда при завершении сценария будет сразу открываться меню выбора кампании.

Большего не подскажу: для этого надо весь код проекта изучать, а он большой и грязный.

Цитата
слово Campaign пиши правильно, заклинаю тебя

Аха. И, пожалуйста, "код", а не "команды". Команды - это в терминале.

---

Вообще, советую не увлекаться копипастингом и подбором. Хочешь нормально программировать - изучи сперва язык.
t800
Цитата(Эроласт @ 12 Sep 2015, 22:06) *
Можно в файле `src\fheroes2\game\game_over.cpp` в функции GameOver::Result::LocalCheckGameOver поменять 338-339 строки на
Код
GameOver::DialogWins(result);

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

Тогда при завершении сценария будет сразу открываться меню выбора кампании.


Попробовал в game_over.cpp сделать как вы сказали. Не открывается меню выбора камании. no.gif no.gif

Выдает рейтинг а потом в главное меню.

Я Потом даже на всякий случай в game_newgame.cpp палочки перед кодом команды

//Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);

убрал я и вот так сделал

Код
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;

}


И все равно выдает рейтинг а потом в главное меню. dunno.gif

Эроласт
Цитата
в game_newgame.cpp палочки перед кодом команды

//Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);

убрал

А, ну да, так и надо. Зачем ты их вообще туда ставил?)

Цитата
И все равно выдает рейтинг а потом в главное меню.

Тогда хз. По логике должно было заработать.
Цитата
для этого надо весь код проекта изучать, а он большой и грязный
t800
Цитата(Эроласт @ 13 Sep 2015, 10:18) *
Цитата
в game_newgame.cpp палочки перед кодом команды

//Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);

убрал

А, ну да, так и надо. Зачем ты их вообще туда ставил?)

Цитата
И все равно выдает рейтинг а потом в главное меню.

Тогда хз. По логике должно было заработать.
Цитата
для этого надо весь код проекта изучать, а он большой и грязный



Я сделал поиск по TYPE_CAMPAIGN и нашел в файлике game.h такую команду

Код
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 };

Решил поменять коде команды TYPE_CAMPAIGN на TYPE_STANDARD чтоб проверить что будет


Код
GameOver::DialogWins(result);

if (Settings::Get().GameType(Game::TYPE_STANDART))
{
    res = GAME::NEWCAMPAIN;
}
else
{
    res = Game::HIGHSCORES;
}


Собрал игру и она действительно открыла меню Кампании.



Я думаю что она считает что игра STANDART не CAMPAIGN Но не могу понять как она это определяет. Может это где-нибудь в самой карте надо прописать? Просто сейчас ведь эпизоды компании через зашрузку сейвов стандартных игр сделал. Как она вообще узнает что это STANDART? Эти цифирки TYPE_CAMPAIGN = 0x02 что они обозначают?
Может их куда-нибудь в сейв игры написать надо?
Haart of the Abyss
Цитата
Я сделал поиск по TYPE_CAMPAIGN и нашел в файлике game.h такую команду

Код
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 };


Кажется мне, что это команда, делающая из разных переменных одно число, хранящее в двоичной записи в разных разрядах данные о разных характеристиках игры. Стандартная игра записана числом 1, загрузка сохранённой игры — шестнадцатеричным числом 80 (128 в десятичной записи, 10000000 в двоичной). Игра тут обращается к каждому двоичному знаку переменной, смотря, ноль там или единица, для разных параметров. Обычно такой формат используется, когда может быть несколько таких состояний одновременно (число 16 в шестнадцатеричной=22 в десятичной=10110 в двоичной обозначало бы игру, являющуюся battle-only, кампанией и хотситом одновременно; никаким другим сочетанием параметров такую сумму тут не получишь) — например, флаги существ в большинстве игр, так как проще завести одно такое число, чем по переменной на каждый флаг — но зафига он использован тут, не очень ясно.


Всем скептикам в теме (особенно вам двоим, вы знаете, кого я имею в виду: у человека есть мозги, энтузиазм, способность разбираться, он сейчас с нулём помощи на чистом методе тыка без мануалов ушёл потрясающе далеко. Чем твердить "учи язык", дайте ему ссылки на мануалы — вооружившись ими, Т-800, по-моему, горы свернёт. Лишь бы энтузиазм не пропал и талант не зарыли — с такими задатками и с хоть какими материалами для изучения через несколько лет легко получится второй Феанор.

P. S. Не удивлюсь, если кода на то, чтобы переходить от одного сценария кампании сразу к другому, а не выходить на экран победы, и чтобы карты кампаний не отображались как обычные, в проекте просто ещё нет и его придётся дописать самому.
SaintDark
Тут скорее не обозначение типа игры как таковой, а обозначение текущего состояния (сцены?!) экрана. Так, например, type_campaign - окно (выбора?!) кампании, scenario - сценария, battleonly - состояния битвы, loadfile - загрузки файла, multi -выбор режима. Все вышесказанное является догадками, не претендующими на безоговорочную истину.
Эроласт
Цитата
Я думаю что она считает что игра STANDART не CAMPAIGN Но не могу понять как она это определяет. Может это где-нибудь в самой карте надо прописать?

Вообще тип игры должен был установиться через Settings::Get().SetGameType(Game::TYPE_CAMPAIGN) в функции начала компании. Почему в итоге оказывается Game::TYPE_STANDARD вместо Game::CAMPAIGN - хз.

Цитата
Эти цифирки TYPE_CAMPAIGN = 0x02 что они обозначают?

Это шестнадцатиричный формат записи числа.



Цитата
н сейчас с нулём помощи на чистом методе тыка без мануалов ушёл потрясающе далеко

Запилить скопировать реализацию интерфейса начала кампании - это далеко?)

Цитата
дайте ему ссылки на мануалы

Что за мануалы?
t800
Цитата(Лорд Хаарт @ 13 Sep 2015, 18:24) *
Цитата
Я сделал поиск по TYPE_CAMPAIGN и нашел в файлике game.h такую команду

Код
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 };


Кажется мне, что это команда, делающая из разных переменных одно число, хранящее в двоичной записи в разных разрядах данные о разных характеристиках игры. Стандартная игра записана числом 1, загрузка сохранённой игры — шестнадцатеричным числом 80 (128 в десятичной записи, 10000000 в двоичной). Игра тут обращается к каждому двоичному знаку переменной, смотря, ноль там или единица, для разных параметров. Обычно такой формат используется, когда может быть несколько таких состояний одновременно (число 16 в шестнадцатеричной=22 в десятичной=10110 в двоичной обозначало бы игру, являющуюся battle-only, кампанией и хотситом одновременно; никаким другим сочетанием параметров такую сумму тут не получишь) — например, флаги существ в большинстве игр, так как проще завести одно такое число, чем по переменной на каждый флаг — но зафига он использован тут, не очень ясно.


Получилось yahoo.gif yahoo.gif yahoo.gif

Сперва я сделал поиск по всем файлам на TYPE_CAMPAIGN и нигде кроме в game.h болше не нашел
Тогда я решил просто попробовать в файле newgame.cpp в код команды

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


Вместо TYPE_STANDARD подставить TYPE_CAMPAIGN и посмотреть что получится.
Подставил. Собрал игру. Запустил Standart Game. Выиграл и попал в меню выбора Кампани!!!!!
Тогда я подумал наверно игра при создании кудато пишет в в savе файл этот TYPE_STANDARD = 0x01 или TYPE_CAMPAIGN = 0x02. А я эпизоды делал из сейвов стандартный карт когда они создавались как TYPE_STANDARD И просто решил их пересоздать заново теперь когда стандартная игра создается как TYPE_CAMPAIGN потом переименовал их в .сam удалил в папочке campain свои старые эпизоды и полжить туда новые в которых вместо TYPE_STANDARD игра поставила TYPE_CAMPAIGN. А потом я опять вернул на место TYPE_STANDARD в команде

Код
    conf.SetGameType(Game::TYPE_STANDARD);


И опять пересобрал игру. Запустил. И все заработало!!! yahoo.gif yahoo.gif yahoo.gif

И теперь когда выигрываешь сценарий кампании сразу попадаешь в меню выбора кампании.
А когда выигрываешь стандартную игру попадаешь в рейтинг. yahoo.gif yahoo.gif yahoo.gif

Эроласт
Если тип берется из сохранения - тогда да, все логично.

Попробуй в функции Game::NewCampain переставить строку "Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);" в конец, перед операцией "return STARTGAME". Тогда тип должен будет принудительно меняться на TYPE_CAMPAIGN уже после загрузки сценария и можно будет использовать сейвы стандартных.
t800
Цитата(Эроласт @ 14 Sep 2015, 12:22) *
Если тип берется из сохранения - тогда да, все логично.

Попробуй в функции Game::NewCampain переставить строку "Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);" в конец, перед операцией "return STARTGAME". Тогда тип должен будет принудительно меняться на TYPE_CAMPAIGN уже после загрузки сценария и можно будет использовать сейвы стандартных.


Получилось! yahoo.gif yahoo.gif

Поставил Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
перед командой return STARTGAME скопировал стандартный save
после выигрыша попал опять в команию а не в рейтинг yahoo.gif yahoo.gif

А почему опять в кампанию а не в выбор кампании? Разобрался с командой как можно сразу запускать игру кампании а не через меню. yahoo.gif yahoo.gif

Для этого надо в файле newgame.cpp

Команду

Код
std::string file = Dialog::SelectFileCampainLoad();


Поменять на

Код
std::string file = "files/campain/T-800 Epizode 1.sav";


Нажал на кнопку кампнии и сразу запустилась игра.

Потом в файле gameover.cpp я сделал вот так

Код
if (Settings::Get().GameType(Game::TYPE_CAMPAIGN))
{
    res = Game::NEXTCAMPAIN;
}
else
{
    res = Game::HIGHSCORES;
}
И попробовал собрать игру. Но она заругалась сказал что NEXTCAMPAIN нету в Game тогда я в файле newgame.cpp скпопировал код команд для кампании
и тут же вставил чуть ниже и поменял в его названии NewCampain на NextCampain отправил на сборку она опять заругалась что
NEXTCAMPAIN гдето нет. Тогда я сделал поиск на слову NEWCAMPAIN

Код
danya@danya:~/fheroes2-code-3277-trunk/fheroes2$ grep -rl 'NEWCAMPAIN' src/
src/fheroes2/game/fheroes2.cpp
src/fheroes2/game/game.h
src/fheroes2/game/game_newgame.cpp


И во файлах fheroes2.cpp game.h где строчки с командами NEWCAMPAIN скопировал ниже и поменял
в них NEWCAMPAIN на NEХTCAMPAIN, потом в файле newgame.cpp вернул на место команду
std::string file = Dialog::SelectFileCampainLoad();

В командах для NEXTCAMPAIN написал

Код
int Game::NextCampain(void)
{
   std::string file = "files/campain/T-800 Epizode 1.sav";
    if(file.empty() || !Game::Load(file)) return MAINMENU;
    return STARTGAME;
}


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







И еще VDV_forever сказал когда доделаю кампании можно будет запустить турнир. cavalrykb.gif cavalrykb.gif cavalrykb.gif

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

Не будет никаких турниров) У Дмитрия нет сейчас времени даже на обычный, не говоря уже о твоём моде "замени пару красивых игровых портретов на пару вырвиглазных рипов".
Даже новогодний вряд ли будет делаться в этом году.

Кампания твоя работает только в FreeHeroes, а на нём турниры немыслимы даже в теории. Даже если бы "турниры по кампаниям" вообще существовали, лол.
t800
Цитата(Orzie @ 14 Sep 2015, 20:00) *
Цитата
И еще VDV_forever сказал когда доделаю кампании можно будет запустить турнир.

Не будет никаких турниров) У Дмитрия нет сейчас времени даже на обычный, не говоря уже о твоём моде "замени пару красивых игровых портретов на пару вырвиглазных рипов".
Даже новогодний вряд ли будет делаться в этом году.

Кампания твоя работает только в FreeHeroes, а на нём турниры немыслимы даже в теории. Даже если бы "турниры по кампаниям" вообще существовали, лол.


Не знаю. Про турнир это VDV_forever так сказал. Я просто хотел сделать кампанию чтобы по сюжету книг была, а не для турниров. А рейтинг все равно надо сделать. Потому что не интересно играть когда не знаешь хорошо победил или плохо. И чтобы другии кампании можно было загружать тоже надо потому, что каждый раз заново игру собирать это не удобно. Удобно чтобы компании можно как карты было загружать. Слелал камапанию положил в папочку campain и она в игре появилась.
t800
Цитата(Orzie @ 14 Sep 2015, 20:00) *
Кампания твоя работает только в FreeHeroes, а на нём турниры немыслимы даже в теории.


Не знаю. Я погуглил во FreeHeroes люди играют

https://play.google.com/store/apps/details?...roes2&hl=ru

И жалуются что кампании нет. А теперь кампании будут !!! barb_metal.gif
Надо только рейтинг сделать и загрузку сценариев из текстового файлика.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.