IPB

Здравствуйте, гость ( Вход | Регистрация )

11 страниц V  « < 7 8 9 10 11 >  
Reply to this topicStart new topic
> Free Heroes II, обсужение свободного движка
t800
сообщение 19 Sep 2015, 07:44 (Сообщение отредактировал t800 - 19 Sep 2015, 07:45)
Сообщение #161

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




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


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Эроласт
сообщение 19 Sep 2015, 08:12
Сообщение #162

Зануда
Сообщений: 2 237
Спасибо сказали: 2894 раза




Цитата
надо вставлять команды

Я же уже говорил: термин "команды" в программировании не употребляется. Код, операции, алгоритм, но никак не "команды".

По поводу переменных. Если пишешь части слова вместе, без подчеркивания, то начинай каждое новое с большой буквы. Это называется camel case.
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 20 Sep 2015, 09:40 (Сообщение отредактировал t800 - 20 Sep 2015, 10:31)
Сообщение #163

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Решил сделать рейтигин для кампаний! Открыл файлик highscores_game.cpp который его делает


Код
#include <algorithm>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <ctime>

#include "system.h"
#include "gamedefs.h"
#include "text.h"
#include "agg.h"
#include "cursor.h"
#include "button.h"
#include "dialog.h"
#include "settings.h"
#include "world.h"
#include "zzlib.h"
#include "game.h"
#include "game_over.h"

#define HGS_ID    0xF1F3
#define HGS_MAX    10

struct hgs_t
{
    hgs_t() : days(0), rating(0) {};

    bool operator== (const hgs_t &) const;

    std::string    player;
    std::string    land;
    u32        localtime;
    u32        days;
    u32        rating;
};

StreamBase & operator<< (StreamBase & msg, const hgs_t & hgs)
{
    return msg << hgs.player << hgs.land << hgs.localtime << hgs.days << hgs.rating;
}

StreamBase & operator>> (StreamBase & msg, hgs_t & hgs)
{
    return msg >> hgs.player >> hgs.land >> hgs.localtime >> hgs.days >> hgs.rating;
}

bool hgs_t::operator== (const hgs_t & h) const
{
    return player == h.player && land == h.land && days == h.days;
}

bool RatingSort(const hgs_t & h1, const hgs_t & h2)
{
    return h1.rating > h2.rating;
}

class HGSData
{
public:
    HGSData() {}

    bool Load(const std::string &);
    bool Save(const std::string &);
    void ScoreRegistry(const std::string &, const std::string &, u32, u32);
    void RedrawList(s32, s32);
private:
    std::vector<hgs_t> list;
};

bool HGSData::Load(const std::string & fn)
{
    ZStreamFile hdata;
    if(! hdata.read(fn)) return false;

    hdata.setbigendian(true);
    u16 hgs_id = 0;

    hdata >> hgs_id;

#ifdef FORMAT_VERSION_3225
    // old stream ver. skip 4 byte
    if(hgs_id != HGS_ID)
    hdata >> hgs_id >> hgs_id;
#endif

    if(hgs_id == HGS_ID)
    {
    hdata >> list;
    return ! hdata.fail();
    }

    return false;
}

bool HGSData::Save(const std::string & fn)
{
    ZStreamFile hdata;
    hdata.setbigendian(true);
    hdata << static_cast<u16>(HGS_ID) << list;
    if(hdata.fail() || ! hdata.write(fn)) return false;

    return true;
}

void HGSData::ScoreRegistry(const std::string & p, const std::string & m, u32 r, u32 s)
{
    hgs_t h;

    h.player = p;
    h.land = m;
    h.localtime = std::time(NULL);
    h.days = r;
    h.rating = s;

    if(list.end() == std::find(list.begin(), list.end(), h))
    {
    list.push_back(h);
    std::sort(list.begin(), list.end(), RatingSort);
    if(list.size() > HGS_MAX) list.resize(HGS_MAX);
    }
}

void HGSData::RedrawList(s32 ox, s32 oy)
{
    const Settings & conf = Settings::Get();

    // image background
    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);
    back.Blit(ox, oy);

    const Sprite &head = AGG::GetICN(ICN::HISCORE, 6);
    if(conf.QVGA())
    head.Blit(ox + 25, oy + 15);
    else
    head.Blit(ox + 50, oy + 31);

    std::sort(list.begin(), list.end(), RatingSort);

    std::vector<hgs_t>::const_iterator it1 = list.begin();
    std::vector<hgs_t>::const_iterator it2 = list.end();

    Text text;
    text.Set(conf.QVGA() ? Font::SMALL : Font::BIG);

    for(; it1 != it2 && (it1 - list.begin() < HGS_MAX); ++it1)
    {
    const hgs_t & hgs = *it1;

    text.Set(hgs.player);
    text.Blit(ox + (conf.QVGA() ? 45 : 88), oy + (conf.QVGA() ? 33 : 70));

    text.Set(hgs.land);
    text.Blit(ox + (conf.QVGA() ? 170 : 260), oy + (conf.QVGA() ? 33 : 70));

    text.Set(GetString(hgs.days));
    text.Blit(ox + (conf.QVGA() ? 250 : 420), oy + (conf.QVGA() ? 33 : 70));

    text.Set(GetString(hgs.rating));
    text.Blit(ox + (conf.QVGA() ? 270 : 480), oy + (conf.QVGA() ? 33 : 70));

    oy += conf.QVGA() ? 20 : 40;
    }
}

int Game::HighScores(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSData hgs;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgs");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgs.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgs.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonCampain(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 0, 1);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonCampain.Draw();
    buttonExit.Draw();

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

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgs.ScoreRegistry(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgs.Save(stream.str().c_str());
    hgs.RedrawList(top.x, top.y);
    buttonCampain.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }

    // highscores loop    {
    // key code info
        if(Settings::Get().Debug() == 0x12 && le.KeyPress())
            Dialog::Message("Key Press:", GetString(le.KeyValue()), Font::SMALL, Dialog::OK);
    le.MousePressLeft(buttonCampain) ? buttonCampain.PressDraw() : buttonCampain.ReleaseDraw();
    le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw();

    if(le.MouseClickLeft(buttonExit) || HotKeyCloseWindow) return MAINMENU;
    }

    return QUITGAME;
}


У меня впопрос как лучше сделать? Я хочу просто скопировать код команд начинася с

Код
#define HGS_ID    0xF1F3
#define HGS_MAX    10


И до

Код
// highscores loop


Вставить тут же в файл ниже. Везде где стоит HGS переименовать в HGSС , а везде где стоит hgs переименовать в hgsc и потом смотреть как надо менять код команд с HGSС и hgsc чтобы рейтиг кампаний зарабоатал. Так правильно будет?


И еще у меня вопрос что такое вот это
Код
#define HGS_ID    0xF1F3
#define HGS_MAX    10


И что оно делает? И если я это скопирую и переименую для камапании в

Код
#define HGSС_ID    0xF1F3
#define HGSС_MAX    10


Надо писать HGSС_ID 0xF1F3 или вместо 0xF1F3 надо будет что-то другое написать? И если другое то какое?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 20 Sep 2015, 19:46 (Сообщение отредактировал t800 - 20 Sep 2015, 19:48)
Сообщение #164

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Я сейчас скоприровал и переименовал все HGS в HGSС , а все hgs в hgsc и RatingSort в RatingSortСampain. Собрал игру при сборке не заругалалась. Теперь осталось понять как рейтинг компании надо считать.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 21 Sep 2015, 08:40
Сообщение #165

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Сейчас сделал так в файлике gameover.cpp всместо

Цитата
res = Game::NEXTCAMPAIN;


Написал

Цитата
res = Game::HIGHSCORESCAMPAIN;


Собрал игру запустил. Выиграл одну карту из тестовой кампании и сразу попал в Рейтинг для кампании!





--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 21 Sep 2015, 09:18 (Сообщение отредактировал t800 - 21 Sep 2015, 09:19)
Сообщение #166

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Сейчас в highscores_game.cpp в


Код
int Game::HighScoresCampain(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSCData hgsc;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgsc");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgsc.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgsc.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonStandart(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 2, 3);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonStandart.Draw();
    buttonExit.Draw();

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

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgsc.ScoreRegistryC(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgsc.Save(stream.str().c_str());
    hgsc.RedrawList(top.x, top.y);
    buttonStandart.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }

    // highscores loop
    while(le.HandleEvents())
    {
    // key code info
        if(Settings::Get().Debug() == 0x12 && le.KeyPress())
            Dialog::Message("Key Press:", GetString(le.KeyValue()), Font::SMALL, Dialog::OK);
    le.MousePressLeft(buttonStandart) ? buttonStandart.PressDraw() : buttonStandart.ReleaseDraw();
    le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw();

    if(le.MouseClickLeft(buttonStandart) || HotKeyCloseWindow) return HIGHSCORES;
    if(le.MouseClickLeft(buttonExit) || HotKeyCloseWindow) return MAINMENU;
    }

    return QUITGAME;
}


Поменял везде где было написано buttonCampain на buttonStandart и теперь у меня рейтинги переключаются!!! barb_metal.gif barb_metal.gif barb_metal.gif



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 26 Sep 2015, 14:19 (Сообщение отредактировал t800 - 26 Sep 2015, 14:23)
Сообщение #167

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Никак не могу придумать как считать рейтинги для каманий.

В файле game_highscores.cpp в разделе int Game::HighScores


Код
int Game::HighScores(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSData hgs;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgs");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgs.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgs.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonCampain(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 0, 1);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonCampain.Draw();
    buttonExit.Draw();

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

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    std::cout  << days;
    std::cout  << " Дни \n";

    std::cout  << rating;
    std::cout  << " Рейтинг \n";

    
    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgs.ScoreRegistry(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgs.Save(stream.str().c_str());
    hgs.RedrawList(top.x, top.y);
    buttonCampain.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }




Я нашел такие команды.

Цитата
const u32 rating = GetGameOverScores();
const u32 days = world.CountDay();



Я проверил что они делают оказываются он считаю рейтинг игры и число дней.

Код
    std::cout  << days;
    std::cout  << " Дни \n";

    std::cout  << rating;
std::cout  << " Рейтинг \n";


И подумал что можно наверно сделать так. Для каждой из кампаний сделать отдельный файлик куда игра будет записывать имя карты и число дней и рейтинг карты после выигрыша каржлдго из эпизодов. А потом если закончилась игра на последней карты. Их оттуда опять брать складывать все дни по всем картам и все рейтинг по всем картам и уже записывать с именем кампании в файл откуда она берет очки для все камапаний. Но я подумал а может можно это проще сделать? Без файликов?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 04 Nov 2015, 08:36
Сообщение #168

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




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

Код
void Init(void);

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

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

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


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


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 08 Nov 2015, 20:46 (Сообщение отредактировал t800 - 08 Nov 2015, 20:53)
Сообщение #169

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




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

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

Код
/* check game type */
bool Settings::(int f) const { return game_type & f; }
int Settings::GameType(void) const { return game_type; }

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

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

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


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

Код
    bool        GameType(int) const;
    int        GameType(void) const;
    void        SetGameType(int);
    /* T-800 */
    bool        CampainDays(int) const;
    int        CampainDays(void) const;
    void        SetCampainDays(int);
    /* T-800 */


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

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

    StreamFile fs;
    fs.setbigendian(true);

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

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

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

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

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

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

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

    ZStreamFile fz;
    fz.setbigendian(true);

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

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

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

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

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

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

    World::Get().PostFixLoad();

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

    SetLoadVersion(CURRENT_FORMAT_VERSION);

    Game::SetLastSavename(fn);
    conf.SetGameType(conf.GameType() | Game::TYPE_LOADFILE);
/* T-800*/

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


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

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


Сперва они выводили нули и было не понятно что это значит. Но тогда я решил попробовать
и в файл game_newgame.cpp

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

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

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

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

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

}


Вставил строчку

Код
Settings::Get().SetCampainDays(100);


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


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 26 Jun 2016, 17:10 (Сообщение отредактировал t800 - 27 Jun 2016, 11:18)
Сообщение #170

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Фух! Наконец то закончил с Кампаниями для 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 и Андроид


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 27 Jun 2016, 22:39 (Сообщение отредактировал t800 - 28 Jun 2016, 09:17)
Сообщение #171

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Собрал fheroes2 c поддержкой кампаний под Windows у меня в Virtualbox на XP вроде работает.



