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
playerStatistics.tributesSent = "";
playerStatistics.tributesReceived = "";
// Total
playerStatistics.economyScore = "";
playerStatistics.militaryScore = "";
playerStatistics.totalScore = "";
// Various
playerStatistics.treasuresCollected = "";
playerStatistics.feminisation = "";
@ -963,7 +967,14 @@ function reportGame(extendedSimState)
for each (var buildingCounterType in buildingsCountersTypes)
for each (var buildingsClass in buildingsClasses)
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.tributesSent += player.statistics.tributesSent + ",";
playerStatistics.tributesReceived += player.statistics.tributesReceived + ",";
@ -981,6 +992,9 @@ function reportGame(extendedSimState)
reportObject.teams = teams;
reportObject.teamsLocked = String(teamsLocked);
reportObject.mapName = mapName;
reportObject.economyScore = playerStatistics.economyScore;
reportObject.militaryScore = playerStatistics.militaryScore;
reportObject.totalScore = playerStatistics.totalScore;
for each (var rct in resourcesCounterTypes)
{
for each (var rt in resourcesTypes)

View File

@ -18,7 +18,7 @@
"""
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.ext.declarative import declarative_base
@ -45,21 +45,11 @@ class PlayerInfo(Base):
id = Column(Integer, primary_key=True)
player_id = Column(Integer, ForeignKey('players.id'))
game_id = Column(Integer, ForeignKey('games.id'))
civ = String(20)
civs = Column(String(20))
teams = Column(Integer)
economyScore = Column(Integer)
militaryScore = Column(Integer)
explorationScore = Column(Integer)
# Store to avoid needlessly recomputing it.
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)
foodUsed = Column(Integer)
woodGathered = Column(Integer)
@ -68,20 +58,64 @@ class PlayerInfo(Base):
stoneUsed = Column(Integer)
metalGathered = Column(Integer)
metalUsed = Column(Integer)
vegetarianRatio = Column(Integer)
vegetarianFoodGathered = Column(Integer)
treasuresCollected = Column(Integer)
tributesSent = Column(Integer)
tributesRecieved = Column(Integer)
foodBought = Column(Integer)
foodSold = Column(Integer)
tributesReceived = Column(Integer)
totalUnitsTrained = 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)
woodSold = Column(Integer)
foodBought = Column(Integer)
stoneBought = Column(Integer)
stoneSold = Column(Integer)
metalBought = Column(Integer)
metalSold = Column(Integer)
barterEfficiency = Column(Integer)
tradeIncome = Column(Integer)
percentMapExplored = Column(Integer)
class Game(Base):
__tablename__ = 'games'
@ -89,6 +123,8 @@ class Game(Base):
id = Column(Integer, primary_key=True)
map = Column(String(80))
duration = Column(Integer)
teamsLocked = Column(Boolean)
matchID = Column(String(20))
winner_id = Column(Integer, ForeignKey('players.id'))
player_info = relationship('PlayerInfo', backref='game')
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
gamereport['playerStates'].items()
if state == 'won'}))[0]
def get(stat, jid):
return gamereport[stat][jid]
stats = {'civ': 'civs', 'foodGathered': 'foodGathered', 'foodUsed': 'foodUsed',
'woodGathered': 'woodGathered', 'woodUsed': 'woodUsed',
'stoneGathered': 'stoneGathered', 'stoneUsed': 'stoneUsed',
'metalGathered': 'metalGathered', 'metalUsed': 'metalUsed'}
singleStats = {'timeElapsed', 'mapName', 'teamsLocked', 'matchID'}
totalScoreStats = {'economyScore', 'militaryScore', 'totalScore'}
resourceStats = {'foodGathered', 'foodUsed', 'woodGathered', 'woodUsed',
'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 = []
for player in players:
jid = player.jid
playerinfo = PlayerInfo(player=player)
for dbname, reportname in stats.items():
setattr(playerinfo, dbname, get(reportname, jid))
for reportname in stats:
setattr(playerinfo, reportname, get(reportname, jid))
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.player_info.extend(playerInfos)
game.winner = db.query(Player).filter_by(jid=winning_jid).first()
@ -165,14 +182,14 @@ class LeaderboardList():
player2.rating += rating_adjustment2
db.commit()
return self
def getLastRatedMessage(self):
"""
Gets the string of the last rated game. Triggers an update
chat for the bot.
"""
return self.lastRated
def addAndRateGame(self, gamereport):
"""
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']
# Check the jid isn't already in the lobby.
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.
self.sendGameList(presence['muc']['jid'])
# 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():
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')
def iqhandler(self, iq):