Reformat the database to accept the additional summary counters as well as adding a couple summary counters. Also deletes unnecessary welcome message and deletes whitespace. Refs #686.

This was SVN commit r14752.
This commit is contained in:
scythetwirler 2014-02-16 06:06:16 +00:00
parent ab9a6b6303
commit be881dc420
3 changed files with 100 additions and 34 deletions

View File

@ -934,6 +934,10 @@ function reportGame(extendedSimState)
// Tribute // Tribute
playerStatistics.tributesSent = ""; playerStatistics.tributesSent = "";
playerStatistics.tributesReceived = ""; playerStatistics.tributesReceived = "";
// Total
playerStatistics.economyScore = "";
playerStatistics.militaryScore = "";
playerStatistics.totalScore = "";
// Various // Various
playerStatistics.treasuresCollected = ""; playerStatistics.treasuresCollected = "";
playerStatistics.feminisation = ""; playerStatistics.feminisation = "";
@ -963,7 +967,14 @@ function reportGame(extendedSimState)
for each (var buildingCounterType in buildingsCountersTypes) for each (var buildingCounterType in buildingsCountersTypes)
for each (var buildingsClass in buildingsClasses) for each (var buildingsClass in buildingsClasses)
playerStatistics[buildingCounterType][buildingsClass] += player.statistics[buildingCounterType][buildingsClass] + ","; playerStatistics[buildingCounterType][buildingsClass] += player.statistics[buildingCounterType][buildingsClass] + ",";
var total = 0;
for each (var res in player.statistics.resourcesGathered)
total += res;
playerStatistics.economyScore += total + ",";
playerStatistics.militaryScore += Math.round((player.statistics.enemyUnitsKilledValue +
player.statistics.enemyBuildingsDestroyedValue) / 10) + ",";
playerStatistics.totalScore += (total + Math.round((player.statistics.enemyUnitsKilledValue +
player.statistics.enemyBuildingsDestroyedValue) / 10)) + ",";
playerStatistics.tradeIncome += player.statistics.tradeIncome + ","; playerStatistics.tradeIncome += player.statistics.tradeIncome + ",";
playerStatistics.tributesSent += player.statistics.tributesSent + ","; playerStatistics.tributesSent += player.statistics.tributesSent + ",";
playerStatistics.tributesReceived += player.statistics.tributesReceived + ","; playerStatistics.tributesReceived += player.statistics.tributesReceived + ",";
@ -981,6 +992,9 @@ function reportGame(extendedSimState)
reportObject.teams = teams; reportObject.teams = teams;
reportObject.teamsLocked = String(teamsLocked); reportObject.teamsLocked = String(teamsLocked);
reportObject.mapName = mapName; reportObject.mapName = mapName;
reportObject.economyScore = playerStatistics.economyScore;
reportObject.militaryScore = playerStatistics.militaryScore;
reportObject.totalScore = playerStatistics.totalScore;
for each (var rct in resourcesCounterTypes) for each (var rct in resourcesCounterTypes)
{ {
for each (var rt in resourcesTypes) for each (var rt in resourcesTypes)

View File

@ -18,7 +18,7 @@
""" """
import sqlalchemy import sqlalchemy
from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy import Column, ForeignKey, Integer, String, Boolean
from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
@ -45,21 +45,11 @@ class PlayerInfo(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
player_id = Column(Integer, ForeignKey('players.id')) player_id = Column(Integer, ForeignKey('players.id'))
game_id = Column(Integer, ForeignKey('games.id')) game_id = Column(Integer, ForeignKey('games.id'))
civ = String(20) civs = Column(String(20))
teams = Column(Integer)
economyScore = Column(Integer) economyScore = Column(Integer)
militaryScore = Column(Integer) militaryScore = Column(Integer)
explorationScore = Column(Integer)
# Store to avoid needlessly recomputing it.
totalScore = Column(Integer) totalScore = Column(Integer)
unitsTrained = Column(Integer)
unitsLost = Column(Integer)
unitsKilled = Column(Integer)
buildingsConstructed = Column(Integer)
buildingsLost = Column(Integer)
buildingsDestroyed = Column(Integer)
civCentersBuilt = Column(Integer)
civCentersDestroyed = Column(Integer)
percentMapExplored = Column(Integer)
foodGathered = Column(Integer) foodGathered = Column(Integer)
foodUsed = Column(Integer) foodUsed = Column(Integer)
woodGathered = Column(Integer) woodGathered = Column(Integer)
@ -68,20 +58,64 @@ class PlayerInfo(Base):
stoneUsed = Column(Integer) stoneUsed = Column(Integer)
metalGathered = Column(Integer) metalGathered = Column(Integer)
metalUsed = Column(Integer) metalUsed = Column(Integer)
vegetarianRatio = Column(Integer) vegetarianFoodGathered = Column(Integer)
treasuresCollected = Column(Integer) treasuresCollected = Column(Integer)
tributesSent = Column(Integer) tributesSent = Column(Integer)
tributesRecieved = Column(Integer) tributesReceived = Column(Integer)
foodBought = Column(Integer) totalUnitsTrained = Column(Integer)
foodSold = Column(Integer) totalUnitsLost = Column(Integer)
enemytotalUnitsKilled = Column(Integer)
infantryUnitsTrained = Column(Integer)
infantryUnitsLost = Column(Integer)
enemyInfantryUnitsKilled = Column(Integer)
workerUnitsTrained = Column(Integer)
workerUnitsLost = Column(Integer)
enemyWorkerUnitsKilled = Column(Integer)
femaleUnitsTrained = Column(Integer)
femaleUnitsLost = Column(Integer)
enemyFemaleUnitsKilled = Column(Integer)
cavalryUnitsTrained = Column(Integer)
cavalryUnitsLost = Column(Integer)
enemyCavalryUnitsKilled = Column(Integer)
championUnitsTrained = Column(Integer)
championUnitsLost = Column(Integer)
enemyChampionUnitsKilled = Column(Integer)
heroUnitsTrained = Column(Integer)
heroUnitsLost = Column(Integer)
enemyHeroUnitsKilled = Column(Integer)
shipUnitsTrained = Column(Integer)
shipUnitsLost = Column(Integer)
enemyShipUnitsKilled = Column(Integer)
totalBuildingsConstructed = Column(Integer)
totalBuildingsLost = Column(Integer)
enemytotalBuildingsDestroyed = Column(Integer)
civCentreBuildingsConstructed = Column(Integer)
civCentreBuildingsLost = Column(Integer)
enemyCivCentreBuildingsDestroyed = Column(Integer)
houseBuildingsConstructed = Column(Integer)
houseBuildingsLost = Column(Integer)
enemyHouseBuildingsDestroyed = Column(Integer)
economicBuildingsConstructed = Column(Integer)
economicBuildingsLost = Column(Integer)
enemyEconomicBuildingsDestroyed = Column(Integer)
outpostBuildingsConstructed = Column(Integer)
outpostBuildingsLost = Column(Integer)
enemyOutpostBuildingsDestroyed = Column(Integer)
militaryBuildingsConstructed = Column(Integer)
militaryBuildingsLost = Column(Integer)
enemyMilitaryBuildingsDestroyed = Column(Integer)
fortressBuildingsConstructed = Column(Integer)
fortressBuildingsLost = Column(Integer)
enemyFortressBuildingsDestroyed = Column(Integer)
wonderBuildingsConstructed = Column(Integer)
wonderBuildingsLost = Column(Integer)
enemyWonderBuildingsDestroyed = Column(Integer)
woodBought = Column(Integer) woodBought = Column(Integer)
woodSold = Column(Integer) foodBought = Column(Integer)
stoneBought = Column(Integer) stoneBought = Column(Integer)
stoneSold = Column(Integer)
metalBought = Column(Integer) metalBought = Column(Integer)
metalSold = Column(Integer)
barterEfficiency = Column(Integer)
tradeIncome = Column(Integer) tradeIncome = Column(Integer)
percentMapExplored = Column(Integer)
class Game(Base): class Game(Base):
__tablename__ = 'games' __tablename__ = 'games'
@ -89,6 +123,8 @@ class Game(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
map = Column(String(80)) map = Column(String(80))
duration = Column(Integer) duration = Column(Integer)
teamsLocked = Column(Boolean)
matchID = Column(String(20))
winner_id = Column(Integer, ForeignKey('players.id')) winner_id = Column(Integer, ForeignKey('players.id'))
player_info = relationship('PlayerInfo', backref='game') player_info = relationship('PlayerInfo', backref='game')
players = relationship('Player', secondary='players_info') players = relationship('Player', secondary='players_info')

View File

@ -85,24 +85,41 @@ class LeaderboardList():
winning_jid = list(dict.keys({jid: state for jid, state in winning_jid = list(dict.keys({jid: state for jid, state in
gamereport['playerStates'].items() gamereport['playerStates'].items()
if state == 'won'}))[0] if state == 'won'}))[0]
def get(stat, jid): def get(stat, jid):
return gamereport[stat][jid] return gamereport[stat][jid]
stats = {'civ': 'civs', 'foodGathered': 'foodGathered', 'foodUsed': 'foodUsed', singleStats = {'timeElapsed', 'mapName', 'teamsLocked', 'matchID'}
'woodGathered': 'woodGathered', 'woodUsed': 'woodUsed', totalScoreStats = {'economyScore', 'militaryScore', 'totalScore'}
'stoneGathered': 'stoneGathered', 'stoneUsed': 'stoneUsed', resourceStats = {'foodGathered', 'foodUsed', 'woodGathered', 'woodUsed',
'metalGathered': 'metalGathered', 'metalUsed': 'metalUsed'} 'stoneGathered', 'stoneUsed', 'metalGathered', 'metalUsed', 'vegetarianFoodGathered',
'treasuresCollected', 'tributesSent', 'tributesReceived'}
unitsStats = {'totalUnitsTrained', 'totalUnitsLost', 'enemytotalUnitsKilled', 'infantryUnitsTrained',
'infantryUnitsLost', 'enemyInfantryUnitsKilled', 'workerUnitsTrained', 'workerUnitsLost',
'enemyWorkerUnitsKilled', 'femaleUnitsTrained', 'femaleUnitsLost', 'enemyFemaleUnitsKilled',
'cavalryUnitsTrained', 'cavalryUnitsLost', 'enemyCavalryUnitsKilled', 'championUnitsTrained',
'championUnitsLost', 'enemyChampionUnitsKilled', 'heroUnitsTrained', 'heroUnitsLost',
'enemyHeroUnitsKilled', 'shipUnitsTrained', 'shipUnitsLost', 'enemyShipUnitsKilled'}
buildingsStats = {'totalBuildingsConstructed', 'totalBuildingsLost', 'enemytotalBuildingsDestroyed',
'civCentreBuildingsConstructed', 'civCentreBuildingsLost', 'enemyCivCentreBuildingsDestroyed',
'houseBuildingsConstructed', 'houseBuildingsLost', 'enemyHouseBuildingsDestroyed',
'economicBuildingsConstructed', 'economicBuildingsLost', 'enemyEconomicBuildingsDestroyed',
'outpostBuildingsConstructed', 'outpostBuildingsLost', 'enemyOutpostBuildingsDestroyed',
'militaryBuildingsConstructed', 'militaryBuildingsLost', 'enemyMilitaryBuildingsDestroyed',
'fortressBuildingsConstructed', 'fortressBuildingsLost', 'enemyFortressBuildingsDestroyed',
'wonderBuildingsConstructed', 'wonderBuildingsLost', 'enemyWonderBuildingsDestroyed'}
marketStats = {'woodBought', 'foodBought', 'stoneBought', 'metalBought', 'tradeIncome'}
miscStats = {'civs', 'teams', 'percentMapExplored'}
stats = totalScoreStats | resourceStats | unitsStats | buildingsStats | marketStats | miscStats
playerInfos = [] playerInfos = []
for player in players: for player in players:
jid = player.jid jid = player.jid
playerinfo = PlayerInfo(player=player) playerinfo = PlayerInfo(player=player)
for dbname, reportname in stats.items(): for reportname in stats:
setattr(playerinfo, dbname, get(reportname, jid)) setattr(playerinfo, reportname, get(reportname, jid))
playerInfos.append(playerinfo) playerInfos.append(playerinfo)
game = Game(map=gamereport['mapName'], duration=int(gamereport['timeElapsed'])) game = Game(map=gamereport['mapName'], duration=int(gamereport['timeElapsed']), teamsLocked=bool(gamereport['teamsLocked']), matchID=gamereport['matchID'])
game.players.extend(players) game.players.extend(players)
game.player_info.extend(playerInfos) game.player_info.extend(playerInfos)
game.winner = db.query(Player).filter_by(jid=winning_jid).first() game.winner = db.query(Player).filter_by(jid=winning_jid).first()
@ -165,14 +182,14 @@ class LeaderboardList():
player2.rating += rating_adjustment2 player2.rating += rating_adjustment2
db.commit() db.commit()
return self return self
def getLastRatedMessage(self): def getLastRatedMessage(self):
""" """
Gets the string of the last rated game. Triggers an update Gets the string of the last rated game. Triggers an update
chat for the bot. chat for the bot.
""" """
return self.lastRated return self.lastRated
def addAndRateGame(self, gamereport): def addAndRateGame(self, gamereport):
""" """
Calls addGame and if the game has only two Calls addGame and if the game has only two
@ -475,7 +492,6 @@ class XpartaMuPP(sleekxmpp.ClientXMPP):
self.nicks[str(presence['muc']['jid'])] = presence['muc']['nick'] self.nicks[str(presence['muc']['jid'])] = presence['muc']['nick']
# Check the jid isn't already in the lobby. # Check the jid isn't already in the lobby.
if str(presence['muc']['jid']) != self.lastLeft: if str(presence['muc']['jid']) != self.lastLeft:
self.send_message(mto=presence['from'], mbody="Hello %s, welcome to the 0 A.D. lobby. Polish your weapons and get ready to fight!" %(presence['muc']['nick']), mtype='')
# Send Gamelist to new player. # Send Gamelist to new player.
self.sendGameList(presence['muc']['jid']) self.sendGameList(presence['muc']['jid'])
# Following two calls make sqlalchemy complain about using objects in the # Following two calls make sqlalchemy complain about using objects in the
@ -509,7 +525,7 @@ class XpartaMuPP(sleekxmpp.ClientXMPP):
""" """
if msg['mucnick'] != self.nick and self.nick.lower() in msg['body'].lower(): if msg['mucnick'] != self.nick and self.nick.lower() in msg['body'].lower():
self.send_message(mto=msg['from'].bare, self.send_message(mto=msg['from'].bare,
mbody="I (%s) am the administrative bot in this lobby and cannot participate in any games." % self.nick, mbody="I am the administrative bot in this lobby and cannot participate in any games.",
mtype='groupchat') mtype='groupchat')
def iqhandler(self, iq): def iqhandler(self, iq):