Вот ссылка для скачивания http://wiki.kvkozyrev.org/fheroes/fheroes2cam-win32.zip

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

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


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 03 Jul 2016, 01:32 (Сообщение отредактировал t800 - 04 Jul 2016, 05:43)
Сообщение #172

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Собрал fheroes с поддержкой кампании для Андроид ( ставить можно на планшет или телефон)



Скачать инсталятор fheroes2 c поддержкой кампания под Андроид можно здесь

http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk

(Примечание: Инсталятор сам закачивает необходимые файлы heroes2.agg)


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 03 Jul 2016, 17:55 (Сообщение отредактировал t800 - 04 Jul 2016, 05:42)
Сообщение #173

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Изменил меню в версии для Андроида для режима работы на телефонах. Теперь на телефоне пункт меню Кампаний присутствует. И компании работают и на телефоне.




Ссылка на инсталятор для игры на телефоне

http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 03 Jul 2016, 22:33
Сообщение #174

допустим, мяў
Сообщений: 24 071
Спасибо сказали: 13377 раз




Респект! Только - пожалуйста - "инсталятор".
Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator".


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 04 Jul 2016, 05:43
Сообщение #175

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Цитата(hippocamus @ 04 Jul 2016, 01:33) *
Респект! Только - пожалуйста - "инсталятор".
Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator".


Исправил.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 04 Jul 2016, 08:22
Сообщение #176

😸🧡✊✌️
Сообщений: 16 406
Спасибо сказали: 3255 раз




Цитата(hippocamus @ 03 Jul 2016, 22:33) *
даже на буржуйском - "installator".
Во-первых, installer, во-вторых, a перед ll традиционно читается, как о.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 04 Jul 2016, 13:03 (Сообщение отредактировал t800 - 07 Aug 2016, 10:49)
Сообщение #177

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Хочу попробовтать добавить свою сборку fheroes2 T-800 mod под Андроид на Goole Play чтобы все могли
играть в кампании.

А то народ каждый качает старую сборку и ругается что там ничего не работает и нет кампаний.

https://play.google.com/store/people/detail...70255&hl=ru

А про новую ничего не знают. Кто-нибудь знает как добавить свою сборку в Google Play?

Просто я написал Gerhard Stein неделю и ссылку на свои исходники тоже выслал но он ничего не до сих пор не выложил.
Сейчас думаю наверно проще самому добавить чем ждать пока он выложит мою модификацию.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 05 Jul 2016, 07:56 (Сообщение отредактировал t800 - 05 Jul 2016, 07:56)
Сообщение #178

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Добавил версию для Андроид на Google Play

https://play.google.com/store/apps/details?...rg.fheroes2t800




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
fireman
сообщение 27 Aug 2016, 02:44
Сообщение #179

Immortal
Сообщений: 2 768
Спасибо сказали: 959 раз




t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть.

На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней.

Тебе посоветовали использовать контроль версий и даже расписали как. С такими системами намного проще. Ты хранишь весь исходный код в репозитории, все изменения внесённые тобой или кем-либо другим видны + есть история изменений. Советую почитать на эту тему, и все изменения самого движка делать как форк или заносить pull request

Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 27 Aug 2016, 11:26 (Сообщение отредактировал t800 - 27 Aug 2016, 12:27)
Сообщение #180

Разработчик
Сообщений: 534
Спасибо сказали: 222 раза




Цитата(fireman @ 27 Aug 2016, 05:44) *
t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть.

На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней.

Тебе посоветовали использовать контроль версий и даже расписали как. С такими системами намного проще. Ты хранишь весь исходный код в репозитории, все изменения внесённые тобой или кем-либо другим видны + есть история изменений. Советую почитать на эту тему, и все изменения самого движка делать как форк или заносить pull request


Привет у сборок под Linux/Windows/Android одни и те же исходники (они кроссплатформенные) ссылка на исходники дана здесь в этой теме и на Google Play вот она эта ссылка http://wiki.kvkozyrev.org/forum/viewtopic....4&t=88#p473 Если тебе нужны исходники можешь по ссылке их скачать yes2.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

11 страниц V  « < 7 8 9 10 11 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 15 August 2025 - 02:49
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика