Index: code/pygame/cgame/cg.py
===================================================================
--- code/pygame/cgame/cg.py	(revision 8)
+++ code/pygame/cgame/cg.py	(working copy)
@@ -50,6 +50,7 @@
 		self.snap = self.nextSnap = None
 		self.snapshotNum = 0
 		self.snapshotTime = 0
+		self.timeLimitWarnings = 0
 		self.processedSnapshotNum = 0
 		self.serverCommandSequence = 0
 		# Game state
@@ -329,6 +330,7 @@
 		self.soundTime = 0
 		self.rewardBuffer = LimitedBuffer(MAX_REWARDBUFFER)
 		self.rewardTime = 0
+		self.drawAmmoWarning = True
 		self.lowAmmoWarning = 0
 		self.itemPickup = None
 		self.itemPickupTime = 0
@@ -337,6 +339,18 @@
 		self.powerupActive = PW_NONE
 		self.powerupTime = 0
 		self.attackerTime = 0
+		# Scoreboard
+		self.scoreBoardShowing = True
+		self.showScores = False
+		self.scoreFadeTime = 100
+		self.scoresRequestTime = 0
+		self.numScores = 0
+		self.drawStatus = True
+		self.headStartYaw = 0
+		self.headEndYaw = 0
+		self.headEndPitch = 0
+		self.headStartTime = 0
+		self.headEndTime = 0
 		# Predicted player state
 		self.pps = None
 		self.pmove = None  # Augments the player state with necessary movement stuff
@@ -375,6 +389,8 @@
 		self.loading = None
 		self.fragLimitWarnings = 0
 		self.mapRestart = False
+		self.paused = False
+		self.deferredPlayerLoading = 0
 		#self.setGuard(True)
 
 
Index: code/pygame/cgame/frame.py
===================================================================
--- code/pygame/cgame/frame.py	(revision 7)
+++ code/pygame/cgame/frame.py	(working copy)
@@ -11,6 +11,8 @@
 import initialize
 import predict
 import snapshot
+import draw
+import scoreboard
 
 
 def run(serverTime, demoPlayback):
@@ -99,11 +101,14 @@
 		if (t - cg.state.time) // POWERUP_BLINK_TIME != (t - cg.state.oldTime) // POWERUP_BLINK_TIME:
 			cg.media.wearOffSound.startSound(cg.state.snap.ps.clientNum, channel=CHAN_ITEM)
 	
-	# TODO: draw tournament scoreboard (see CG_DrawActive in cg_draw.c)
-	
 	# Actually issue the rendering calls
 	cg.data.scene.render()
 	
+	# don't draw center string if scoreboard is up
+	cg.data.scoreBoardShowing = scoreboard.drawScoreBoard()
+	if ( not cg.data.scoreBoardShowing):
+		draw.drawCenterString()
+	
 	# Draw 2D stuff
 	hud.render()
 	
Index: code/pygame/cgame/draw.py
===================================================================
--- code/pygame/cgame/draw.py	(revision 6)
+++ code/pygame/cgame/draw.py	(working copy)
@@ -93,6 +93,10 @@
 		drawChar(xx, y, charWidth, charHeight, ch, color)
 		xx += charWidth
 
+# TODO: put this in the right place
+# TODO: implement me
+def drawCenterString():
+	pass
 
 def drawBigString(x, y, s, alpha):
 	drawStringExt(x, y, s, COLOR_WHITE.withAlpha(alpha), False, True,
Index: code/pygame/cgame/console.py
===================================================================
--- code/pygame/cgame/console.py	(revision 6)
+++ code/pygame/cgame/console.py	(working copy)
@@ -157,6 +157,7 @@
 	
 	import cweapons
 	import frame
+	import scoreboard
 	
 	# This has to be created here to avoid circular dependencies with other modules
 	# Either that, or we'd have to write wrappers for any handlers that exist
@@ -168,6 +169,8 @@
 		'weapprev': cweapons.doWeaponPrev,
 		'+zoom': frame.doPlusZoom,
 		'-zoom': frame.doMinusZoom,
+		'+scores': scoreboard.scoresDown,
+		'-scores': scoreboard.scoresUp,
 	}
 	
 	for cmd in commandList.keys():
Index: code/pygame/cgame/hud.py
===================================================================
--- code/pygame/cgame/hud.py	(revision 6)
+++ code/pygame/cgame/hud.py	(working copy)
@@ -1,11 +1,11 @@
 from __future__ import division
+import math
 
 from local import *
 
 import console
 import draw
 
-
 #
 # WARNING! WARNING! WARNING!
 #
@@ -39,7 +39,7 @@
 centerString = None
 
 def centerPrint(s, y, charWidth):
-	global centerString	
+	global centerString
 	centerString = CenterString(s, y, charWidth)
 
 
@@ -94,8 +94,7 @@
 		return
 	
 	if cg.state.snap.ps.pmType == PM_INTERMISSION:
-		# TODO: renderIntermission()
-		return
+		renderIntermission()
 	
 	if cg.state.snap.ps.persistent[PERS_TEAM] == TEAM_SPECTATOR:
 		# TODO: renderSpectator()
@@ -103,9 +102,9 @@
 		# TODO: renderCrosshairNames()
 	else:
 		# Don't draw any status if dead or the scoreboard is being explicitly shown
-		if True: #not cg.data.showScores and cg.state.snap.ps.stats[STAT_HEALTH] > 0:
-			# TODO: renderStatusBar()
-			# TODO: renderAmmoWarning()
+		if not cg.data.showScores and cg.state.snap.ps.stats[STAT_HEALTH] > 0:
+			renderStatusBar()
+			renderAmmoWarning()
 			renderCrosshair()
 			# TODO: renderCrosshairNames()
 			# TODO: renderWeaponSelect()
@@ -120,3 +119,89 @@
 		# TODO: cg.data.scoreBoardShowing = renderScoreboard()
 		# TODO: if not cg.data.scoreBoardShowing:
 		# TODO: 	renderCenterString()
+
+def renderStatusBar():
+	# see cg_draw.c:525 - CG_DrawStatusBar
+	colors = [
+			(1.0, 0.69, 0.0, 1.0),
+			(1.0, 0.2, 0.2, 1.0),
+			(0.5, 0.5, 0.5, 0.5),
+			(1.0, 1.0, 1.0, 1.0)]
+
+	if not cg.data.drawStatus:
+		return
+	renderTeamBackground( 0, 420, 640, 60, 0.33, cg.data.pps.persistent[PERS_TEAM])
+	# TODO: add code here
+	renderStatusBarHead(185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE)
+
+def renderTeamBackground(x, y, w, h, alpha, team):
+	if team == TEAM_RED:
+		hcolor = Color(1, 0, 0, alpha)
+	elif team == TEAM_BLUE:
+		hcolor = Color(0, 0, 1, alpha)
+	else:
+		return
+	draw.drawPic(x, y, w, h, cg.media.teamStatusBar, hcolor)
+
+def renderStatusBarHead(x):
+	print 'foo'
+	# (cg_draw.c:427 - CG_DrawStatusBarHead)
+	if cg.data.damageTime and cg.state.time - cg.data.damageTime < DAMAGE_TIME:
+		frac = float(cg.state.time - cg.data.damageTime ) / DAMAGE_TIME
+		size = ICON_SIZE * 1.25 * (1.5 - frac * 0.5)
+
+		stretch = size - ICON_SIZE * 1.25;
+		# kick in the direction of damage
+		x -= stretch * 0.5 + cg.data.damageX * stretch * 0.5;
+
+		cg.data.headStartYaw = 180 + cg.data.damageX * 45;
+
+		cg.data.headEndYaw = 180 + 20 * math.cos(engine.crandomFloat()*math.pi)
+		cg.data.headEndPitch = 5 * math.cos(engine.crandomFloat()*math.pi)
+
+		cg.data.headStartTime = cg.state.time;
+		cg.data.headEndTime = cg.state.time + 100 + engine.randomFloat() * 2000
+	else:
+		if ( cg.state.time >= cg.data.headEndTime ):
+			# select a new head angle
+			cg.data.headStartYaw = cg.data.headEndYaw
+			cg.data.headStartPitch = cg.data.headEndPitch
+			cg.data.headStartTime = cg.data.headEndTime
+			cg.data.headEndTime = cg.state.time + 100 + engine.randomFloat() * 2000
+
+			cg.data.headEndYaw = 180 + 20 * math.cos( engine.crandomFloat()*math.pi )
+			cg.data.headEndPitch = 5 * math.cos( engine.crandomFloat()*math.pi )
+		size = ICON_SIZE * 1.25
+	
+	# if the server was frozen for a while we may have a bad head start time
+	if ( cg.data.headStartTime > cg.state.time ):
+		cg.data.headStartTime = cg.state.time
+
+	frac = (cg.state.time - cg.data.headStartTime) / float(cg.data.headEndTime - cg.data.headStartTime)
+	frac = frac * frac * ( 3 - (2 * frac) );
+	angles = Angles (cg.data.headStartPitch + (cg.data.headEndPitch - cg.data.headStartPitch) * frac,
+					 cg.data.headStartYaw + (cg.data.headEndYaw - cg.data.headStartYaw) * frac )
+
+	# TODO: implement DrawHead
+	# CG_DrawHead( x, 480 - size, size, size, 
+	#			cg.snap->ps.clientNum, angles );
+
+def renderAmmoWarning():
+	if not cg.data.drawAmmoWarning:
+		return
+	if not cg.data.lowAmmoWarning:
+		return
+	if cg.data.lowAmmoWarning == 2:
+		s = "OUT OF AMMO"
+	else:
+		s = "LOW AMMO WARNING"
+	w = len(s) * BIGCHAR_WIDTH
+	draw.drawBigString(320 - w / 2, 64, s, 1.0)
+
+def renderIntermission():
+	# TODO: Implement the rest of this function - see cg_draw.c:2225 CG_DrawIntermission
+	if cg.state.gameType == GT_SINGLE_PLAYER:
+		renderCenterString()
+		return
+	cg.data.scoreFadeTime = cg.state.time
+	#cg.scoreBoardShowing = CG_DrawScoreboard();
Index: Makefile
===================================================================
--- Makefile	(revision 6)
+++ Makefile	(working copy)
@@ -1476,6 +1476,7 @@
   cgame/playerstate.py \
   cgame/predict.py \
   cgame/servercmds.py \
+  cgame/scoreboard.py \
   cgame/snapshot.py \
   common/__init__.py \
   common/iteminfo.py \
@@ -1503,6 +1504,7 @@
   cgame/playerstate.pyc \
   cgame/predict.pyc \
   cgame/servercmds.pyc \
+  cgame/scoreboard.pyc \
   cgame/snapshot.pyc \
   common/__init__.pyc \
   common/iteminfo.pyc \
