Index: cl_main.c
===================================================================
--- cl_main.c	(revision 11991)
+++ cl_main.c	(working copy)
@@ -178,6 +178,13 @@
 		VectorSet(cl.playercrouchmins, -16, -16, -24);
 		VectorSet(cl.playercrouchmaxs, 16, 16, 25);
 	}
+	else if (gamemode == GAME_TRANSFUSION)
+	{
+		VectorSet(cl.playerstandmins, -16, -16, -20);
+		VectorSet(cl.playerstandmaxs, 16, 16, 32);
+		VectorSet(cl.playercrouchmins, -16, -16, -20);
+		VectorSet(cl.playercrouchmaxs, 16, 16, -5);
+	}
 	else
 	{
 		VectorSet(cl.playerstandmins, -16, -16, -24);
Index: console.c
===================================================================
--- console.c	(revision 11991)
+++ console.c	(working copy)
@@ -1680,7 +1680,26 @@
 	if (con_notify.integer < 0)
 		Cvar_SetValueQuick(&con_notify, 0);
 	if (gamemode == GAME_TRANSFUSION)
-		v = 8; // vertical offset
+	{
+		if (cl.gametype == GAME_DEATHMATCH)
+		{
+			int active_players = 0;
+			int i;
+			for (i=0 ; i<cl.maxclients ; i++)
+			{
+				if (cl.scores[i].name[0])
+				{
+					active_players++;
+				}
+			}
+			if (active_players > 4)
+				v = 48;
+			else
+				v = 24;
+		}
+		else
+			v = 0;
+	}
 	else
 		v = 0;
 
Index: darkplaces.ico
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/x-icon
Index: menu.c
===================================================================
--- menu.c	(revision 11991)
+++ menu.c	(working copy)
@@ -1044,18 +1044,19 @@
 
 static void M_Transfusion_Episode_Draw (void)
 {
-	int y;
+	/*int y;
 	cachepic_t *p;
-	char vabuf[1024];
+	char vabuf[1024];*/
 	M_Background(640, 480);
 
-	p = Draw_CachePic ("gfx/menu/tb-episodes");
+	M_Print(264, 236, "Coming Soon...");
+	/*p = Draw_CachePic ("gfx/menu/tb-episodes");
 	M_DrawPic (640/2 - p->width/2, 40, "gfx/menu/tb-episodes");
 	for (y = 0; y < EPISODE_ITEMS; y++){
 		M_DrawPic (0, 160 + y * 40, va(vabuf, sizeof(vabuf), "gfx/menu/episode%i", y+1));
 	}
 
-	M_DrawPic (0, 120 + (m_episode_cursor + 1) * 40, va(vabuf, sizeof(vabuf), "gfx/menu/episode%iselected", m_episode_cursor + 1));
+	M_DrawPic (0, 120 + (m_episode_cursor + 1) * 40, va("gfx/menu/episode%iselected", m_episode_cursor + 1));*/
 }
 
 static void M_Transfusion_Episode_Key (int key, int ascii)
@@ -1066,7 +1067,7 @@
 		M_Menu_Main_f ();
 		break;
 
-	case K_DOWNARROW:
+	/*case K_DOWNARROW:
 		S_LocalSound ("sound/misc/menu1.wav");
 		m_episode_cursor++;
 		if (m_episode_cursor >= EPISODE_ITEMS)
@@ -1083,7 +1084,7 @@
 	case K_ENTER:
 		Cbuf_AddText ("deathmatch 0\n");
 		m_entersound = true;
-		M_Menu_Transfusion_Skill_f ();
+		M_Menu_Transfusion_Skill_f ();*/
 	}
 }
 
