aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQAston <none@none>2009-07-30 12:59:59 +0200
committerQAston <none@none>2009-07-30 12:59:59 +0200
commit74d6ea4efb8a325bfabd9075403117be7a0f5e0d (patch)
treee133993862323b8a7878640a4788783744c8da08
parentd78327395547eddede45fd02b16aeaab1ae89241 (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.cpp71
-rw-r--r--src/game/ArenaTeam.h4
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: