diff --git a/src/entity.cpp b/src/entity.cpp index bb7f3ae79..6ebba6440 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -10359,7 +10359,17 @@ void Entity::attack(int pose, int charge, Entity* target) { increaseSkill = false; } - players[this->skill[2]]->mechanics.enemyRaisedBlockingAgainst[hit.entity->getUID()]++; + if ( myStats->shield && itemCategory(myStats->shield) != ARMOR ) + { + if ( myStats->getProficiency(PRO_SHIELD) >= SKILL_LEVEL_SKILLED ) + { + increaseSkill = false; + } + } + if ( increaseSkill ) + { + players[this->skill[2]]->mechanics.enemyRaisedBlockingAgainst[hit.entity->getUID()]++; + } } if ( increaseSkill ) { @@ -11022,7 +11032,17 @@ void Entity::attack(int pose, int charge, Entity* target) { skillIncrease = false; } - players[hit.entity->skill[2]]->mechanics.enemyRaisedBlockingAgainst[this->getUID()]++; + if ( hitstats->shield && itemCategory(hitstats->shield) != ARMOR ) + { + if ( hitstats->getProficiency(PRO_SHIELD) >= SKILL_LEVEL_SKILLED ) + { + skillIncrease = false; + } + } + if ( skillIncrease ) + { + players[hit.entity->skill[2]]->mechanics.enemyRaisedBlockingAgainst[this->getUID()]++; + } } if ( skillIncrease ) { diff --git a/src/eos.cpp b/src/eos.cpp index cab900b6b..1e9a5e0fd 100644 --- a/src/eos.cpp +++ b/src/eos.cpp @@ -3166,7 +3166,7 @@ void EOSFuncs::ingestStat(int stat_num, int value) static void EOS_CALL OnIngestGlobalStatComplete(const EOS_Stats_IngestStatCompleteCallbackInfo* data) { - assert(data != NULL); + /*assert(data != NULL); if (data->ResultCode == EOS_EResult::EOS_Success) { EOSFuncs::logInfo("Successfully stored global stats"); @@ -3184,12 +3184,12 @@ static void EOS_CALL OnIngestGlobalStatComplete(const EOS_Stats_IngestStatComple { EOSFuncs::logError("OnIngestGlobalStatComplete: Callback failure: %d", static_cast(data->ResultCode)); } - EOS.StatGlobalManager.bDataQueued = true; + EOS.StatGlobalManager.bDataQueued = true;*/ } void EOSFuncs::queueGlobalStatUpdate(int stat_num, int value) { - if (stat_num <= STEAM_GSTAT_INVALID || stat_num >= NUM_GLOBAL_STEAM_STATISTICS) + /*if (stat_num <= STEAM_GSTAT_INVALID || stat_num >= NUM_GLOBAL_STEAM_STATISTICS) { return; } @@ -3198,7 +3198,7 @@ void EOSFuncs::queueGlobalStatUpdate(int stat_num, int value) return; } g_SteamGlobalStats[stat_num].m_iValue += value; - StatGlobalManager.bDataQueued = true; + StatGlobalManager.bDataQueued = true;*/ } void EOSFuncs::StatGlobal_t::updateQueuedStats() @@ -3218,55 +3218,55 @@ void EOSFuncs::StatGlobal_t::updateQueuedStats() void EOSFuncs::ingestGlobalStats() { - if (StatGlobalManager.bIsDisabled) - { - return; - } - if (!ServerPlatformHandle) - { - return; - } + //if (StatGlobalManager.bIsDisabled) + //{ + // return; + //} + //if (!ServerPlatformHandle) + //{ + // return; + //} - Uint32 numStats = 0; - std::vector StatNames; - for (Uint32 i = 0; i < NUM_GLOBAL_STEAM_STATISTICS; ++i) - { - if (g_SteamGlobalStats[i].m_iValue > 0) - { - StatNames.push_back(g_SteamGlobalStats[i].m_pchStatName); - ++numStats; - } - } + //Uint32 numStats = 0; + //std::vector StatNames; + //for (Uint32 i = 0; i < NUM_GLOBAL_STEAM_STATISTICS; ++i) + //{ + // if (g_SteamGlobalStats[i].m_iValue > 0) + // { + // StatNames.push_back(g_SteamGlobalStats[i].m_pchStatName); + // ++numStats; + // } + //} - if (numStats == 0) - { - return; - } + //if (numStats == 0) + //{ + // return; + //} - EOS_Stats_IngestData* StatsToIngest = new EOS_Stats_IngestData[numStats]; - Uint32 currentIndex = 0; - for (Uint32 i = 0; i < NUM_GLOBAL_STEAM_STATISTICS && currentIndex < StatNames.size(); ++i) - { - if (g_SteamGlobalStats[i].m_iValue > 0) - { - StatsToIngest[currentIndex].ApiVersion = EOS_STATS_INGESTDATA_API_LATEST; - StatsToIngest[currentIndex].StatName = StatNames[currentIndex].c_str(); - StatsToIngest[currentIndex].IngestAmount = g_SteamGlobalStats[i].m_iValue; - //logInfo("Updated %s | %d", StatsToIngest[currentIndex].StatName, StatsToIngest[currentIndex].IngestAmount); - ++currentIndex; - } - } + //EOS_Stats_IngestData* StatsToIngest = new EOS_Stats_IngestData[numStats]; + //Uint32 currentIndex = 0; + //for (Uint32 i = 0; i < NUM_GLOBAL_STEAM_STATISTICS && currentIndex < StatNames.size(); ++i) + //{ + // if (g_SteamGlobalStats[i].m_iValue > 0) + // { + // StatsToIngest[currentIndex].ApiVersion = EOS_STATS_INGESTDATA_API_LATEST; + // StatsToIngest[currentIndex].StatName = StatNames[currentIndex].c_str(); + // StatsToIngest[currentIndex].IngestAmount = g_SteamGlobalStats[i].m_iValue; + // //logInfo("Updated %s | %d", StatsToIngest[currentIndex].StatName, StatsToIngest[currentIndex].IngestAmount); + // ++currentIndex; + // } + //} - EOS_Stats_IngestStatOptions Options{}; - Options.ApiVersion = EOS_STATS_INGESTSTAT_API_LATEST; - Options.Stats = StatsToIngest; - Options.StatsCount = numStats; - Options.LocalUserId = StatGlobalManager.getProductUserIdHandle(); - Options.TargetUserId = StatGlobalManager.getProductUserIdHandle(); + //EOS_Stats_IngestStatOptions Options{}; + //Options.ApiVersion = EOS_STATS_INGESTSTAT_API_LATEST; + //Options.Stats = StatsToIngest; + //Options.StatsCount = numStats; + //Options.LocalUserId = StatGlobalManager.getProductUserIdHandle(); + //Options.TargetUserId = StatGlobalManager.getProductUserIdHandle(); - EOS_Stats_IngestStat(EOS_Platform_GetStatsInterface(ServerPlatformHandle), &Options, nullptr, OnIngestGlobalStatComplete); + //EOS_Stats_IngestStat(EOS_Platform_GetStatsInterface(ServerPlatformHandle), &Options, nullptr, OnIngestGlobalStatComplete); - delete[] StatsToIngest; + //delete[] StatsToIngest; } void EOS_CALL EOSFuncs::OnQueryAllStatsCallback(const EOS_Stats_OnQueryStatsCompleteCallbackInfo* data) @@ -4063,34 +4063,34 @@ void EOSFuncs::StatGlobal_t::init() void EOSFuncs::StatGlobal_t::queryGlobalStatUser() { - init(); + //init(); - // Query Player Stats - EOS_Stats_QueryStatsOptions StatsQueryOptions{}; - StatsQueryOptions.ApiVersion = EOS_STATS_QUERYSTATS_API_LATEST; - StatsQueryOptions.LocalUserId = getProductUserIdHandle(); - StatsQueryOptions.TargetUserId = getProductUserIdHandle(); + //// Query Player Stats + //EOS_Stats_QueryStatsOptions StatsQueryOptions{}; + //StatsQueryOptions.ApiVersion = EOS_STATS_QUERYSTATS_API_LATEST; + //StatsQueryOptions.LocalUserId = getProductUserIdHandle(); + //StatsQueryOptions.TargetUserId = getProductUserIdHandle(); - // Optional params - StatsQueryOptions.StartTime = EOS_STATS_TIME_UNDEFINED; - StatsQueryOptions.EndTime = EOS_STATS_TIME_UNDEFINED; + //// Optional params + //StatsQueryOptions.StartTime = EOS_STATS_TIME_UNDEFINED; + //StatsQueryOptions.EndTime = EOS_STATS_TIME_UNDEFINED; - StatsQueryOptions.StatNamesCount = NUM_GLOBAL_STEAM_STATISTICS; - StatsQueryOptions.StatNames = new const char* [NUM_GLOBAL_STEAM_STATISTICS]; + //StatsQueryOptions.StatNamesCount = NUM_GLOBAL_STEAM_STATISTICS; + //StatsQueryOptions.StatNames = new const char* [NUM_GLOBAL_STEAM_STATISTICS]; - for (int i = 0; i < NUM_GLOBAL_STEAM_STATISTICS; ++i) - { - StatsQueryOptions.StatNames[i] = g_SteamGlobalStats[i].m_pchStatName; - } + //for (int i = 0; i < NUM_GLOBAL_STEAM_STATISTICS; ++i) + //{ + // StatsQueryOptions.StatNames[i] = g_SteamGlobalStats[i].m_pchStatName; + //} - if (EOS.ServerPlatformHandle) - { - return; - } + //if (EOS.ServerPlatformHandle) + //{ + // return; + //} - EOS_Stats_QueryStats(EOS_Platform_GetStatsInterface(EOS.ServerPlatformHandle), - &StatsQueryOptions, nullptr, OnQueryGlobalStatsCallback); - delete[] StatsQueryOptions.StatNames; + //EOS_Stats_QueryStats(EOS_Platform_GetStatsInterface(EOS.ServerPlatformHandle), + // &StatsQueryOptions, nullptr, OnQueryGlobalStatsCallback); + //delete[] StatsQueryOptions.StatNames; } #endif //USE_EOS diff --git a/src/init_game.cpp b/src/init_game.cpp index f8a4dd2a2..655ddb2c4 100644 --- a/src/init_game.cpp +++ b/src/init_game.cpp @@ -111,6 +111,7 @@ void initGameDatafiles(bool moddedReload) CompendiumEntries.readModelLimbsFromFile("monster"); CompendiumEntries.readModelLimbsFromFile("world"); CompendiumEntries.readModelLimbsFromFile("codex"); + MainMenu::MainMenuBanners_t::readFromFile(); } void initGameDatafilesAsync(bool moddedReload) diff --git a/src/magic/magic.cpp b/src/magic/magic.cpp index c5dd02e1b..c1acfafc2 100644 --- a/src/magic/magic.cpp +++ b/src/magic/magic.cpp @@ -1968,6 +1968,7 @@ Entity* spellEffectPolymorph(Entity* target, Entity* parent, bool fromMagicSpell summonedStats->RANDOM_GOLD = 0; summonedStats->MISC_FLAGS[STAT_FLAG_MONSTER_DISABLE_HC_SCALING] = 1; summonedStats->leader_uid = targetStats->leader_uid; + summonedStats->monsterIsCharmed = targetStats->monsterIsCharmed; if ( summonedStats->leader_uid != 0 && summonedStats->type != SHADOW ) { Entity* leader = uidToEntity(summonedStats->leader_uid); diff --git a/src/main.cpp b/src/main.cpp index a2f62a885..b88fdda09 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -301,76 +301,6 @@ SteamStat_t g_SteamStats[NUM_STEAM_STATISTICS] = { 58, STEAM_STAT_INT, "STAT_SMASH_MELEE" } }; -SteamStat_t g_SteamGlobalStats[NUM_GLOBAL_STEAM_STATISTICS] = -{ - { 1, STEAM_STAT_INT, "STAT_GLOBAL_GAMES_STARTED" }, - { 2, STEAM_STAT_INT, "STAT_GLOBAL_GAMES_WON" }, - { 3, STEAM_STAT_INT, "STAT_GLOBAL_BOULDER_DEATHS" }, - { 4, STEAM_STAT_INT, "STAT_GLOBAL_HERX_SLAIN" }, - { 5, STEAM_STAT_INT, "STAT_GLOBAL_BAPHOMET_SLAIN" }, - { 6, STEAM_STAT_INT, "STAT_GLOBAL_TWINSICE_SLAIN" }, - { 7, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_HUMAN" }, - { 8, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_RAT" }, - { 9, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_GOBLIN" }, - { 10, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SLIME" }, - { 11, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_TROLL" }, - { 12, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SPIDER" }, - { 13, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_GHOUL" }, - { 14, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SKELETON" }, - { 15, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SCORPION" }, - { 16, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_IMP" }, - { 17, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_GNOME" }, - { 18, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_DEMON" }, - { 19, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SUCCUBUS" }, - { 20, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_LICH" }, - { 21, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_MINOTAUR" }, - { 22, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_DEVIL" }, - { 23, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SHOPKEEPER" }, - { 24, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_KOBOLD" }, - { 25, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SCARAB" }, - { 26, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_CRYSTALGOLEM" }, - { 27, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_INCUBUS" }, - { 28, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_VAMPIRE" }, - { 29, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SHADOW" }, - { 30, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_COCKATRICE" }, - { 31, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_INSECTOID" }, - { 32, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_GOATMAN" }, - { 33, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_AUTOMATON" }, - { 34, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_LICHICE" }, - { 35, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_LICHFIRE" }, - { 36, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SENTRYBOT" }, - { 37, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_SPELLBOT" }, - { 38, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_GYROBOT" }, - { 39, STEAM_STAT_INT, "STAT_GLOBAL_DEATHS_DUMMYBOT" }, - { 40, STEAM_STAT_INT, "STAT_GLOBAL_TWINSFIRE_SLAIN" }, - { 41, STEAM_STAT_INT, "STAT_GLOBAL_SHOPKEEPERS_SLAIN" }, - { 42, STEAM_STAT_INT, "STAT_GLOBAL_MINOTAURS_SLAIN" }, - { 43, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL_ENTERED" }, - { 44, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL1_COMPLETED" }, - { 45, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL2_COMPLETED" }, - { 46, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL3_COMPLETED" }, - { 47, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL4_COMPLETED" }, - { 48, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL5_COMPLETED" }, - { 49, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL6_COMPLETED" }, - { 50, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL7_COMPLETED" }, - { 51, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL8_COMPLETED" }, - { 52, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL9_COMPLETED" }, - { 53, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL10_COMPLETED" }, - { 54, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL1_ATTEMPTS" }, - { 55, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL2_ATTEMPTS" }, - { 56, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL3_ATTEMPTS" }, - { 57, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL4_ATTEMPTS" }, - { 58, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL5_ATTEMPTS" }, - { 59, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL6_ATTEMPTS" }, - { 60, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL7_ATTEMPTS" }, - { 61, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL8_ATTEMPTS" }, - { 62, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL9_ATTEMPTS" }, - { 63, STEAM_STAT_INT, "STAT_GLOBAL_TUTORIAL10_ATTEMPTS" }, - { 64, STEAM_STAT_INT, "STAT_GLOBAL_DISABLE" }, - { 65, STEAM_STAT_INT, "STAT_GLOBAL_PROMO" }, - { 66, STEAM_STAT_INT, "STAT_GLOBAL_PROMO_INTERACT" } -}; - #ifdef STEAMWORKS bool directConnect = false; CSteamLeaderboards* g_SteamLeaderboards = NULL; diff --git a/src/main.hpp b/src/main.hpp index 3c9b77431..df08ab28f 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -892,8 +892,6 @@ void GO_SwapBuffers(SDL_Window* screen); static const int NUM_STEAM_STATISTICS = 58; extern SteamStat_t g_SteamStats[NUM_STEAM_STATISTICS]; -static const int NUM_GLOBAL_STEAM_STATISTICS = 66; -extern SteamStat_t g_SteamGlobalStats[NUM_GLOBAL_STEAM_STATISTICS]; #ifdef STEAMWORKS #include diff --git a/src/menu.cpp b/src/menu.cpp index 82f98f516..c83e80bdb 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -9354,7 +9354,13 @@ void doNewGame(bool makeHighscore) { if ( gameModeManager.getMode() == GameModeManager_t::GAME_MODE_DEFAULT && !loadingsavegame ) { steamStatisticUpdate(STEAM_STAT_GAMES_STARTED, STEAM_STAT_INT, 1); - achievementObserver.updateGlobalStat(STEAM_GSTAT_GAMES_STARTED); +#ifdef USE_PLAYFAB + if ( !loadingsavegame ) + { + playfabUser.gameBegin(); + } +#endif + //achievementObserver.updateGlobalStat(STEAM_GSTAT_GAMES_STARTED); } // delete game data clutter diff --git a/src/playfab.cpp b/src/playfab.cpp index b678586e3..937240c1b 100644 --- a/src/playfab.cpp +++ b/src/playfab.cpp @@ -26,6 +26,72 @@ void PlayfabUser_t::OnEventsWrite(const PlayFab::EventsModels::WriteEventsRespon logInfo("Successfully stored events"); } +void PlayfabUser_t::gameBegin() +{ + if ( !bLoggedIn ) + { + return; + } + + if ( gameModeManager.getMode() != GameModeManager_t::GAME_MODE_DEFAULT ) + { + return; + } + PlayFab::EventsModels::WriteEventsRequest eventRequest; + PlayFab::EventsModels::EventContents eventContent; + eventContent.EventNamespace = "custom.game"; + eventContent.Name = "gamestart"; + eventContent.Payload["class"] = client_classes[clientnum]; + eventContent.Payload["multiplayer"] = multiplayer; + int players = 1; + if ( multiplayer == SERVER || (multiplayer == SINGLE && splitscreen) ) + { + for ( int i = 1; i < MAXPLAYERS; ++i ) + { + if ( !client_disconnected[i] ) + { + ++players; + } + } + } + eventContent.Payload["numplayers"] = players; + eventContent.Payload["version"] = VERSION; + eventContent.Payload["splitscreen"] = (multiplayer == SINGLE && splitscreen) ? 1 : 0; + eventContent.Payload["race"] = stats[clientnum]->playerRace; + eventContent.Payload["appearance"] = stats[clientnum]->stat_appearance; + eventContent.Payload["sex"] = stats[clientnum]->sex; + eventContent.Payload["controller"] = inputs.hasController(clientnum) ? 1 : 0; + eventContent.Payload["theme"] = *cvar_disableHoliday ? 0 : 1; + eventRequest.Events.push_back(eventContent); + PlayFab::PlayFabEventsAPI::WriteTelemetryEvents(eventRequest, OnEventsWrite, OnCloudScriptFailure); +} + +void PlayfabUser_t::globalStat(int index, int value) +{ + if ( !bLoggedIn ) + { + return; + } + + if ( index < 0 || index >= STEAM_GSTAT_MAX || value < 0 ) + { + return; + } + + if ( index >= SteamGlobalStatStr.size() ) + { + return; + } + + PlayFab::EventsModels::WriteEventsRequest eventRequest; + PlayFab::EventsModels::EventContents eventContent; + eventContent.EventNamespace = "custom.globalstats"; + eventContent.Name = "globalstats"; + eventContent.Payload[SteamGlobalStatStr[index]] = value; + eventRequest.Events.push_back(eventContent); + PlayFab::PlayFabEventsAPI::WriteTelemetryEvents(eventRequest, OnEventsWrite, OnCloudScriptFailure); +} + void PlayfabUser_t::OnLoginSuccess(const PlayFab::ClientModels::LoginResult& result, void* customData) { logInfo("Logged in successfully"); @@ -503,6 +569,10 @@ int parseOnlineHiscore(SaveGameInfo& info, Json::Value score) { player.race = RACE_HUMAN; // set to human appearance for aesthetic scores } + if ( info.dungeon_lvl >= 25 && (info.svflags & SV_FLAG_CLASSIC) ) + { + info.svflags &= ~SV_FLAG_CLASSIC; // remove classic flag from scores beyond dungeon level 25 + } player.additionalConducts[CONDUCT_MODDED] = 0; // don't display this on the leaderboard window return 0; } diff --git a/src/playfab.hpp b/src/playfab.hpp index b8d7f1d68..48712f5ad 100644 --- a/src/playfab.hpp +++ b/src/playfab.hpp @@ -47,6 +47,8 @@ class PlayfabUser_t void getLeaderboardTop100(std::string lid); void getLeaderboardAroundMe(std::string lid); void getLeaderboardTop100Alternate(std::string lid); + void gameBegin(); + void globalStat(int index, int value); struct PlayerCheckLeaderboardData_t { diff --git a/src/scores.cpp b/src/scores.cpp index 097c6f7b1..1f11161fc 100644 --- a/src/scores.cpp +++ b/src/scores.cpp @@ -26,6 +26,9 @@ #include "collision.hpp" #include "mod_tools.hpp" #include "lobbies.hpp" +#ifdef USE_PLAYFAB +#include "playfab.hpp" +#endif // definitions list_t topscores; @@ -4137,7 +4140,19 @@ void updateAchievementThankTheTank(int player, Entity* target, bool targetKilled int skillLVL = 3 * (stats[player]->getProficiency(PRO_SHIELD) / 20); if ( local_rng.rand() % (5 + skillLVL) == 0 ) { - players[player]->entity->increaseSkill(PRO_SHIELD); + bool increase = true; + if ( stats[player]->shield && itemCategory(stats[player]->shield) != ARMOR ) + { + if ( stats[player]->getProficiency(PRO_SHIELD) >= SKILL_LEVEL_SKILLED ) + { + increase = false; + } + } + if ( increase ) + { + players[player]->entity->increaseSkill(PRO_SHIELD); + players[player]->mechanics.enemyRaisedBlockingAgainst[target->getUID()]++; + } } } } @@ -5664,12 +5679,17 @@ void AchievementObserver::updateGlobalStat(int index, int value) { return; } +#ifndef DEBUG_ACHIEVEMENTS if ( conductGameChallenges[CONDUCT_CHEATS_ENABLED] || conductGameChallenges[CONDUCT_MODDED_NO_ACHIEVEMENTS] || Mods::disableSteamAchievements ) { return; } +#endif +#ifdef USE_PLAYFAB + playfabUser.globalStat(index, value); +#endif #if defined USE_EOS EOS.queueGlobalStatUpdate(index, value); #endif @@ -5745,6 +5765,12 @@ SteamGlobalStatIndexes getIndexForDeathType(int type) return STEAM_GSTAT_DEATHS_GYROBOT; case DUMMYBOT: return STEAM_GSTAT_DEATHS_DUMMYBOT; + case BAT_SMALL: + return STEAM_GSTAT_DEATHS_BAT; + case BUGBEAR: + return STEAM_GSTAT_DEATHS_BUGBEAR; + case MIMIC: + return STEAM_GSTAT_DEATHS_MIMIC; default: return STEAM_GSTAT_INVALID; } diff --git a/src/scores.hpp b/src/scores.hpp index ba6507418..4af0f26c8 100644 --- a/src/scores.hpp +++ b/src/scores.hpp @@ -186,7 +186,84 @@ enum SteamGlobalStatIndexes : int STEAM_GSTAT_TUTORIAL10_ATTEMPTS, STEAM_GSTAT_DISABLE, STEAM_GSTAT_PROMO, - STEAM_GSTAT_PROMO_INTERACT + STEAM_GSTAT_PROMO_INTERACT, + STEAM_GSTAT_DEATHS_BAT, + STEAM_GSTAT_DEATHS_BUGBEAR, + STEAM_GSTAT_DEATHS_MIMIC, + STEAM_GSTAT_MAX +}; + +const std::vector SteamGlobalStatStr = +{ + "GAMES_STARTED", + "GAMES_WON", + "BOULDER_DEATHS", + "HERX_SLAIN", + "BAPHOMET_SLAIN", + "TWINSFIRE_SLAIN", + "DEATHS_HUMAN", + "DEATHS_RAT", + "DEATHS_GOBLIN", + "DEATHS_SLIME", + "DEATHS_TROLL", + "DEATHS_SPIDER", + "DEATHS_GHOUL", + "DEATHS_SKELETON", + "DEATHS_SCORPION", + "DEATHS_IMP", + "DEATHS_GNOME", + "DEATHS_DEMON", + "DEATHS_SUCCUBUS", + "DEATHS_LICH", + "DEATHS_MINOTAUR", + "DEATHS_DEVIL", + "DEATHS_SHOPKEEPER", + "DEATHS_KOBOLD", + "DEATHS_SCARAB", + "DEATHS_CRYSTALGOLEM", + "DEATHS_INCUBUS", + "DEATHS_VAMPIRE", + "DEATHS_SHADOW", + "DEATHS_COCKATRICE", + "DEATHS_INSECTOID", + "DEATHS_GOATMAN", + "DEATHS_AUTOMATON", + "DEATHS_LICHICE", + "DEATHS_LICHFIRE", + "DEATHS_SENTRYBOT", + "DEATHS_SPELLBOT", + "DEATHS_GYROBOT", + "DEATHS_DUMMYBOT", + "TWINSICE_SLAIN", + "SHOPKEEPERS_SLAIN", + "MINOTAURS_SLAIN", + "TUTORIAL_ENTERED", + "TUTORIAL1_COMPLETED", + "TUTORIAL2_COMPLETED", + "TUTORIAL3_COMPLETED", + "TUTORIAL4_COMPLETED", + "TUTORIAL5_COMPLETED", + "TUTORIAL6_COMPLETED", + "TUTORIAL7_COMPLETED", + "TUTORIAL8_COMPLETED", + "TUTORIAL9_COMPLETED", + "TUTORIAL10_COMPLETED", + "TUTORIAL1_ATTEMPTS", + "TUTORIAL2_ATTEMPTS", + "TUTORIAL3_ATTEMPTS", + "TUTORIAL4_ATTEMPTS", + "TUTORIAL5_ATTEMPTS", + "TUTORIAL6_ATTEMPTS", + "TUTORIAL7_ATTEMPTS", + "TUTORIAL8_ATTEMPTS", + "TUTORIAL9_ATTEMPTS", + "TUTORIAL10_ATTEMPTS", + "DISABLE", + "PROMO", + "PROMO_INTERACT", + "DEATHS_BAT", + "DEATHS_BUGBEAR", + "DEATHS_MIMIC", }; SteamGlobalStatIndexes getIndexForDeathType(int type); diff --git a/src/ui/MainMenu.cpp b/src/ui/MainMenu.cpp index f28eeccc6..ec6d7664c 100644 --- a/src/ui/MainMenu.cpp +++ b/src/ui/MainMenu.cpp @@ -25756,6 +25756,61 @@ namespace MainMenu { static GetPlayersOnline getPlayersOnline; #endif + std::string MainMenuBanners_t::updateBannerImg = ""; + std::string MainMenuBanners_t::updateBannerImgHighlight = ""; + std::string MainMenuBanners_t::updateBannerURL = ""; + void MainMenuBanners_t::readFromFile() + { + const std::string filename = "data/banners.json"; + if ( !PHYSFS_getRealDir(filename.c_str()) ) + { + printlog("[JSON]: Error: Could not locate json file %s", filename.c_str()); + return; + } + + std::string inputPath = PHYSFS_getRealDir(filename.c_str()); + inputPath.append(PHYSFS_getDirSeparator()); + inputPath.append(filename.c_str()); + + File* fp = FileIO::open(inputPath.c_str(), "rb"); + if ( !fp ) + { + printlog("[JSON]: Error: Could not locate json file %s", inputPath.c_str()); + return; + } + + char buf[2048]; + int count = fp->read(buf, sizeof(buf[0]), sizeof(buf) - 1); + buf[count] = '\0'; + rapidjson::StringStream is(buf); + FileIO::close(fp); + + rapidjson::Document d; + d.ParseStream(is); + if ( !d.HasMember("version") ) + { + printlog("[JSON]: Error: No 'version' value in json file, or JSON syntax incorrect! %s", inputPath.c_str()); + return; + } + + updateBannerImg = ""; + updateBannerImgHighlight = ""; + updateBannerURL = ""; + + if ( d.HasMember("update_banner_img") && d["update_banner_img"].IsString() ) + { + updateBannerImg = d["update_banner_img"].GetString(); + } + if ( d.HasMember("update_banner_img_highlight") && d["update_banner_img_highlight"].IsString() ) + { + updateBannerImgHighlight = d["update_banner_img_highlight"].GetString(); + } + if ( d.HasMember("update_banner_link") && d["update_banner_link"].IsString() ) + { + updateBannerURL = d["update_banner_link"].GetString(); + } + } + void createMainMenu(bool ingame) { if (!ingame) { clientnum = 0; @@ -26190,14 +26245,22 @@ namespace MainMenu { #else const char* banner_images[][2] = { { - "*#images/ui/Main Menus/Banners/banner_eatmyhat.png", - "*#images/ui/Main Menus/Banners/banner_eatmyhat-hover.png", + "", + "", }, { "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_base.png", "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png", } }; + + if ( MainMenuBanners_t::updateBannerImg != "" + && MainMenuBanners_t::updateBannerImgHighlight != "" + && MainMenuBanners_t::updateBannerURL != "" ) + { + banner_images[0][0] = MainMenuBanners_t::updateBannerImg.c_str(); + banner_images[0][1] = MainMenuBanners_t::updateBannerImgHighlight.c_str(); + } // customize DLC banner. { @@ -26217,7 +26280,7 @@ namespace MainMenu { void(*banner_funcs[])(Button&) = { [](Button&) { // banner #1 - openURLTryWithOverlay("https://www.baronygame.com/blog/eat-my-hat-release"); + openURLTryWithOverlay(MainMenuBanners_t::updateBannerURL.c_str()); }, [](Button&) { // banner #2 openDLCPrompt(enabledDLCPack1 ? 1 : 0); diff --git a/src/ui/MainMenu.hpp b/src/ui/MainMenu.hpp index ab2739117..53d1b6f22 100644 --- a/src/ui/MainMenu.hpp +++ b/src/ui/MainMenu.hpp @@ -192,4 +192,12 @@ namespace MainMenu { static void update_details_text(Frame& card); static void update_details_text(Frame& card, void* stats); }; + + struct MainMenuBanners_t + { + static std::string updateBannerImg; + static std::string updateBannerImgHighlight; + static std::string updateBannerURL; + static void readFromFile(); + }; }