@@ -2373,14 +2374,15 @@
 static const char *transfusionbindnames[][2] =
 {
 {"",				"Movement"},		// Movement commands
-{"+forward", 		"walk forward"},
-{"+back", 			"backpedal"},
-{"+left", 			"turn left"},
-{"+right", 			"turn right"},
-{"+moveleft", 		"step left"},
-{"+moveright", 		"step right"},
-{"+jump", 			"jump / swim up"},
-{"+movedown",		"swim down"},
+{"+forward", 		"Walk Forward"},
+{"+back", 			"Backpedal"},
+{"+left", 			"Turn Left"},
+{"+right", 			"Turn Right"},
+{"+moveleft", 		"Step Left"},
+{"+moveright", 		"Step Right"},
+{"+button5",		"Crouch"},
+{"+jump", 			"Jump / Swim Up"},
+{"+movedown",		"Swim Down"},
 {"",				"Combat"},			// Combat commands
 {"impulse 1",		"Pitch Fork"},
 {"impulse 2",		"Flare Gun"},
@@ -2394,28 +2396,29 @@
 {"impulse 8",		"Tesla Cannon"},
 {"impulse 9",		"Life Leech"},
 {"impulse 10",		"Voodoo Doll"},
-{"impulse 21",		"next weapon"},
-{"impulse 22",		"previous weapon"},
-{"+attack", 		"attack"},
-{"+button3",		"altfire"},
+{"impulse 21",		"Next Weapon"},
+{"impulse 22",		"Previous Weapon"},
+{"+attack", 		"Attack"},
+{"+button3",		"Alt-fire"},
 {"",				"Inventory"},		// Inventory commands
 {"impulse 40",		"Dr.'s Bag"},
 {"impulse 41",		"Crystal Ball"},
 {"impulse 42",		"Beast Vision"},
 {"impulse 43",		"Jump Boots"},
-{"impulse 23",		"next item"},
-{"impulse 24",		"previous item"},
-{"impulse 25",		"use item"},
+{"impulse 23",		"Next Item"},
+{"impulse 24",		"Previous Item"},
+{"impulse 25",		"Use Item"},
 {"",				"Misc"},			// Misc commands
-{"+button4",		"use"},
-{"impulse 50",		"add bot (red)"},
-{"impulse 51",		"add bot (blue)"},
-{"impulse 52",		"kick a bot"},
-{"impulse 26",		"next armor type"},
-{"impulse 27",		"identify player"},
-{"impulse 55",		"voting menu"},
-{"impulse 56",		"observer mode"},
-{"",				"Taunts"},            // Taunts
+{"+button4",		"Use"},
+{"impulse 50",		"Add bot (Red)"},
+{"impulse 51",		"Add bot (Blue)"},
+{"impulse 52",		"Kick a bot"},
+//{"impulse 26",		"Next armor type"},
+{"impulse 27",		"Identify Player"},
+{"impulse 55",		"Voting Menu"},
+{"impulse 56",		"Observer Mode"},
+{"impulse 70",		"Taunt"}
+/*{"",				"Taunts"},            // Taunts
 {"impulse 70",		"taunt 0"},
 {"impulse 71",		"taunt 1"},
 {"impulse 72",		"taunt 2"},
@@ -2425,7 +2428,7 @@
 {"impulse 76",		"taunt 6"},
 {"impulse 77",		"taunt 7"},
 {"impulse 78",		"taunt 8"},
-{"impulse 79",		"taunt 9"}
+{"impulse 79",		"taunt 9"}*/
 };
 
 static const char *goodvsbad2bindnames[][2] =
@@ -3155,10 +3158,10 @@
 static void M_Credits_Draw (void)
 {
 	M_Background(640, 480);
-	M_DrawPic (0, 0, "gfx/creditsmiddle");
+	M_DrawPic (180, 66, "gfx/menu/tile2573");//middle
+	//draw scroller here
 	M_Print (640/2 - 14/2*8, 236, "Coming soon...");
-	M_DrawPic (0, 0, "gfx/creditstop");
-	M_DrawPic (0, 433, "gfx/creditsbottom");
+	M_DrawPic (0, 0, "gfx/menu/tile2574");//outline
 }
 
 
@@ -3423,7 +3426,7 @@
 		if (lanConfig_cursor < 0)
 			lanConfig_cursor = NUM_LANCONFIG_CMDS-1;
 		// when in start game menu, skip the unused search qw servers item
-		if (StartingGame && lanConfig_cursor == 2)
+		if (StartingGame && lanConfig_cursor >= 2)
 			lanConfig_cursor = 1;
 		break;
 
@@ -3433,8 +3436,8 @@
 		if (lanConfig_cursor >= NUM_LANCONFIG_CMDS)
 			lanConfig_cursor = 0;
 		// when in start game menu, skip the unused search qw servers item
-		if (StartingGame && lanConfig_cursor == 1)
-			lanConfig_cursor = 2;
+		if (StartingGame && lanConfig_cursor >= 2)
+			lanConfig_cursor = 0;
 		break;
 
 	case K_ENTER:
@@ -3707,6 +3710,35 @@
 // Map list for Transfusion
 static level_t		transfusionlevels[] =
 {
+	{"bb1",			"The Stronghold"},
+	{"bb2",			"Winter Wonderland"},
+	{"bb3",			"Bodies"},
+	{"bb4",			"The Tower"},
+	{"bb5",			"Click!"},
+	{"bb7",			"Midgard"},
+	{"bb8",			"Fun With Heads"},
+	{"bodiesctf",	"Bodies CTF"},
+
+	{"e1m7",		"Altar of Stone"},
+	{"e3m7",		"The Pit of Cerberus"},
+	{"e4m8",		"The Hall of the Epiphany"},
+
+	{"cpbb03",		"Unholy Cathedral"},
+
+	{"b2a15",		"B2 Area 15"},
+	{"b2bodies",	"B2 Bodies"},
+	{"b2cabana",	"B2 Cabana"},
+	{"b2crypt",		"B2 Crypt"},
+	{"b2power",		"B2 Power"},
+
+	{"cabalarena",	"Cabal Arena"},
+	{"fragenstein",	"Fragenstein"},
+	{"fragm",		"Frag'm"},
+	{"qmorbias",	"Qmorbias"},
+	{"qe1m7",		"Quake 1 e1m7"},
+	{"highnoon",	"High Noon"}
+
+	/*
 	{"e1m1",		"Cradle to Grave"},
 	{"e1m2",		"Wrong Side of the Tracks"},
 	{"e1m3",		"Phantom Express"},
@@ -3811,10 +3843,18 @@
 	{"qdm5",		"The Cistern"},
 	{"qmorbias",	"DM-Morbias"},
 	{"simple",		"Dead Simple"}
+	*/
 };
 
 static episode_t	transfusionepisodes[] =
 {
+	{"BloodBath", 0, 8},
+	{"Blood 1", 8, 3},
+	{"Cryptic Passage", 11, 1},
+	{"Blood 2", 12, 5},
+	{"Custom", 17, 6}
+	
+	/*
 	{"The Way of All Flesh", 0, 8},
 	{"Even Death May Die", 8, 9},
 	{"Farewell to Arms", 17, 8},
@@ -3826,6 +3866,7 @@
 	{"Blood 2", 68, 8},
 	{"Transfusion", 76, 9},
 	{"Conversions", 85, 9}
+	*/
 };
 
 static level_t goodvsbad2levels[] =
@@ -3918,7 +3959,7 @@
 static gamelevels_t hipnoticgame = {"Scourge of Armagon", hipnoticlevels, hipnoticepisodes, 6};
 static gamelevels_t roguegame = {"Dissolution of Eternity", roguelevels, rogueepisodes, 4};
 static gamelevels_t nehahragame = {"Nehahra", nehahralevels, nehahraepisodes, 4};
-static gamelevels_t transfusiongame = {"Transfusion", transfusionlevels, transfusionepisodes, 11};
+static gamelevels_t transfusiongame = {"Transfusion", transfusionlevels, transfusionepisodes, 5};
 static gamelevels_t goodvsbad2game = {"Good Vs. Bad 2", goodvsbad2levels, goodvsbad2episodes, 1};
 static gamelevels_t battlemechgame = {"Battlemech", battlemechlevels, battlemechepisodes, 1};
 static gamelevels_t openquartzgame = {"OpenQuartz", openquartzlevels, openquartzepisodes, 3};
Index: progsvm.h
===================================================================
--- progsvm.h	(revision 11991)
+++ progsvm.h	(working copy)
@@ -351,6 +351,22 @@
 #undef PRVM_DECLARE_field
 #undef PRVM_DECLARE_global
 #undef PRVM_DECLARE_function
+	int ammo_flare; // Transfusion flare ammo
+	int ammo_tnt_bundle; // Transfusion TNT Bundle
+	int ammo_tnt_remote; // Transfusion Remote Det TNT
+	int ammo_tnt_proxy; // Transfusion Proximity Det TNT
+	int ammo_spray; // Transfusion Hairspray Can
+	int ammo_leech; // Transfusion Life Leech ammo
+	int ammo_voodoo; // Transfusion VooDoo Doll ammo
+	int armor_fire; // Transfusion Fire Armor
+	int armor_body; // Transfusion Body Armor
+	int armor_spirit; // Transfusion Spirit Armor
+	int item_boots; // Transfusion Jump Boots
+	int item_medkit; // Transfusion Medkit
+	int item_beastvision; // Transfusion Beastvision
+	int item_crystalball; // Transfusion Crystal Ball
+	int item_divingsuit; // Transfusion Diving Suit
+	int active_inventory; // Transfusion Active Inventory Item
 }
 prvm_prog_fieldoffsets_t;
 
Index: quakedef.h
===================================================================
--- quakedef.h	(revision 11991)
+++ quakedef.h	(working copy)
@@ -365,7 +365,52 @@
 #define HIT_EMPATHY_SHIELDS (1<<(23+3))
 
 //===========================================
+//Transfusion added defines
+//stats - items requring a full int value
+//the HUD can show almost all values at once, requiring more stats than just y/n items
+#define	TFN_AMMO_FLARE			30
+#define	TFN_AMMO_SHELLS			6
+#define	TFN_AMMO_BULLETS		7
+#define	TFN_AMMO_NAPALM			8
+#define	TFN_AMMO_TNT_BUNDLE		31
+#define	TFN_AMMO_TNT_REMOTE		32
+#define	TFN_AMMO_TNT_PROXY		33
+#define	TFN_AMMO_SPRAY			34
+#define	TFN_AMMO_TESLA			9
+#define	TFN_AMMO_LEECH			35
+#define	TFN_AMMO_VOODOO			36
+#define TFN_ITEM_MEDKIT			37
+#define TFN_ITEM_DIVINGSUIT		38
+#define TFN_ITEM_CRYSTALBALL	39
+#define TFN_ITEM_BEASTVISION	40
+#define TFN_ITEM_BOOTS			41
+#define	TFN_ARMOR_FIRE			42
+#define	TFN_ARMOR_BODY			43
+#define TFN_ARMOR_SPIRIT		44
+#define TFN_ACTIVE_INVENTORY	45
 
+//items - yes/no items
+#define TFN_WEAPON_PITCHFORK	1
+#define TFN_WEAPON_FLARE		2
+#define TFN_WEAPON_SHOTGUN		4
+#define TFN_WEAPON_TOMMYGUN		8
+#define TFN_WEAPON_NAPALM		16
+#define TFN_WEAPON_TNT_BUNDLE	32
+#define TFN_WEAPON_TNT_PROXY	64
+#define TFN_WEAPON_TNT_REMOTE	128
+#define TFN_WEAPON_HAIRSPRAY	256
+#define TFN_WEAPON_TESLA		512
+#define TFN_WEAPON_LIFELEECH	1024
+#define TFN_WEAPON_VOODOO		2048
+#define TFN_KEY_SKULL			(1<<23)
+#define TFN_KEY_EYE				(1<<24)
+#define TFN_KEY_FIRE			(1<<25)
+#define TFN_KEY_DAGGER			(1<<26)
+#define TFN_KEY_SPIDER			(1<<27)
+#define TFN_KEY_MOON			(1<<28)
+#define TFN_DEATHMASK			262144
+//===========================================
+
 #include "zone.h"
 #include "fs.h"
 #include "common.h"
Index: sbar.c
===================================================================
--- sbar.c	(revision 11991)
+++ sbar.c	(working copy)
@@ -36,6 +36,14 @@
 cachepic_t *sb_sbar_minimal;
 cachepic_t *sb_sbar_overlay;
 
+// only used by TFn
+cachepic_t *sb_sbar_min_left;
+cachepic_t *sb_sbar_min_right;
+cachepic_t *sb_scoreboard;
+cachepic_t *sb_tfhudnums[6][11];
+cachepic_t *sb_keys[2][6];
+cachepic_t *sb_inventory[5];
+
 // AK changed the bound to 9
 cachepic_t *sb_weapons[7][9]; // 0 is active, 1 is owned, 2-5 are flashes
 cachepic_t *sb_ammo[4];
@@ -206,6 +214,42 @@
 		zymsb_crosshair_left2 = Draw_CachePic_Flags ("gfx/hud/crosshair_left2", CACHEPICFLAG_QUIET);
 		zymsb_crosshair_right = Draw_CachePic_Flags ("gfx/hud/crosshair_right", CACHEPICFLAG_QUIET);
 	}
+	else if (gamemode == GAME_TRANSFUSION)
+	{
+		for (i = 0;i < 10;i++)
+		{
+			sb_tfhudnums[0][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_sm_dblue/hn_b2-%i",i), CACHEPICFLAG_QUIET); //small dark blue
+			sb_tfhudnums[1][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_sm_lblue/hn_b1-%i",i), CACHEPICFLAG_QUIET); //small light blue
+			sb_tfhudnums[2][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_sm_gray/hn_a-%i",i), CACHEPICFLAG_QUIET); //small white/gray
+			sb_tfhudnums[3][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_med_red/tile225%i",i), CACHEPICFLAG_QUIET); //medium red
+			sb_tfhudnums[4][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_lg_blue/tile224%i",i), CACHEPICFLAG_QUIET); //large blue
+			sb_tfhudnums[5][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/hud/num_lg_red/tile219%i",i), CACHEPICFLAG_QUIET); //large red
+		}
+		sb_sbar = Draw_CachePic_Flags("gfx/hud/tile2200", CACHEPICFLAG_QUIET);
+		sb_sbar_min_left = Draw_CachePic_Flags("gfx/hud/tile2201", CACHEPICFLAG_QUIET);
+		sb_sbar_min_right = Draw_CachePic_Flags("gfx/hud/tile2173", CACHEPICFLAG_QUIET);
+		sb_scoreboard = Draw_CachePic_Flags("gfx/hud/scoreboard", CACHEPICFLAG_QUIET);
+		sb_keys[0][0] = Draw_CachePic_Flags("gfx/hud/keys/tile2220-g", CACHEPICFLAG_QUIET); //skull
+		sb_keys[0][1] = Draw_CachePic_Flags("gfx/hud/keys/tile2221-g", CACHEPICFLAG_QUIET); //eye
+		sb_keys[0][2] = Draw_CachePic_Flags("gfx/hud/keys/tile2222-g", CACHEPICFLAG_QUIET); //fire
+		sb_keys[0][3] = Draw_CachePic_Flags("gfx/hud/keys/tile2223-g", CACHEPICFLAG_QUIET); //dagger
+		sb_keys[0][4] = Draw_CachePic_Flags("gfx/hud/keys/tile2224-g", CACHEPICFLAG_QUIET); //spider
+		sb_keys[0][5] = Draw_CachePic_Flags("gfx/hud/keys/tile2225-g", CACHEPICFLAG_QUIET); //moon
+		sb_keys[1][0] = Draw_CachePic_Flags("gfx/hud/keys/tile2220", CACHEPICFLAG_QUIET);
+		sb_keys[1][1] = Draw_CachePic_Flags("gfx/hud/keys/tile2221", CACHEPICFLAG_QUIET);
+		sb_keys[1][2] = Draw_CachePic_Flags("gfx/hud/keys/tile2222", CACHEPICFLAG_QUIET);
+		sb_keys[1][3] = Draw_CachePic_Flags("gfx/hud/keys/tile2223", CACHEPICFLAG_QUIET);
+		sb_keys[1][4] = Draw_CachePic_Flags("gfx/hud/keys/tile2224", CACHEPICFLAG_QUIET);
+		sb_keys[1][5] = Draw_CachePic_Flags("gfx/hud/keys/tile2225", CACHEPICFLAG_QUIET);
+		sb_armor[0] = Draw_CachePic_Flags("gfx/hud/armorbars/tile2207", CACHEPICFLAG_QUIET);
+		sb_armor[1] = Draw_CachePic_Flags("gfx/hud/armorbars/tile2208", CACHEPICFLAG_QUIET);
+		sb_armor[2] = Draw_CachePic_Flags("gfx/hud/armorbars/tile2209", CACHEPICFLAG_QUIET);
+		sb_inventory[0] = Draw_CachePic_Flags("gfx/hud/inventory/tile2569", CACHEPICFLAG_QUIET); //medkit
+		sb_inventory[1] = Draw_CachePic_Flags("gfx/hud/inventory/tile2564", CACHEPICFLAG_QUIET); //diving suit
+		sb_inventory[2] = Draw_CachePic_Flags("gfx/hud/inventory/tile2566", CACHEPICFLAG_QUIET); //crystal ball
+		sb_inventory[3] = Draw_CachePic_Flags("gfx/hud/inventory/tile2568", CACHEPICFLAG_QUIET); //beast vision
+		sb_inventory[4] = Draw_CachePic_Flags("gfx/hud/inventory/tile2560", CACHEPICFLAG_QUIET); //jump boots
+	}
 	else
 	{
 		sb_disc = Draw_CachePic_Flags ("gfx/disc", CACHEPICFLAG_QUIET);
@@ -448,14 +492,27 @@
 static void Sbar_DrawNum (int x, int y, int num, int digits, int color)
 {
 	char str[32], *ptr;
-	int l, frame;
+	int l, frame, x_length;
 
+	if (gamemode == GAME_TRANSFUSION)
+	{
+		if (num == 0 && color == 2 )
+			return;
+		if (color > 3) //health and large ammo
+			x_length = 18;
+		else if (color > 2) //smaller red is a medium font
+			x_length = 10;
+		else //small fonts, small ammo, armor
+			x_length = 8;
+	}
+	else
+		x_length = 24;
 	l = dpsnprintf(str, sizeof(str), "%i", num);
 	ptr = str;
 	if (l > digits)
 		ptr += (l-digits);
 	if (l < digits)
-		x += (digits-l)*24;
+		x += (digits-l)*x_length;
 
 	while (*ptr)
 	{
@@ -464,9 +521,15 @@
 		else
 			frame = *ptr -'0';
 
-		Sbar_DrawPic (x, y, sb_nums[color][frame]);
-		x += 24;
-
+		if (gamemode == GAME_TRANSFUSION)
+		{
+			if (!(color == 4 && !num))
+				Sbar_DrawPic (x, y, sb_tfhudnums[color][frame]);
+		}
+		else
+			Sbar_DrawPic (x, y, sb_nums[color][frame]);
+		x += x_length;
+		
 		ptr++;
 	}
 }
@@ -1214,7 +1277,11 @@
 		fps_scaley = 12;
 		//fps_y = vid_conheight.integer - sb_lines; // yes this may draw over the sbar
 		//fps_y = bound(0, fps_y, vid_conheight.integer - fps_strings*fps_scaley);
-		fps_y = vid_conheight.integer - sbar_info_pos.integer - fps_strings*fps_scaley;
+		if (gamemode == GAME_TRANSFUSION)
+			fps_y = 0;
+		else
+			fps_y = vid_conheight.integer - sbar_info_pos.integer - fps_strings*fps_scaley;
+
 		if (soundstring[0])
 		{
 			fps_x = vid_conwidth.integer - DrawQ_TextWidth(soundstring, 0, fps_scalex, fps_scaley, true, FONT_INFOBAR);
@@ -1609,6 +1676,92 @@
 			DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
 #endif
 		}
+		else if (gamemode == GAME_TRANSFUSION)
+		{
+			if (sb_showscores || (cl.stats[STAT_HEALTH] <= 0 && cl_deathscoreboard.integer))
+				Sbar_DrawScoreboard ();
+
+			//if deathmatch, draw scoreboard
+			if (cl.gametype == GAME_DEATHMATCH)
+			{
+				Sbar_DrawAlphaPic(0,0,sb_scoreboard, sbar_alpha_bg.value);
+				if (scoreboardlines > 4)
+					Sbar_DrawAlphaPic(0,22,sb_scoreboard, sbar_alpha_bg.value);
+				Sbar_MiniDeathmatchOverlay (8, 6);
+			}
+
+			if (sb_lines > 24) //Large HUD
+			{
+				// sbar
+				Sbar_DrawAlphaPic ((vid_conwidth.integer/2 - 320), (vid_conheight.integer - 113), sb_sbar, sbar_alpha_bg.value);
+				// keys
+				Sbar_DrawPic ((vid_conwidth.integer/2 - 183), (vid_conheight.integer - 67), cl.stats[STAT_ITEMS] & TFN_KEY_SKULL ? sb_keys[1][0] : sb_keys[0][0]);
+				Sbar_DrawPic ((vid_conwidth.integer/2 + 163), (vid_conheight.integer - 67), cl.stats[STAT_ITEMS] & TFN_KEY_EYE ? sb_keys[1][1] : sb_keys[0][1]);
+				Sbar_DrawPic ((vid_conwidth.integer/2 - 183), (vid_conheight.integer - 45), cl.stats[STAT_ITEMS] & TFN_KEY_FIRE ? sb_keys[1][2] : sb_keys[0][2]);
+				Sbar_DrawPic ((vid_conwidth.integer/2 + 163), (vid_conheight.integer - 45), cl.stats[STAT_ITEMS] & TFN_KEY_DAGGER ? sb_keys[1][3] : sb_keys[0][3]);
+				Sbar_DrawPic ((vid_conwidth.integer/2 - 183), (vid_conheight.integer - 23), cl.stats[STAT_ITEMS] & TFN_KEY_SPIDER ? sb_keys[1][4] : sb_keys[0][4]);
+				Sbar_DrawPic ((vid_conwidth.integer/2 + 163), (vid_conheight.integer - 23), cl.stats[STAT_ITEMS] & TFN_KEY_MOON ? sb_keys[1][5] : sb_keys[0][5]);
+				// health
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 157), (vid_conheight.integer - 45), cl.stats[STAT_HEALTH], 3, 5);
+				// armor
+				if (cl.stats[TFN_ARMOR_FIRE] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 - 233), (vid_conheight.integer - 51), sb_armor[0] , (cl.stats[TFN_ARMOR_FIRE] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				if (cl.stats[TFN_ARMOR_BODY] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 - 233), (vid_conheight.integer - 35), sb_armor[1], (cl.stats[TFN_ARMOR_BODY] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				if (cl.stats[TFN_ARMOR_SPIRIT] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 - 233), (vid_conheight.integer - 19), sb_armor[2], (cl.stats[TFN_ARMOR_SPIRIT] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 225), (vid_conheight.integer - 51), cl.stats[TFN_ARMOR_FIRE], 3, 2);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 225), (vid_conheight.integer - 35), cl.stats[TFN_ARMOR_BODY], 3, 2);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 225), (vid_conheight.integer - 19), cl.stats[TFN_ARMOR_SPIRIT], 3, 2);
+				// ammo_big - only thing thats hidden when you're dead
+				if (cl.stats[STAT_HEALTH])
+					Sbar_DrawNum ((vid_conwidth.integer/2 + 103), (vid_conheight.integer - 45), cl.stats[STAT_AMMO], 3, 4);
+				// inventory
+				if (!(cl.stats[TFN_ACTIVE_INVENTORY] == 0 && cl.stats[TFN_ITEM_MEDKIT] == 0))
+				{
+					Sbar_DrawNum ((vid_conwidth.integer - 125), (vid_conheight.integer - 62), cl.stats[TFN_ITEM_MEDKIT + cl.stats[TFN_ACTIVE_INVENTORY]], 3, 3);
+					Sbar_DrawPic ((vid_conwidth.integer - 129), (vid_conheight.integer - 47), sb_inventory[cl.stats[TFN_ACTIVE_INVENTORY]]);
+				}
+
+				// ammo counts
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 55), (vid_conheight.integer - 41), cl.stats[TFN_AMMO_FLARE], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_FLARE ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 55), (vid_conheight.integer - 29), cl.stats[TFN_AMMO_SHELLS], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_SHOTGUN ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 55), (vid_conheight.integer - 17), cl.stats[TFN_AMMO_BULLETS], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_TOMMYGUN ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 9), (vid_conheight.integer - 41), cl.stats[TFN_AMMO_NAPALM], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_NAPALM ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 9), (vid_conheight.integer - 29), cl.stats[TFN_AMMO_TNT_BUNDLE], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_TNT_BUNDLE ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 250), (vid_conheight.integer - 17), cl.stats[TFN_AMMO_TNT_PROXY], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_TNT_PROXY ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 285), (vid_conheight.integer - 17), cl.stats[TFN_AMMO_TNT_REMOTE], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_TNT_REMOTE ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 - 9), (vid_conheight.integer - 17), cl.stats[TFN_AMMO_SPRAY], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_HAIRSPRAY ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 37), (vid_conheight.integer - 41), cl.stats[TFN_AMMO_TESLA], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_TESLA ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 37), (vid_conheight.integer - 29), cl.stats[TFN_AMMO_LEECH], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_LIFELEECH ? 1:0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 37), (vid_conheight.integer - 17), cl.stats[TFN_AMMO_VOODOO], 3, cl.stats[STAT_ACTIVEWEAPON] == TFN_WEAPON_VOODOO ? 1:0);
+			}
+			else if (sb_lines <= 24 && sb_lines) //Minimized HUD, !sb_lines = completely blank, no HUD
+			{
+				Sbar_DrawAlphaPic (0, (vid_conheight.integer - 52), sb_sbar_min_left, sbar_alpha_bg.value);
+				Sbar_DrawAlphaPic ((vid_conwidth.integer - 145), (vid_conheight.integer - 51), sb_sbar_min_right,sbar_alpha_bg.value);
+				// health
+				Sbar_DrawNum (7, (vid_conheight.integer - 45), cl.stats[STAT_HEALTH], 3, 5);
+				// ammo_big
+				Sbar_DrawNum (75, (vid_conheight.integer - 45), cl.stats[STAT_AMMO], 3, 4);
+				//armor
+				if (cl.stats[TFN_ARMOR_FIRE] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 + 178), (vid_conheight.integer - 48), sb_armor[0], (cl.stats[TFN_ARMOR_FIRE] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				if (cl.stats[TFN_ARMOR_BODY] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 + 178), (vid_conheight.integer - 32), sb_armor[1], (cl.stats[TFN_ARMOR_BODY] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				if (cl.stats[TFN_ARMOR_SPIRIT] >= 5)
+					DrawQ_Pic((vid_conwidth.integer/2 + 178), (vid_conheight.integer - 16), sb_armor[2], (cl.stats[TFN_ARMOR_SPIRIT] / 5 + 2), 14, 1, 1, 1, sbar_alpha_fg.value, 0);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 186), (vid_conheight.integer - 48), cl.stats[TFN_ARMOR_FIRE], 3, 2);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 186), (vid_conheight.integer - 32), cl.stats[TFN_ARMOR_BODY], 3, 2);
+				Sbar_DrawNum ((vid_conwidth.integer/2 + 186), (vid_conheight.integer - 16), cl.stats[TFN_ARMOR_SPIRIT], 3, 2);
+				// inventory
+				if (!(cl.stats[TFN_ACTIVE_INVENTORY] == 0 && cl.stats[TFN_ITEM_MEDKIT] == 0))
+				{
+					Sbar_DrawNum ((vid_conwidth.integer - 40), (vid_conheight.integer - 40), cl.stats[TFN_ITEM_MEDKIT + cl.stats[TFN_ACTIVE_INVENTORY]], 3, 3);
+					Sbar_DrawPic ((vid_conwidth.integer - 88), (vid_conheight.integer - 45), sb_inventory[cl.stats[TFN_ACTIVE_INVENTORY]]);
+				}
+			}
+		}
 		else // Quake and others
 		{
 			sbar_x = (vid_conwidth.integer - 320)/2;
@@ -1797,6 +1950,17 @@
 			else
 				DrawQ_String(x, y, va(vabuf, sizeof(vabuf), "         spect %c%s", myself ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false, FONT_SBAR );
 		}
+		else if (gamemode == GAME_TRANSFUSION)
+		{
+			// draw colors behind score
+			c = palette_rgb_pantsscoreboard[(s->colors & 0xf0) >> 4];
+			DrawQ_Fill(x, y+1, 40*FONT_SBAR->width_of[0], 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), sbar_alpha_fg.value, 0);
+			c = palette_rgb_shirtscoreboard[s->colors & 0xf];
+			DrawQ_Fill(x, y+4, 40*FONT_SBAR->width_of[0], 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), sbar_alpha_fg.value, 0);
+			// print the text
+			//DrawQ_String(x, y, va("%c%4i %s", myself ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, true);
+			DrawQ_String(x, y, va(vabuf, sizeof(vabuf), "%5i %c%s", (int) s->frags, myself ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false, FONT_SBAR );
+		}
 		else
 		{
 			// draw colors behind score
@@ -1873,15 +2037,20 @@
 	DrawQ_Pic ((vid_conwidth.integer - sb_ranking->width)/2, 8, sb_ranking, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
 
 	// draw the text
-	y = 40;
+
+	if (gamemode == GAME_TRANSFUSION)
+		y = 82;
+	else
+		y = 40;
 	if (cls.protocol == PROTOCOL_QUAKEWORLD)
 	{
 		DrawQ_String(xmin, y, va(vabuf, sizeof(vabuf), "ping pl%% time frags team  name"), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false, FONT_SBAR );
 	}
+	else if (gamemode == GAME_TRANSFUSION)
+		DrawQ_String(xmin, y, va(vabuf, sizeof(vabuf), "frags  name"), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false, FONT_SBAR );
 	else
-	{
 		DrawQ_String(xmin, y, va(vabuf, sizeof(vabuf), "ping pl%% frags  name"), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false, FONT_SBAR );
-	}
+
 	y += 8;
 
 	if (Sbar_IsTeammatch ())
@@ -1964,6 +2133,37 @@
 
 	if (gamemode == GAME_TRANSFUSION)
 	{
+		// decide where to print
+		numlines = 8;
+		
+		// give up if there isn't room
+		if (numlines < 1)
+			return;
+		
+		// scores
+		Sbar_SortFrags ();
+		
+		//find us
+		for (i = 0; i < scoreboardlines; i++)
+			if (fragsort[i] == cl.playerentity - 1)
+				break;
+			
+		// figure out start
+		i -= numlines/2;
+		i = min(i, scoreboardlines - numlines);
+		i = max(i, 0);
+		
+		for (;i < scoreboardlines ;i++)
+		{
+			if (x >= 600)
+			{
+				x = 8;
+				y += 22;
+				if (y > 40)
+					return;
+			}
+			x += 152 + Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y);
+		}
 		for (;i < range_end && x < vid_conwidth.integer;i++)
 			x += 128 + (int)Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y);
 	}
Index: sv_main.c
===================================================================
--- sv_main.c	(revision 11991)
+++ sv_main.c	(working copy)
@@ -2055,13 +2055,31 @@
 	stats[STAT_WEAPONFRAME] = (int)PRVM_serveredictfloat(ent, weaponframe);
 	stats[STAT_ARMOR] = (int)PRVM_serveredictfloat(ent, armorvalue);
 	stats[STAT_WEAPON] = client->weaponmodelindex;
-	stats[STAT_HEALTH] = (int)PRVM_serveredictfloat(ent, health);
-	stats[STAT_AMMO] = (int)PRVM_serveredictfloat(ent, currentammo);
-	stats[STAT_SHELLS] = (int)PRVM_serveredictfloat(ent, ammo_shells);
-	stats[STAT_NAILS] = (int)PRVM_serveredictfloat(ent, ammo_nails);
-	stats[STAT_ROCKETS] = (int)PRVM_serveredictfloat(ent, ammo_rockets);
-	stats[STAT_CELLS] = (int)PRVM_serveredictfloat(ent, ammo_cells);
-	stats[STAT_ACTIVEWEAPON] = (int)PRVM_serveredictfloat(ent, weapon);
+
+	if (gamemode == GAME_TRANSFUSION)
+	{
+		stats[TFN_AMMO_FLARE] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_flare);
+		//stats[TFN_AMMO_SHELLS] =  // Done by Quake already
+		//stats[TFN_AMMO_BULLETS] = // Done by Quake already
+		//stats[TFN_AMMO_NAPALM] =  // Done by Quake already
+		stats[TFN_AMMO_TNT_BUNDLE] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_tnt_bundle);
+		stats[TFN_AMMO_TNT_REMOTE] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_tnt_remote);
+		stats[TFN_AMMO_TNT_PROXY] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_tnt_proxy);
+		stats[TFN_AMMO_SPRAY] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_spray);
+		//stats[TFN_AMMO_TESLA] =  // Done by Quake already
+		stats[TFN_AMMO_LEECH] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_leech);
+		stats[TFN_AMMO_VOODOO] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.ammo_voodoo);
+		stats[TFN_ARMOR_FIRE] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.armor_fire);
+		stats[TFN_ARMOR_BODY] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.armor_body);
+		stats[TFN_ARMOR_SPIRIT] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.armor_spirit);
+		stats[TFN_ITEM_BOOTS] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.item_boots);
+		stats[TFN_ITEM_MEDKIT] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.item_medkit);
+		stats[TFN_ITEM_BEASTVISION] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.item_beastvision);
+		stats[TFN_ITEM_CRYSTALBALL] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.item_crystalball);
+		stats[TFN_ITEM_DIVINGSUIT] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.item_divingsuit);
+		stats[TFN_ACTIVE_INVENTORY] = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.active_inventory);
+	}
+
 	stats[STAT_VIEWZOOM] = viewzoom;
 	stats[STAT_TOTALSECRETS] = (int)PRVM_serverglobalfloat(total_secrets);
 	stats[STAT_TOTALMONSTERS] = (int)PRVM_serverglobalfloat(total_monsters);
