diff options
author | QAston <none@none> | 2009-07-30 12:59:59 +0200 |
---|---|---|
committer | QAston <none@none> | 2009-07-30 12:59:59 +0200 |
commit | 74d6ea4efb8a325bfabd9075403117be7a0f5e0d (patch) | |
tree | e133993862323b8a7878640a4788783744c8da08 | |
parent | d78327395547eddede45fd02b16aeaab1ae89241 (diff) |
*[8267] ArenaTeam: added check, that teamrating won't become negative Author: Barlok
*[8268] ArenaTeam: new rating-system for season 6 Authors: danielich and XTZGZoReX.
--HG--
branch : trunk
-rw-r--r-- | src/game/ArenaTeam.cpp | 71 | ||||
-rw-r--r-- | src/game/ArenaTeam.h | 4 |
2 files changed, 44 insertions, 31 deletions
diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 8c7b2c8f89f..add971a2ab6 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -20,6 +20,7 @@ #include "WorldPacket.h" #include "ArenaTeam.h" +#include "World.h" void ArenaTeamMember::ModifyPersonalRating(Player* plr, int32 mod, uint32 slot) { @@ -44,7 +45,10 @@ ArenaTeam::ArenaTeam() stats.games_week = 0; stats.games_season = 0; stats.rank = 0; - stats.rating = ARENA_NEW_TEAM_RATING; + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + stats.rating = 0; + else + stats.rating = 1500; stats.wins_week = 0; stats.wins_season = 0; } @@ -139,7 +143,17 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) newmember.games_week = 0; newmember.wins_season = 0; newmember.wins_week = 0; - newmember.personal_rating = AREAN_NEW_PERSONAL_RATING; + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + { + if (stats.rating < 1000) + newmember.personal_rating = stats.rating; + else + newmember.personal_rating = 1000; + } + else + { + newmember.personal_rating = 1500; + } members.push_back(newmember); CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid, personal_rating) VALUES ('%u', '%u', '%u')", Id, GUID_LOPART(newmember.guid), newmember.personal_rating ); @@ -517,24 +531,24 @@ float ArenaTeam::GetChanceAgainst(uint32 own_rating, uint32 enemy_rating) { // returns the chance to win against a team with the given rating, used in the rating adjustment calculation // ELO system + + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + if (enemy_rating < 1300) + enemy_rating = 1300; + return 1.0f/(1.0f+exp(log(10.0f)*(float)((float)enemy_rating - (float)own_rating)/400.0f)); } -int32 ArenaTeam::WonAgainst(uint32 againstRating) +void ArenaTeam::FinishGame(int32 mod) { - // called when the team has won - //'chance' calculation - to beat the opponent - float chance = GetChanceAgainst(stats.rating,againstRating); - // calculate the rating modification (ELO system with k=32) - int32 mod = (int32)floor(32.0f * (1.0f - chance)); - // modify the team stats accordingly - int32 newTeamRating = (int32)stats.rating + mod; - stats.rating = newTeamRating > 0 ? newTeamRating : 0; + if (int32(stats.rating) + mod < 0) + stats.rating = 0; + else + stats.rating += mod; + stats.games_week += 1; - stats.wins_week += 1; stats.games_season += 1; - stats.wins_season += 1; - //update team's rank + // update team's rank stats.rank = 1; ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) @@ -542,6 +556,19 @@ int32 ArenaTeam::WonAgainst(uint32 againstRating) if (i->second->GetType() == this->Type && i->second->GetStats().rating > stats.rating) ++stats.rank; } +} + +int32 ArenaTeam::WonAgainst(uint32 againstRating) +{ + // called when the team has won + //'chance' calculation - to beat the opponent + float chance = GetChanceAgainst(stats.rating, againstRating); + // calculate the rating modification (ELO system with k=32) + int32 mod = (int32)floor(32.0f * (1.0f - chance)); + // modify the team stats accordingly + FinishGame(mod); + stats.wins_week += 1; + stats.wins_season += 1; // return the rating change, used to display it on the results screen return mod; @@ -551,23 +578,11 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating) { // called when the team has lost //'chance' calculation - to loose to the opponent - float chance = GetChanceAgainst(stats.rating,againstRating); + float chance = GetChanceAgainst(stats.rating, againstRating); // calculate the rating modification (ELO system with k=32) int32 mod = (int32)ceil(32.0f * (0.0f - chance)); // modify the team stats accordingly - int32 newTeamRating = (int32)stats.rating + mod; - stats.rating = newTeamRating > 0 ? newTeamRating : 0; - stats.games_week += 1; - stats.games_season += 1; - //update team's rank - - stats.rank = 1; - ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); - for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) - { - if (i->second->GetType() == this->Type && i->second->GetStats().rating > stats.rating) - ++stats.rank; - } + FinishGame(mod); // return the rating change, used to display it on the results screen return mod; diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h index 2dc5b45e880..6db63c82ddc 100644 --- a/src/game/ArenaTeam.h +++ b/src/game/ArenaTeam.h @@ -85,9 +85,6 @@ enum ArenaTeamTypes ARENA_TEAM_5v5 = 5 }; -#define ARENA_NEW_TEAM_RATING 0 -#define AREAN_NEW_PERSONAL_RATING 0 - struct ArenaTeamMember { uint64 guid; @@ -202,6 +199,7 @@ class ArenaTeam void NotifyStatsChanged(); void FinishWeek(); + void FinishGame(int32 mod); protected: |