![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#161
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
А как надо считать рейтинги для кампаний? Просто складывать обычный рейтинг для каждого из сценарие? Или как?
-------------------- |
|
|
![]()
Сообщение
#162
|
|
![]() Зануда Сообщений: 2 237 Спасибо сказали: 2894 раза ![]() |
Цитата надо вставлять команды Я же уже говорил: термин "команды" в программировании не употребляется. Код, операции, алгоритм, но никак не "команды". По поводу переменных. Если пишешь части слова вместе, без подчеркивания, то начинай каждое новое с большой буквы. Это называется camel case. |
|
|
![]()
Сообщение
#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 надо будет что-то другое написать? И если другое то какое? -------------------- |
|
|
![]()
Сообщение
#164
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Я сейчас скоприровал и переименовал все HGS в HGSС , а все hgs в hgsc и RatingSort в RatingSortСampain. Собрал игру при сборке не заругалалась. Теперь осталось понять как рейтинг компании надо считать.
-------------------- |
|
|
![]()
Сообщение
#165
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Сейчас сделал так в файлике gameover.cpp всместо
Цитата res = Game::NEXTCAMPAIN; Написал Цитата res = Game::HIGHSCORESCAMPAIN; Собрал игру запустил. Выиграл одну карту из тестовой кампании и сразу попал в Рейтинг для кампании! -------------------- |
|
|
![]()
Сообщение
#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 и теперь у меня рейтинги переключаются!!! ![]() ![]() ![]() -------------------- |
|
|
![]()
Сообщение
#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"; И подумал что можно наверно сделать так. Для каждой из кампаний сделать отдельный файлик куда игра будет записывать имя карты и число дней и рейтинг карты после выигрыша каржлдго из эпизодов. А потом если закончилась игра на последней карты. Их оттуда опять брать складывать все дни по всем картам и все рейтинг по всем картам и уже записывать с именем кампании в файл откуда она берет очки для все камапаний. Но я подумал а может можно это проще сделать? Без файликов? -------------------- |
|
|
![]()
Сообщение
#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 и чтобы они сохранялись в сейвах и складывались при смене эпизода? -------------------- |
|
|
![]()
Сообщение
#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. Что делать? -------------------- |
|
|
![]()
Сообщение
#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 и Андроид -------------------- |
|
|
![]()
Сообщение
#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) -------------------- |
|
|
![]()
Сообщение
#172
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Собрал fheroes с поддержкой кампании для Андроид ( ставить можно на планшет или телефон)
Скачать инсталятор fheroes2 c поддержкой кампания под Андроид можно здесь http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk (Примечание: Инсталятор сам закачивает необходимые файлы heroes2.agg) -------------------- |
|
|
![]()
Сообщение
#173
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Изменил меню в версии для Андроида для режима работы на телефонах. Теперь на телефоне пункт меню Кампаний присутствует. И компании работают и на телефоне.
Ссылка на инсталятор для игры на телефоне http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk -------------------- |
|
|
![]()
Сообщение
#174
|
|
![]() допустим, мяў Сообщений: 24 071 Спасибо сказали: 13377 раз ![]() |
Респект! Только - пожалуйста - "инсталятор".
Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator". -------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
![]()
Сообщение
#175
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Респект! Только - пожалуйста - "инсталятор". Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator". Исправил. -------------------- |
|
|
![]()
Сообщение
#176
|
|
![]() 😸🧡✊✌️ Сообщений: 16 406 Спасибо сказали: 3255 раз ![]() |
даже на буржуйском - "installator". Во-первых, installer, во-вторых, a перед ll традиционно читается, как о.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#177
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Хочу попробовтать добавить свою сборку fheroes2 T-800 mod под Андроид на Goole Play чтобы все могли
играть в кампании. А то народ каждый качает старую сборку и ругается что там ничего не работает и нет кампаний. https://play.google.com/store/people/detail...70255&hl=ru А про новую ничего не знают. Кто-нибудь знает как добавить свою сборку в Google Play? Просто я написал Gerhard Stein неделю и ссылку на свои исходники тоже выслал но он ничего не до сих пор не выложил. Сейчас думаю наверно проще самому добавить чем ждать пока он выложит мою модификацию. -------------------- |
|
|
![]()
Сообщение
#178
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
Добавил версию для Андроид на Google Play
https://play.google.com/store/apps/details?...rg.fheroes2t800 ![]() -------------------- |
|
|
![]()
Сообщение
#179
|
|
![]() Immortal Сообщений: 2 768 Спасибо сказали: 959 раз ![]() |
t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть.
На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней. Тебе посоветовали использовать контроль версий и даже расписали как. С такими системами намного проще. Ты хранишь весь исходный код в репозитории, все изменения внесённые тобой или кем-либо другим видны + есть история изменений. Советую почитать на эту тему, и все изменения самого движка делать как форк или заносить pull request |
|
|
![]()
Сообщение
#180
|
|
![]() Разработчик Сообщений: 534 Спасибо сказали: 222 раза ![]() |
t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть. На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней. Тебе посоветовали использовать контроль версий и даже расписали как. С такими системами намного проще. Ты хранишь весь исходный код в репозитории, все изменения внесённые тобой или кем-либо другим видны + есть история изменений. Советую почитать на эту тему, и все изменения самого движка делать как форк или заносить pull request Привет у сборок под Linux/Windows/Android одни и те же исходники (они кроссплатформенные) ссылка на исходники дана здесь в этой теме и на Google Play вот она эта ссылка http://wiki.kvkozyrev.org/forum/viewtopic....4&t=88#p473 Если тебе нужны исходники можешь по ссылке их скачать ![]() -------------------- |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 15 August 2025 - 02:49 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|