r4120 - in branches/nexuiz-2.0: . data data/gfx data/gfx/menu/default data/gfx/menu/silver data/gfx/menu/simplygray data/gfx/menu/wickedblack data/gfx/menu/wickedblue data/gfx/menu/wickedgreen data/gfx/menu/wickedred data/gfx/menu/wickedwhite data/gfx/menu/wickedyellow data/gfx/menu/xaw data/maps data/models/sprites data/qcsrc/client data/qcsrc/common data/qcsrc/menu data/qcsrc/menu/item data/qcsrc/menu/nexuiz data/qcsrc/server data/scripts

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Aug 12 08:20:45 EDT 2008


Author: div0
Date: 2008-08-12 08:20:43 -0400 (Tue, 12 Aug 2008)
New Revision: 4120

Added:
   branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_d.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_d.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_n.tga
   branches/nexuiz-2.0/data/models/sprites/race-checkpoint.sp2
   branches/nexuiz-2.0/data/models/sprites/race-finish.sp2
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigbutton.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigcommandbutton.c
   branches/nexuiz-2.0/data/qcsrc/server/race.qc
   branches/nexuiz-2.0/data/qcsrc/server/race.qh
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/data/defaultNexuiz.cfg
   branches/nexuiz-2.0/data/gfx/colormap_palette.lmp
   branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/background_ingame.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/background_ingame.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/background.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/background_ingame.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/border.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/charmapbutton.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkmark.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/colorbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/colorbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/cursor.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/inputbox_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/inputbox_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_c0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_c1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_d0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_d1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_f0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_f1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_n0.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_n1.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_s.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_c.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_d.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_f.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_n.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_s.tga
   branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt
   branches/nexuiz-2.0/data/maps/reslimed.ent
   branches/nexuiz-2.0/data/models/sprites/danger.sp2
   branches/nexuiz-2.0/data/models/sprites/helpme.sp2
   branches/nexuiz-2.0/data/models/sprites/here.sp2
   branches/nexuiz-2.0/data/models/sprites/keycarrier-finish.sp2
   branches/nexuiz-2.0/data/models/sprites/make-sprites.sh
   branches/nexuiz-2.0/data/models/sprites/redbase.sp2
   branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
   branches/nexuiz-2.0/data/qcsrc/client/Main.qc
   branches/nexuiz-2.0/data/qcsrc/client/mapvoting.qc
   branches/nexuiz-2.0/data/qcsrc/client/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
   branches/nexuiz-2.0/data/qcsrc/client/sortlist.qc
   branches/nexuiz-2.0/data/qcsrc/common/constants.qh
   branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc
   branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qh
   branches/nexuiz-2.0/data/qcsrc/common/util.qc
   branches/nexuiz-2.0/data/qcsrc/common/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/classes.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/borderimage.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
   branches/nexuiz-2.0/data/qcsrc/menu/msys.qh
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/gametypebutton.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/inputbox.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc
   branches/nexuiz-2.0/data/qcsrc/server/arena.qc
   branches/nexuiz-2.0/data/qcsrc/server/bots.qc
   branches/nexuiz-2.0/data/qcsrc/server/campaign.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
   branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
   branches/nexuiz-2.0/data/qcsrc/server/constants.qh
   branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/domination.qc
   branches/nexuiz-2.0/data/qcsrc/server/extensions.qh
   branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
   branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
   branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/scores.qc
   branches/nexuiz-2.0/data/qcsrc/server/scores.qh
   branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc
   branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
   branches/nexuiz-2.0/data/scripts/entities.def
Log:
- New sounds
- CSQC scoreboard improvements
- Reworked landing sound conditions
- Less distracting fog at close range in reslimed
- New sound channel assignment; channel mixer in menu
- changed margin spec of input boxes to use chars, not relative size (fixed weird short inputboxes)
- add extra types for big buttons, fitting skin changes
- use DP_SV_QCSTATUS to show frags to qstat again; make menu aware of player lists (currently they are not shown, but they can be searched); add a game type column
- g_spawnpoints_auto_move_out_of_solid cvar
- "race" game mode 
- HEIGHT_DIALOGBORDER
- trigger_teleport: setmodel only if it is not "". Then a teleporter can be manually added to an .ent by setting mins and maxs.
- make mins/maxs only triggers work
- wicked menuskins 2.0 plus bigbuttons (copyd from normal buttons). I still call them wicked instead of wicked2, I don't know if that's good or bad.
- new command "allready" (for vcall/vdo); fix shootable buttons in independent players mode
- make ENTER also save the cvar of the current input box


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/.patchsets	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-4023
+revisions_applied = 1-4119

Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2008-08-12 12:20:43 UTC (rev 4120)
@@ -286,6 +286,7 @@
 set g_spawnshieldtime 0
 set g_spawnsound 1
 set g_spawnpoints_autodrop 0
+set g_spawnpoints_auto_move_out_of_solid 0
 set g_forced_respawn 0
 set g_fullbrightplayers 0
 set g_fullbrightitems 0
@@ -324,6 +325,7 @@
 seta g_domination_point_limit -1
 seta g_runematch_point_limit -1
 seta g_keyhunt_point_limit -1
+seta g_race_laps_limit -1
 
 seta g_ctf_win_mode 2 // 0: captures only, 1: captures, then points, 2: points only
 
@@ -482,6 +484,15 @@
 // assault
 set g_assault 0
 
+// race
+set g_race 0
+set g_race_qualifying 1
+// Qualifying uses timelimit, and the one with the best time wins. Fraglimit is nonfunctional then.
+// Normal race uses fraglimit as a limit for the laps.
+// Special mode: g_race_qualifying 2. First runs a qualifying, after
+// ready-restart it turns into a race. TODO not done yet (e.g. timing display)
+set g_race_teams 0 // when 2, 3, or 4, the race is played as a team game (the team members can add up their laps)
+
 // server game balance settings
 set g_balance_armor_regen 0
 set g_balance_armor_rot 0.1
@@ -677,7 +688,7 @@
 bind kp_minus "+userbind 15"
 
 // these commands can be voted
-set sv_vote_commands "restart timelimit fraglimit chmap gotomap g_grappling_hook sv_defaultplayer_fbskin_green sv_defaultplayer_fbskin_red sv_defaultplayer_fbskin_orange sv_defaultplayer_fbskin_off endmatch reducematchtime extendmatchtime"
+set sv_vote_commands "restart timelimit fraglimit chmap gotomap g_grappling_hook sv_defaultplayer_fbskin_green sv_defaultplayer_fbskin_red sv_defaultplayer_fbskin_orange sv_defaultplayer_fbskin_off endmatch reducematchtime extendmatchtime allready"
 // users can call a vote for the above commands
 set sv_vote_call 1
 // users can call a vote to become master
@@ -1065,3 +1076,5 @@
 sv_allowdownloads_inarchive 1 // for csprogs.dat
 
 set g_jump_grunt 0 // Do you make a grunting noise every time you jump? Is it the same grunting noise every time?
+
+alias allready "sv_cmd allready"

Modified: branches/nexuiz-2.0/data/gfx/colormap_palette.lmp
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/default/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/default/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/default/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/default/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/default/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/default/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/default/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/default/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/default/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -41,6 +41,8 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
+//   uses "bigbutton" images
+//   uses "bigbuttongray" images
 COLOR_BUTTON_N                  '1 1 1'
 COLOR_BUTTON_C                  '1 1 1'
 COLOR_BUTTON_F                  '1 1 1'
@@ -84,12 +86,13 @@
 MARGIN_RIGHT                    8
 MARGIN_COLUMNS                  4
 MARGIN_ROWS                     4
+HEIGHT_DIALOGBORDER             1
 
 // item: input box
 //   uses "inputbox" images
 COLOR_INPUTBOX_N                '1 1 1'
 COLOR_INPUTBOX_F                '1 1 1'
-MARGIN_INPUTBOX                 0.02
+MARGIN_INPUTBOX_CHARS           1
 
 // item: key grabber
 COLOR_KEYGRABBER_TITLES         '1 1 1'

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/silver/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/silver/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -41,6 +41,8 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
+//   uses "bigbutton" images
+//   uses "bigbuttongray" images
 COLOR_BUTTON_N                  '1 1 1'
 COLOR_BUTTON_C                  '1 1 1'
 COLOR_BUTTON_F                  '1 1 1'
@@ -89,7 +91,7 @@
 //   uses "inputbox" images
 COLOR_INPUTBOX_N                '1 1 1'
 COLOR_INPUTBOX_F                '1 1 1'
-MARGIN_INPUTBOX                 0.02
+MARGIN_INPUTBOX_CHARS           1
 
 // item: key grabber
 COLOR_KEYGRABBER_TITLES         '1 1 1'

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/simplygray/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/simplygray/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -41,6 +41,8 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
+//   uses "bigbutton" images
+//   uses "bigbuttongray" images
 COLOR_BUTTON_N                  '1 1 1'
 COLOR_BUTTON_C                  '1 1 1'
 COLOR_BUTTON_F                  '1 1 1'
@@ -89,7 +91,7 @@
 //   uses "inputbox" images
 COLOR_INPUTBOX_N                '1 1 1'
 COLOR_INPUTBOX_F                '1 1 1'
-MARGIN_INPUTBOX                 0.02
+MARGIN_INPUTBOX_CHARS           1
 
 // item: key grabber
 COLOR_KEYGRABBER_TITLES         '1 1 1'

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblack/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedblack/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked Black by sev
+// Values for Wicked 2 Black by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -50,18 +50,18 @@
 
 // item: campaign
 ALPHA_CAMPAIGN_SELECTABLE       0.8
-COLOR_CAMPAIGN_SELECTABLE       '1 1 1'
+COLOR_CAMPAIGN_SELECTABLE       '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_CURRENT          1
-COLOR_CAMPAIGN_CURRENT          '1 1 1'
+COLOR_CAMPAIGN_CURRENT          '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_FUTURE           0.2
-COLOR_CAMPAIGN_FUTURE           '1 1 1'
+COLOR_CAMPAIGN_FUTURE           '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_DESCRIPTION      0.7
 
 // item: checkbox
 //   uses "checkbox" images
 COLOR_CHECKBOX_N                '1 1 1'
 COLOR_CHECKBOX_C                '1 1 1'
-COLOR_CHECKBOX_F                '1 1 1'
+COLOR_CHECKBOX_F                '0.75 0.75 0.75'
 COLOR_CHECKBOX_D                '1 1 1'
 
 // item: credits list
@@ -100,15 +100,15 @@
 ALPHA_KEYGRABBER_KEYS           0.7
 
 // item: list box
-COLOR_LISTBOX_SELECTED          '1 1 1'
+COLOR_LISTBOX_SELECTED          '0.875 0.875 0.875'
 ALPHA_LISTBOX_SELECTED          1
-COLOR_LISTBOX_WAITING           '1 1 1'
+COLOR_LISTBOX_WAITING           '0.875 0.875 0.875'
 ALPHA_LISTBOX_WAITING           0.5
 
 // item: map list
 COLOR_MAPLIST_TITLE             '1 1 1'
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
-COLOR_MAPLIST_INCLUDEDBG        '1 1 1'
+COLOR_MAPLIST_INCLUDEDBG        '0.75 0.75 0.75'
 ALPHA_MAPLIST_INCLUDEDFG        1
 ALPHA_MAPLIST_INCLUDEDBG        0.25
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
@@ -132,14 +132,14 @@
 //   uses "radiobutton" images
 COLOR_RADIOBUTTON_N             '1 1 1'
 COLOR_RADIOBUTTON_C             '1 1 1'
-COLOR_RADIOBUTTON_F             '1 1 1'
+COLOR_RADIOBUTTON_F             '0.75 0.75 0.75'
 COLOR_RADIOBUTTON_D             '1 1 1'
 
 // item: scrollbar
 //   uses "scrollbar" images
 COLOR_SCROLLBAR_N               '1 1 1'
 COLOR_SCROLLBAR_C               '1 1 1'
-COLOR_SCROLLBAR_F               '1 1 1'
+COLOR_SCROLLBAR_F               '0.75 0.75 0.75'
 COLOR_SCROLLBAR_S               '1 1 1'
 WIDTH_SCROLLBAR                 16
 
@@ -155,7 +155,7 @@
 //   uses "slider" images
 COLOR_SLIDER_N                  '1 1 1'
 COLOR_SLIDER_C                  '1 1 1'
-COLOR_SLIDER_F                  '1 1 1'
+COLOR_SLIDER_F                  '0.75 0.75 0.75'
 COLOR_SLIDER_D                  '1 1 1'
 COLOR_SLIDER_S                  '1 1 1'
 WIDTH_SLIDERTEXT                0.333333333333

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/slider_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/background_ingame.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedblue/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedblue/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked Blue by sev
+// Values for Wicked 2 Blue by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -43,10 +43,10 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
-COLOR_BUTTON_N                  '0 0.375 0.75'
-COLOR_BUTTON_C                  '0 0.375 0.75'
-COLOR_BUTTON_F                  '0 0.375 0.75'
-COLOR_BUTTON_D                  '0 0.375 0.75'
+COLOR_BUTTON_N                  '0.5 0.75 1'
+COLOR_BUTTON_C                  '0.5 0.75 1'
+COLOR_BUTTON_F                  '0.5 0.75 1'
+COLOR_BUTTON_D                  '0.5 0.75 1'
 
 // item: campaign
 ALPHA_CAMPAIGN_SELECTABLE       0.8
@@ -59,17 +59,17 @@
 
 // item: checkbox
 //   uses "checkbox" images
-COLOR_CHECKBOX_N                '0 0.375 0.75'
-COLOR_CHECKBOX_C                '0 0.375 0.75'
-COLOR_CHECKBOX_F                '0 0.375 0.75'
-COLOR_CHECKBOX_D                '0 0.375 0.75'
+COLOR_CHECKBOX_N                '0.5 0.75 1'
+COLOR_CHECKBOX_C                '0.5 0.75 1'
+COLOR_CHECKBOX_F                '0.25 0.5 0.75'
+COLOR_CHECKBOX_D                '0.5 0.75 1'
 
 // item: credits list
 COLOR_CREDITS_TITLE             '1 1 1'
 ALPHA_CREDITS_TITLE             1
 COLOR_CREDITS_FUNCTION          '1 1 1'
 ALPHA_CREDITS_FUNCTION          0.7
-COLOR_CREDITS_PERSON            '0 0.375 0.75'
+COLOR_CREDITS_PERSON            '0.5 0.75 1'
 ALPHA_CREDITS_PERSON            1
 ROWS_CREDITS                    20
 WIDTH_CREDITS                   0.5
@@ -89,8 +89,8 @@
 
 // item: input box
 //   uses "inputbox" images
-COLOR_INPUTBOX_N                '0 0.375 0.75'
-COLOR_INPUTBOX_F                '0 0.375 0.75'
+COLOR_INPUTBOX_N                '0.5 0.75 1'
+COLOR_INPUTBOX_F                '0.5 0.75 1'
 MARGIN_INPUTBOX                 0.02
 
 // item: key grabber
@@ -100,15 +100,15 @@
 ALPHA_KEYGRABBER_KEYS           0.7
 
 // item: list box
-COLOR_LISTBOX_SELECTED          '0 0.375 0.75'
+COLOR_LISTBOX_SELECTED          '0.5 0.75 1'
 ALPHA_LISTBOX_SELECTED          1
-COLOR_LISTBOX_WAITING           '0 0.375 0.75'
+COLOR_LISTBOX_WAITING           '0.5 0.75 1'
 ALPHA_LISTBOX_WAITING           0.5
 
 // item: map list
 COLOR_MAPLIST_TITLE             '1 1 1'
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
-COLOR_MAPLIST_INCLUDEDBG        '0 0 0'
+COLOR_MAPLIST_INCLUDEDBG        '0.25 0.5 0.75'
 ALPHA_MAPLIST_INCLUDEDFG        1
 ALPHA_MAPLIST_INCLUDEDBG        0.375
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
@@ -130,17 +130,17 @@
 
 // item: radio button
 //   uses "radiobutton" images
-COLOR_RADIOBUTTON_N             '0 0.375 0.75'
-COLOR_RADIOBUTTON_C             '0 0.375 0.75'
-COLOR_RADIOBUTTON_F             '0 0.375 0.75'
-COLOR_RADIOBUTTON_D             '0 0.375 0.75'
+COLOR_RADIOBUTTON_N             '0.5 0.75 1'
+COLOR_RADIOBUTTON_C             '0.5 0.75 1'
+COLOR_RADIOBUTTON_F             '0.25 0.5 0.75'
+COLOR_RADIOBUTTON_D             '0.5 0.75 1'
 
 // item: scrollbar
 //   uses "scrollbar" images
-COLOR_SCROLLBAR_N               '0 0.375 0.75'
-COLOR_SCROLLBAR_C               '0 0.375 0.75'
-COLOR_SCROLLBAR_F               '0 0.375 0.75'
-COLOR_SCROLLBAR_S               '0 0.375 0.75'
+COLOR_SCROLLBAR_N               '0.5 0.75 1'
+COLOR_SCROLLBAR_C               '0.5 0.75 1'
+COLOR_SCROLLBAR_F               '0.25 0.5 0.75'
+COLOR_SCROLLBAR_S               '0.5 0.75 1'
 WIDTH_SCROLLBAR                 16
 
 // item: server list
@@ -153,10 +153,10 @@
 
 // item: slider
 //   uses "slider" images
-COLOR_SLIDER_N                  '0 0.375 0.75'
-COLOR_SLIDER_C                  '0 0.375 0.75'
-COLOR_SLIDER_F                  '0 0.375 0.75'
-COLOR_SLIDER_D                  '0 0.375 0.75'
-COLOR_SLIDER_S                  '0 0.375 0.75'
+COLOR_SLIDER_N                  '0.5 0.75 1'
+COLOR_SLIDER_C                  '0.5 0.75 1'
+COLOR_SLIDER_F                  '0.25 0.5 0.75'
+COLOR_SLIDER_D                  '0.5 0.75 1'
+COLOR_SLIDER_S                  '0.5 0.75 1'
 WIDTH_SLIDERTEXT                0.333333333333
 TOLERANCE_SLIDER                '0.2 2 0'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/slider_s.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedgreen/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked Green by sev
+// Values for Wicked 2 Green by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -8,15 +8,15 @@
 HEIGHT_ZOOMEDTITLE              -1
 
 // the individual dialog background colors
-COLOR_DIALOG_MULTIPLAYER        '0.75 1 0.5'
-COLOR_DIALOG_SETTINGS           '0.75 1 0.5'
-COLOR_DIALOG_TEAMSELECT         '0.75 1 0.5'
+COLOR_DIALOG_MULTIPLAYER        '0.5 1 0'
+COLOR_DIALOG_SETTINGS           '0.5 1 0'
+COLOR_DIALOG_TEAMSELECT         '0.5 1 0'
 COLOR_DIALOG_QUIT               '0.75 0 0'
-COLOR_DIALOG_MUTATORS           '0.75 1 0.5'
-COLOR_DIALOG_MAPINFO            '0.75 1 0.5'
-COLOR_DIALOG_USERBIND           '0.75 1 0.5'
-COLOR_DIALOG_SINGLEPLAYER       '0.75 1 0.5'
-COLOR_DIALOG_CREDITS            '0.75 1 0.5'
+COLOR_DIALOG_MUTATORS           '0.5 1 0'
+COLOR_DIALOG_MAPINFO            '0.5 1 0'
+COLOR_DIALOG_USERBIND           '0.5 1 0'
+COLOR_DIALOG_SINGLEPLAYER       '0.5 1 0'
+COLOR_DIALOG_CREDITS            '0.5 1 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -61,7 +61,7 @@
 //   uses "checkbox" images
 COLOR_CHECKBOX_N                '0.5 1 0'
 COLOR_CHECKBOX_C                '0.5 1 0'
-COLOR_CHECKBOX_F                '0.5 1 0'
+COLOR_CHECKBOX_F                '0.25 0.75 0'
 COLOR_CHECKBOX_D                '0.5 1 0'
 
 // item: credits list
@@ -108,9 +108,9 @@
 // item: map list
 COLOR_MAPLIST_TITLE             '1 1 1'
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
-COLOR_MAPLIST_INCLUDEDBG        '0.5 1 0'
+COLOR_MAPLIST_INCLUDEDBG        '0.25 0.75 0'
 ALPHA_MAPLIST_INCLUDEDFG        1
-ALPHA_MAPLIST_INCLUDEDBG        0.25
+ALPHA_MAPLIST_INCLUDEDBG        0.375
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
 
 // item: nexposee
@@ -132,14 +132,14 @@
 //   uses "radiobutton" images
 COLOR_RADIOBUTTON_N             '0.5 1 0'
 COLOR_RADIOBUTTON_C             '0.5 1 0'
-COLOR_RADIOBUTTON_F             '0.5 1 0'
+COLOR_RADIOBUTTON_F             '0.25 0.75 0'
 COLOR_RADIOBUTTON_D             '0.5 1 0'
 
 // item: scrollbar
 //   uses "scrollbar" images
 COLOR_SCROLLBAR_N               '0.5 1 0'
 COLOR_SCROLLBAR_C               '0.5 1 0'
-COLOR_SCROLLBAR_F               '0.5 1 0'
+COLOR_SCROLLBAR_F               '0.25 0.75 0'
 COLOR_SCROLLBAR_S               '0.5 1 0'
 WIDTH_SCROLLBAR                 16
 
@@ -155,7 +155,7 @@
 //   uses "slider" images
 COLOR_SLIDER_N                  '0.5 1 0'
 COLOR_SLIDER_C                  '0.5 1 0'
-COLOR_SLIDER_F                  '0.5 1 0'
+COLOR_SLIDER_F                  '0.25 0.75 0'
 COLOR_SLIDER_D                  '0.5 1 0'
 COLOR_SLIDER_S                  '0.5 1 0'
 WIDTH_SLIDERTEXT                0.333333333333

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/slider_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/background_ingame.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedred/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedred/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked Red by sev
+// Values for Wicked 2 Red by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -8,15 +8,15 @@
 HEIGHT_ZOOMEDTITLE              -1
 
 // the individual dialog background colors
-COLOR_DIALOG_MULTIPLAYER        '0.75 0.5 0.5'
-COLOR_DIALOG_SETTINGS           '0.75 0.5 0.5'
-COLOR_DIALOG_TEAMSELECT         '0.75 0.5 0.5'
+COLOR_DIALOG_MULTIPLAYER        '1 0 0'
+COLOR_DIALOG_SETTINGS           '1 0 0'
+COLOR_DIALOG_TEAMSELECT         '1 0 0'
 COLOR_DIALOG_QUIT               '0.75 0 0'
-COLOR_DIALOG_MUTATORS           '0.75 0.5 0.5'
-COLOR_DIALOG_MAPINFO            '0.75 0.5 0.5'
-COLOR_DIALOG_USERBIND           '0.75 0.5 0.5'
-COLOR_DIALOG_SINGLEPLAYER       '0.75 0.5 0.5'
-COLOR_DIALOG_CREDITS            '0.75 0.5 0.5'
+COLOR_DIALOG_MUTATORS           '1 0 0'
+COLOR_DIALOG_MAPINFO            '1 0 0'
+COLOR_DIALOG_USERBIND           '1 0 0'
+COLOR_DIALOG_SINGLEPLAYER       '1 0 0'
+COLOR_DIALOG_CREDITS            '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -43,10 +43,10 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
-COLOR_BUTTON_N                  '0.75 0 0'
-COLOR_BUTTON_C                  '0.75 0 0'
-COLOR_BUTTON_F                  '0.75 0 0'
-COLOR_BUTTON_D                  '0.75 0 0'
+COLOR_BUTTON_N                  '1 0 0'
+COLOR_BUTTON_C                  '1 0 0'
+COLOR_BUTTON_F                  '1 0 0'
+COLOR_BUTTON_D                  '1 0 0'
 
 // item: campaign
 ALPHA_CAMPAIGN_SELECTABLE       0.8
@@ -59,17 +59,17 @@
 
 // item: checkbox
 //   uses "checkbox" images
-COLOR_CHECKBOX_N                '0.75 0 0'
-COLOR_CHECKBOX_C                '0.75 0 0'
+COLOR_CHECKBOX_N                '1 0 0'
+COLOR_CHECKBOX_C                '1 0 0'
 COLOR_CHECKBOX_F                '0.75 0 0'
-COLOR_CHECKBOX_D                '0.75 0 0'
+COLOR_CHECKBOX_D                '1 0 0'
 
 // item: credits list
 COLOR_CREDITS_TITLE             '1 1 1'
 ALPHA_CREDITS_TITLE             1
 COLOR_CREDITS_FUNCTION          '1 1 1'
 ALPHA_CREDITS_FUNCTION          0.7
-COLOR_CREDITS_PERSON            '0.75 0 0'
+COLOR_CREDITS_PERSON            '1 0 0'
 ALPHA_CREDITS_PERSON            1
 ROWS_CREDITS                    20
 WIDTH_CREDITS                   0.5
@@ -89,8 +89,8 @@
 
 // item: input box
 //   uses "inputbox" images
-COLOR_INPUTBOX_N                '0.75 0 0'
-COLOR_INPUTBOX_F                '0.75 0 0'
+COLOR_INPUTBOX_N                '1 0 0'
+COLOR_INPUTBOX_F                '1 0 0'
 MARGIN_INPUTBOX                 0.02
 
 // item: key grabber
@@ -100,9 +100,9 @@
 ALPHA_KEYGRABBER_KEYS           0.7
 
 // item: list box
-COLOR_LISTBOX_SELECTED          '0.75 0 0'
+COLOR_LISTBOX_SELECTED          '1 0 0'
 ALPHA_LISTBOX_SELECTED          1
-COLOR_LISTBOX_WAITING           '0.75 0 0'
+COLOR_LISTBOX_WAITING           '1 0 0'
 ALPHA_LISTBOX_WAITING           0.5
 
 // item: map list
@@ -110,7 +110,7 @@
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
 COLOR_MAPLIST_INCLUDEDBG        '0.75 0 0'
 ALPHA_MAPLIST_INCLUDEDFG        1
-ALPHA_MAPLIST_INCLUDEDBG        0.25
+ALPHA_MAPLIST_INCLUDEDBG        0.375
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
 
 // item: nexposee
@@ -130,17 +130,17 @@
 
 // item: radio button
 //   uses "radiobutton" images
-COLOR_RADIOBUTTON_N             '0.75 0 0'
-COLOR_RADIOBUTTON_C             '0.75 0 0'
+COLOR_RADIOBUTTON_N             '1 0 0'
+COLOR_RADIOBUTTON_C             '1 0 0'
 COLOR_RADIOBUTTON_F             '0.75 0 0'
-COLOR_RADIOBUTTON_D             '0.75 0 0'
+COLOR_RADIOBUTTON_D             '1 0 0'
 
 // item: scrollbar
 //   uses "scrollbar" images
-COLOR_SCROLLBAR_N               '0.75 0 0'
-COLOR_SCROLLBAR_C               '0.75 0 0'
+COLOR_SCROLLBAR_N               '1 0 0'
+COLOR_SCROLLBAR_C               '1 0 0'
 COLOR_SCROLLBAR_F               '0.75 0 0'
-COLOR_SCROLLBAR_S               '0.75 0 0'
+COLOR_SCROLLBAR_S               '1 0 0'
 WIDTH_SCROLLBAR                 16
 
 // item: server list
@@ -153,10 +153,10 @@
 
 // item: slider
 //   uses "slider" images
-COLOR_SLIDER_N                  '0.75 0 0'
-COLOR_SLIDER_C                  '0.75 0 0'
+COLOR_SLIDER_N                  '1 0 0'
+COLOR_SLIDER_C                  '1 0 0'
 COLOR_SLIDER_F                  '0.75 0 0'
-COLOR_SLIDER_D                  '0.75 0 0'
-COLOR_SLIDER_S                  '0.75 0 0'
+COLOR_SLIDER_D                  '1 0 0'
+COLOR_SLIDER_S                  '1 0 0'
 WIDTH_SLIDERTEXT                0.333333333333
 TOLERANCE_SLIDER                '0.2 2 0'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/slider_s.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedwhite/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked White by sev
+// Values for Wicked 2 White by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -50,18 +50,18 @@
 
 // item: campaign
 ALPHA_CAMPAIGN_SELECTABLE       0.8
-COLOR_CAMPAIGN_SELECTABLE       '1 1 1'
+COLOR_CAMPAIGN_SELECTABLE       '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_CURRENT          1
-COLOR_CAMPAIGN_CURRENT          '1 1 1'
+COLOR_CAMPAIGN_CURRENT          '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_FUTURE           0.2
-COLOR_CAMPAIGN_FUTURE           '1 1 1'
+COLOR_CAMPAIGN_FUTURE           '0.75 0.75 0.75'
 ALPHA_CAMPAIGN_DESCRIPTION      0.7
 
 // item: checkbox
 //   uses "checkbox" images
 COLOR_CHECKBOX_N                '1 1 1'
 COLOR_CHECKBOX_C                '1 1 1'
-COLOR_CHECKBOX_F                '1 1 1'
+COLOR_CHECKBOX_F                '0.75 0.75 0.75'
 COLOR_CHECKBOX_D                '1 1 1'
 
 // item: credits list
@@ -100,15 +100,15 @@
 ALPHA_KEYGRABBER_KEYS           0.7
 
 // item: list box
-COLOR_LISTBOX_SELECTED          '1 1 1'
+COLOR_LISTBOX_SELECTED          '0.875 0.875 0.875'
 ALPHA_LISTBOX_SELECTED          1
-COLOR_LISTBOX_WAITING           '1 1 1'
+COLOR_LISTBOX_WAITING           '0.875 0.875 0.875'
 ALPHA_LISTBOX_WAITING           0.5
 
 // item: map list
 COLOR_MAPLIST_TITLE             '1 1 1'
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
-COLOR_MAPLIST_INCLUDEDBG        '1 1 1'
+COLOR_MAPLIST_INCLUDEDBG        '0.75 0.75 0.75'
 ALPHA_MAPLIST_INCLUDEDFG        1
 ALPHA_MAPLIST_INCLUDEDBG        0.25
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
@@ -132,14 +132,14 @@
 //   uses "radiobutton" images
 COLOR_RADIOBUTTON_N             '1 1 1'
 COLOR_RADIOBUTTON_C             '1 1 1'
-COLOR_RADIOBUTTON_F             '1 1 1'
+COLOR_RADIOBUTTON_F             '0.75 0.75 0.75'
 COLOR_RADIOBUTTON_D             '1 1 1'
 
 // item: scrollbar
 //   uses "scrollbar" images
 COLOR_SCROLLBAR_N               '1 1 1'
 COLOR_SCROLLBAR_C               '1 1 1'
-COLOR_SCROLLBAR_F               '1 1 1'
+COLOR_SCROLLBAR_F               '0.75 0.75 0.75'
 COLOR_SCROLLBAR_S               '1 1 1'
 WIDTH_SCROLLBAR                 16
 
@@ -155,7 +155,7 @@
 //   uses "slider" images
 COLOR_SLIDER_N                  '1 1 1'
 COLOR_SLIDER_C                  '1 1 1'
-COLOR_SLIDER_F                  '1 1 1'
+COLOR_SLIDER_F                  '0.75 0.75 0.75'
 COLOR_SLIDER_D                  '1 1 1'
 COLOR_SLIDER_S                  '1 1 1'
 WIDTH_SLIDERTEXT                0.333333333333

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/slider_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/background.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/background_ingame.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/wickedyellow/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/border.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/button_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/buttongray_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/charmapbutton.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkbox_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/checkmark.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/closebutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/colorbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/colorbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/crosshairbutton_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/cursor.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/inputbox_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/inputbox_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_c0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_c1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_d0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_d1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_f0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_f1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_n0.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/radiobutton_n1.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/scrollbar_s.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-// Values for Wicked Red by sev
+// Values for Wicked 2 Yellow by sev
 
 // font sizes (used for everything)
 FONTSIZE_NORMAL                 12
@@ -8,15 +8,15 @@
 HEIGHT_ZOOMEDTITLE              -1
 
 // the individual dialog background colors
-COLOR_DIALOG_MULTIPLAYER        '1 0.875 0.5'
-COLOR_DIALOG_SETTINGS           '1 0.875 0.5'
-COLOR_DIALOG_TEAMSELECT         '1 0.875 0.5'
+COLOR_DIALOG_MULTIPLAYER        '1 0.875 0'
+COLOR_DIALOG_SETTINGS           '1 0.875 0'
+COLOR_DIALOG_TEAMSELECT         '1 0.875 0'
 COLOR_DIALOG_QUIT               '0.75 0 0'
-COLOR_DIALOG_MUTATORS           '1 0.875 0.5'
-COLOR_DIALOG_MAPINFO            '1 0.875 0.5'
-COLOR_DIALOG_USERBIND           '1 0.875 0.5'
-COLOR_DIALOG_SINGLEPLAYER       '1 0.875 0.5'
-COLOR_DIALOG_CREDITS            '1 0.875 0.5'
+COLOR_DIALOG_MUTATORS           '1 0.875 0'
+COLOR_DIALOG_MAPINFO            '1 0.875 0'
+COLOR_DIALOG_USERBIND           '1 0.875 0'
+COLOR_DIALOG_SINGLEPLAYER       '1 0.875 0'
+COLOR_DIALOG_CREDITS            '1 0.875 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -43,10 +43,10 @@
 // item: button
 //   uses "button" images
 //   uses "buttongray" images
-COLOR_BUTTON_N                  '1 0.75 0'
-COLOR_BUTTON_C                  '1 0.75 0'
-COLOR_BUTTON_F                  '1 0.75 0'
-COLOR_BUTTON_D                  '1 0.75 0'
+COLOR_BUTTON_N                  '1 0.875 0'
+COLOR_BUTTON_C                  '1 0.875 0'
+COLOR_BUTTON_F                  '1 0.875 0'
+COLOR_BUTTON_D                  '1 0.875 0'
 
 // item: campaign
 ALPHA_CAMPAIGN_SELECTABLE       0.8
@@ -59,17 +59,17 @@
 
 // item: checkbox
 //   uses "checkbox" images
-COLOR_CHECKBOX_N                '1 0.75 0'
-COLOR_CHECKBOX_C                '1 0.75 0'
+COLOR_CHECKBOX_N                '1 0.875 0'
+COLOR_CHECKBOX_C                '1 0.875 0'
 COLOR_CHECKBOX_F                '1 0.75 0'
-COLOR_CHECKBOX_D                '1 0.75 0'
+COLOR_CHECKBOX_D                '1 0.875 0'
 
 // item: credits list
 COLOR_CREDITS_TITLE             '1 1 1'
 ALPHA_CREDITS_TITLE             1
 COLOR_CREDITS_FUNCTION          '1 1 1'
 ALPHA_CREDITS_FUNCTION          0.7
-COLOR_CREDITS_PERSON            '1 0.75 0'
+COLOR_CREDITS_PERSON            '1 0.875 0'
 ALPHA_CREDITS_PERSON            1
 ROWS_CREDITS                    20
 WIDTH_CREDITS                   0.5
@@ -89,8 +89,8 @@
 
 // item: input box
 //   uses "inputbox" images
-COLOR_INPUTBOX_N                '1 0.75 0'
-COLOR_INPUTBOX_F                '1 0.75 0'
+COLOR_INPUTBOX_N                '1 0.875 0'
+COLOR_INPUTBOX_F                '1 0.875 0'
 MARGIN_INPUTBOX                 0.02
 
 // item: key grabber
@@ -100,9 +100,9 @@
 ALPHA_KEYGRABBER_KEYS           0.7
 
 // item: list box
-COLOR_LISTBOX_SELECTED          '1 0.75 0'
+COLOR_LISTBOX_SELECTED          '1 0.875 0'
 ALPHA_LISTBOX_SELECTED          1
-COLOR_LISTBOX_WAITING           '1 0.75 0'
+COLOR_LISTBOX_WAITING           '1 0.875 0'
 ALPHA_LISTBOX_WAITING           0.5
 
 // item: map list
@@ -110,7 +110,7 @@
 COLOR_MAPLIST_AUTHOR            '0.75 0.75 0.75'
 COLOR_MAPLIST_INCLUDEDBG        '1 0.75 0'
 ALPHA_MAPLIST_INCLUDEDFG        1
-ALPHA_MAPLIST_INCLUDEDBG        0.25
+ALPHA_MAPLIST_INCLUDEDBG        0.375
 ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
 
 // item: nexposee
@@ -130,33 +130,33 @@
 
 // item: radio button
 //   uses "radiobutton" images
-COLOR_RADIOBUTTON_N             '1 0.75 0'
-COLOR_RADIOBUTTON_C             '1 0.75 0'
+COLOR_RADIOBUTTON_N             '1 0.875 0'
+COLOR_RADIOBUTTON_C             '1 0.875 0'
 COLOR_RADIOBUTTON_F             '1 0.75 0'
-COLOR_RADIOBUTTON_D             '1 0.75 0'
+COLOR_RADIOBUTTON_D             '1 0.875 0'
 
 // item: scrollbar
 //   uses "scrollbar" images
-COLOR_SCROLLBAR_N               '1 0.75 0'
-COLOR_SCROLLBAR_C               '1 0.75 0'
+COLOR_SCROLLBAR_N               '1 0.875 0'
+COLOR_SCROLLBAR_C               '1 0.875 0'
 COLOR_SCROLLBAR_F               '1 0.75 0'
-COLOR_SCROLLBAR_S               '1 0.75 0'
+COLOR_SCROLLBAR_S               '1 0.875 0'
 WIDTH_SCROLLBAR                 16
 
 // item: server list
 ALPHA_SERVERLIST_FULL           0.4
 ALPHA_SERVERLIST_EMPTY          0.7
 COLOR_SERVERLIST_LOWPING        '0 1 0'
-COLOR_SERVERLIST_MEDPING        '1 0.75 0'
+COLOR_SERVERLIST_MEDPING        '1 0.875 0'
 COLOR_SERVERLIST_HIGHPING       '1 0 0'
 ALPHA_SERVERLIST_HIGHPING       0.4
 
 // item: slider
 //   uses "slider" images
-COLOR_SLIDER_N                  '1 0.75 0'
-COLOR_SLIDER_C                  '1 0.75 0'
+COLOR_SLIDER_N                  '1 0.875 0'
+COLOR_SLIDER_C                  '1 0.875 0'
 COLOR_SLIDER_F                  '1 0.75 0'
-COLOR_SLIDER_D                  '1 0.75 0'
-COLOR_SLIDER_S                  '1 0.75 0'
+COLOR_SLIDER_D                  '1 0.875 0'
+COLOR_SLIDER_S                  '1 0.875 0'
 WIDTH_SLIDERTEXT                0.333333333333
 TOLERANCE_SLIDER                '0.2 2 0'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_c.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_d.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_f.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_n.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/slider_s.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_c.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbutton_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_d.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbutton_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_f.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbutton_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbutton_n.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbutton_n.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_c.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbuttongray_c.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_d.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbuttongray_d.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_f.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbuttongray_f.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/xaw/bigbuttongray_n.tga (from rev 4119, trunk/data/gfx/menu/xaw/bigbuttongray_n.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2008-08-12 12:20:43 UTC (rev 4120)
@@ -41,6 +41,8 @@
 // item: button
 //   uses button.tga
 //   uses buttongray.tga
+//   uses bigbutton.tga
+//   uses bigbuttongray.tga
 COLOR_BUTTON_N                  '1 1 1'
 COLOR_BUTTON_C                  '1 1 1'
 COLOR_BUTTON_F                  '1 1 1'
@@ -89,7 +91,7 @@
 //   uses inputbox.tga
 COLOR_INPUTBOX_N                '1 1 1'
 COLOR_INPUTBOX_F                '1 1 1'
-MARGIN_INPUTBOX                 0.02
+MARGIN_INPUTBOX_CHARS           1
 
 // item: key grabber
 COLOR_KEYGRABBER_TITLES         '1 1 1'

Modified: branches/nexuiz-2.0/data/maps/reslimed.ent
===================================================================
--- branches/nexuiz-2.0/data/maps/reslimed.ent	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/maps/reslimed.ent	2008-08-12 12:20:43 UTC (rev 4120)
@@ -3,7 +3,7 @@
 "classname" "worldspawn"
 "message" "Slimepit Revisited"
 "gridsize" "128 128 256"
-"fog" "0.2 0.3 1 0 0.5 0 1024"
+"fog" "0.2 0.3 1 0 0.5 400 1024"
 }
 {
 "classname" "func_rotating"

Modified: branches/nexuiz-2.0/data/models/sprites/danger.sp2
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/helpme.sp2
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/here.sp2
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/keycarrier-finish.sp2
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/make-sprites.sh
===================================================================
--- branches/nexuiz-2.0/data/models/sprites/make-sprites.sh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/models/sprites/make-sprites.sh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -161,3 +161,5 @@
 sprite ons-cp-atck-blue   "CONTROL POINT" 0000ff 000000 0.5 0000ff ffff00 0.5
 sprite ons-cp-dfnd-red    "CONTROL POINT" ff0000 000000 0.5 ff0000 ffffff 0.5
 sprite ons-cp-dfnd-blue   "CONTROL POINT" 0000ff 000000 0.5 0000ff ffffff 0.5
+sprite race-checkpoint    "CHECKPOINT"    ff8000 000000 0.0
+sprite race-finish        "FINISH"        ff8000 000000 0.0

Copied: branches/nexuiz-2.0/data/models/sprites/race-checkpoint.sp2 (from rev 4119, trunk/data/models/sprites/race-checkpoint.sp2)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/sprites/race-finish.sp2 (from rev 4119, trunk/data/models/sprites/race-finish.sp2)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/redbase.sp2
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -151,18 +151,20 @@
 float		intermission;
 float		sb_showscores;
 .string		message;
-float		coop;
-float		deathmatch;
+// float		coop;
+// float		deathmatch;
 
-float		dmg_take;
-float		dmg_save;
-vector		dmg_origin;
+// float		dmg_take;
+// float		dmg_save;
+// vector		dmg_origin;
 
 // Darkplaces Render Modifications
+#if 0
 .float alpha;
 .float renderflags;
 .vector colormod;
 .float scale;
+#endif
 
 // Basic variables
 .float enttype; // entity type sent from server
@@ -171,6 +173,29 @@
 .float team_size;
 
 float vid_conwidth, vid_conheight;
-float caps_team1, caps_team2;
 float configdb;
 string shortmapname;
+
+// QUALIFYING
+float race_checkpoint;
+float race_time;
+float race_laptime;
+float race_checkpointtime;
+float race_previousbesttime;
+string race_previousbestname;
+float race_nextcheckpoint;
+float race_nextbesttime;
+string race_nextbestname;
+
+// RACE
+float race_mycheckpoint;
+float race_mycheckpointtime;
+float race_mycheckpointdelta;
+float race_mycheckpointlapsdelta;
+string race_mycheckpointenemy;
+float race_othercheckpoint;
+float race_othercheckpointtime;
+float race_othercheckpointdelta;
+float race_othercheckpointlapsdelta;
+string race_othercheckpointenemy;
+float sb_showscores_force;

Modified: branches/nexuiz-2.0/data/qcsrc/client/Main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -141,7 +141,6 @@
 
 void Playerchecker_Think()
 {
-	entity pl;
 	float i;
 	for(i = 0; i < maxclients; ++i)
 	{
@@ -178,8 +177,6 @@
 
 void PostInit(void)
 {
-	float i;
-
 	print(strcat("PostInit\n    maxclients = ", ftos(maxclients), "\n"));
 	localcmd(strcat("\nsbar_columns_set ", cvar_string("sbar_columns"), ";\n"));
 
@@ -304,10 +301,11 @@
 	}
 }
 
-void Ent_ReadPlayerScore(float isNew)
+void Ent_ReadPlayerScore()
 {
 	float i, Team;
-	entity tm, o;
+	float isNew;
+	entity o;
 
 	// damnit -.- don't want to go change every single .sv_entnum in sbar.qc AGAIN
 	// (no I've never heard of M-x replace-string, sed, or anything like that)
@@ -331,7 +329,7 @@
 	Sbar_UpdatePlayerPos(o);
 }
 
-void Ent_ReadTeamScore(float isNew)
+void Ent_ReadTeamScore()
 {
 	float i;
 	entity o;
@@ -347,10 +345,15 @@
 
 // CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured.
 // The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS.
+void Ent_Remove();
 void(float bIsNewEntity) CSQC_Ent_Update =
 {
-	float msg;
-	self.enttype = ReadByte();
+	float msg, t;
+	t = ReadByte();
+	if(self.enttype)
+		if(t != self.enttype)
+			Ent_Remove();
+	self.enttype = t;
 	if(self.enttype == ENT_CLIENT_ENTCS)
 	{
 		self.sv_entnum = ReadByte()-1;
@@ -367,15 +370,17 @@
 		}
 	}
 	else if(self.enttype == ENT_CLIENT_SCORES)
-		Ent_ReadPlayerScore(bIsNewEntity);
+		Ent_ReadPlayerScore();
 	else if(self.enttype == ENT_CLIENT_TEAMSCORES)
-		Ent_ReadTeamScore(bIsNewEntity);
+		Ent_ReadTeamScore();
 	else
 		error("unknown entity type in CSQC_Ent_Update\n");
 	
 };
-// CSQC_Ent_Remove : Called when the server requests a SSQC / CSQC entity to be removed.  Essentially call remove(self) as well.
-void CSQC_Ent_Remove()
+// Destructor, but does NOT deallocate the entity by calling remove(). Also
+// used when an entity changes its type. For an entity that someone interacts
+// with others, make sure it can no longer do so.
+void Ent_Remove()
 {
 	if(self.enttype == ENT_CLIENT_ENTCS)
 	{
@@ -396,11 +401,11 @@
 		}
 	} else if(self.enttype == ENT_CLIENT_SCORES)
 	{
-		entity tm;
 		if(self.owner)
 		{
 			SetTeam(self.owner, -1);
-			RemovePlayer(self.owner);
+			if(self.owner.sort_prev)
+				RemovePlayer(self.owner);
 			self.owner.sort_prev = NULL;
 		}
 	} else if(self.enttype == ENT_CLIENT_TEAMSCORES)
@@ -412,6 +417,16 @@
 		// we don't NEED to remove them... they won't display anyway
 		// plus, svqc never does this anyway
 	}
+
+	self.enttype = 0;
+	self.classname = "";
+	// TODO possibly set more stuff to defaults
+}
+// CSQC_Ent_Remove : Called when the server requests a SSQC / CSQC entity to be removed.  Essentially call remove(self) as well.
+void CSQC_Ent_Remove()
+{
+	if(self.enttype)
+		Ent_Remove();
 	remove(self);
 }
 
@@ -547,6 +562,69 @@
 	db_put(configdb, strcat("/s/", key), "1");
 }
 
+void Net_ReadRace()
+{
+	float b;
+
+	b = ReadByte();
+
+	switch(b)
+	{
+		case RACE_NET_CHECKPOINT_HIT_QUALIFYING:
+			race_checkpoint = ReadByte();
+			race_time = ReadShort();
+			race_previousbesttime = ReadShort();
+			if(race_previousbestname)
+				strunzone(race_previousbestname);
+			race_previousbestname = strzone(ReadString());
+
+			race_checkpointtime = time;
+
+			if(race_checkpoint == 0)
+				race_laptime = time; // valid
+
+			break;
+
+		case RACE_NET_CHECKPOINT_CLEAR:
+			race_laptime = 0;
+			race_checkpointtime = 0;
+			break;
+
+		case RACE_NET_CHECKPOINT_NEXT_QUALIFYING:
+			race_nextcheckpoint = ReadByte();
+
+			race_nextbesttime = ReadShort();
+			if(race_nextbestname)
+				strunzone(race_nextbestname);
+			race_nextbestname = strzone(ReadString());
+			break;
+
+		case RACE_NET_CHECKPOINT_HIT_RACE:
+			race_mycheckpoint = ReadByte();
+			race_mycheckpointtime = time;
+			race_mycheckpointdelta = ReadShort();
+			race_mycheckpointlapsdelta = ReadByte();
+			if(race_mycheckpointlapsdelta >= 128)
+				race_mycheckpointlapsdelta -= 256;
+			if(race_mycheckpointenemy)
+				strunzone(race_mycheckpointenemy);
+			race_mycheckpointenemy = strzone(ReadString());
+			break;
+
+		case RACE_NET_CHECKPOINT_HIT_RACE_BY_OPPONENT:
+			race_othercheckpoint = ReadByte();
+			race_othercheckpointtime = time;
+			race_othercheckpointdelta = ReadShort();
+			race_othercheckpointlapsdelta = ReadByte();
+			if(race_othercheckpointlapsdelta >= 128)
+				race_othercheckpointlapsdelta -= 256;
+			if(race_othercheckpointenemy)
+				strunzone(race_othercheckpointenemy);
+			race_othercheckpointenemy = strzone(ReadString());
+			break;
+	}
+}
+
 // CSQC_Parse_TempEntity : Handles all temporary entity network data in the CSQC layer.
 // You must ALWAYS first acquire the temporary ID, which is sent as a byte.
 // Return value should be 1 if CSQC handled the temporary entity, otherwise return 0 to have the engine process the event.
@@ -577,6 +655,14 @@
 			Net_ReadScoresInfo();
 			bHandled = true;
 			break;
+		case TE_CSQC_RACE:
+			Net_ReadRace();
+			bHandled = true;
+			break;
+		case TE_CSQC_FORCESCOREBOARD:
+			sb_showscores_force = true;
+			bHandled = true;
+			break;
 		default:
 			// No special logic for this temporary entity; return 0 so the engine can handle it
 			bHandled = false;
@@ -590,13 +676,6 @@
 }
 
 // COMMIT-TODO: Update if necessare, before committing
-float csqc_svn_map[CSQC_REVISION] =
-{
-	3812, // 3795,
-	3820 // mapvote protocol changed from there
-};
-
-// COMMIT-TODO: Update if necessare, before committing
 void CSQC_CheckRevision()
 {
 	if(csqc_revision == CSQC_REVISION)
@@ -604,9 +683,6 @@
 		print("^2SVQC and CSQC revisions are compatible.\n");
 	} else if(csqc_revision < CSQC_REVISION) {
 		print("^1Your csprogs.dat (CSQC) version is newer than the one on the server.\n");
-		print("^1The last known svn revision for the server's CSQC is: ^7");
-		print(ftos(csqc_svn_map[csqc_revision])); // don't use strcat, fteqcc loves screwing up arrays...
-		print("\n");
 	} else if(csqc_revision > CSQC_REVISION) {
 		print("^1Your csprogs.dat (CSQC) is too old for this server.\n");
 		print("^1Please update to a newer version.\n");

Modified: branches/nexuiz-2.0/data/qcsrc/client/mapvoting.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/mapvoting.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/mapvoting.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -77,7 +77,6 @@
 
 void MapVote_DrawAbstain(vector pos, float isize, float tsize, float count, float id)
 {
-	vector img_size;
 	vector rgb;
 	float text_size;
 	string label;

Modified: branches/nexuiz-2.0/data/qcsrc/client/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/miscfunctions.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/miscfunctions.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,3 @@
-float databuf;
 var float(string text, float handleColors) stringwidth;
 
 entity players;
@@ -27,7 +26,7 @@
 
 	if(!pl)
 	{
-		print("Trying to remove a player which is not in the playerlist!");
+		error("Trying to remove a player which is not in the playerlist!");
 		return;
 	}
 	parent.sort_next = player.sort_next;

Modified: branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -8,15 +8,7 @@
 vector sbar;
 float sbar_alpha_fg;
 float sbar_hudselector;
-/*
-entity sortedPlayers;
-entity sortedTeams;
 
-.float sb_frags;
-.float sb_team;
-.float sb_player;
-.float sb_caps;
-*/
 float ps_primary, ps_secondary;
 float ts_primary, ts_secondary;
 
@@ -131,7 +123,7 @@
 void Cmd_Sbar_SetFields(float argc);
 void Sbar_InitScores()
 {
-	float i, f, primary_prio, secondary_prio;
+	float i, f;
 
 	ps_primary = ps_secondary = ts_primary = ts_secondary = -1;
 	for(i = 0; i < MAX_SCORE; ++i)
@@ -212,6 +204,13 @@
 
 	vl = left.scores[ps_primary];
 	vr = right.scores[ps_primary];
+	if(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)
+	{
+		if(vl == 0 && vr != 0)
+			return 1;
+		if(vl != 0 && vr == 0)
+			return 0;
+	}
 	if(vl > vr)
 		return IS_INCREASING(scores_flags[ps_primary]);
 	if(vl < vr)
@@ -219,6 +218,13 @@
 	
 	vl = left.scores[ps_secondary];
 	vr = right.scores[ps_secondary];
+	if(scores_flags[ps_secondary] & SFL_ZERO_IS_WORST)
+	{
+		if(vl == 0 && vr != 0)
+			return 1;
+		if(vl != 0 && vr == 0)
+			return 0;
+	}
 	if(vl > vr)
 		return IS_INCREASING(scores_flags[ps_secondary]);
 	if(vl < vr)
@@ -556,7 +562,7 @@
 			else
 				sbar_field_rgb = '1 1 1';
 			if(!tmp)
-				if(f & (SFL_HIDE_ZERO | SFL_RANK))
+				if(f & (SFL_HIDE_ZERO | SFL_RANK | SFL_TIME))
 					return "";
 			if(f & SFL_RANK)
 			{
@@ -573,6 +579,10 @@
 				else
 					return strcat(str, "th");
 			}
+			else if(f & SFL_TIME)
+			{
+				return mmsss(tmp);
+			}
 			return ftos(tmp);
 	}
 	//return "error";
@@ -924,6 +934,71 @@
 	sbar = sbar_save;
 }
 
+string MakeRaceString(float cp, float mytime, float histime, float lapdelta, string hisname)
+{
+	string col;
+	string timestr;
+	string cpname;
+	string lapstr;
+	lapstr = "";
+
+	if(histime == 0) // goal hit
+	{
+		if(mytime > 0)
+		{
+			timestr = strcat("+", ftos_decimals(+mytime, 1));
+			col = "^1";
+		}
+		else if(mytime == 0)
+		{
+			timestr = "+0.0";
+			col = "^3";
+		}
+		else
+		{
+			timestr = strcat("-", ftos_decimals(-mytime, 1));
+			col = "^2";
+		}
+
+		if(lapdelta > 0)
+		{
+			lapstr = strcat(" (-", ftos(lapdelta), "L)");
+			col = "^2";
+		}
+		else if(lapdelta < 0)
+		{
+			lapstr = strcat(" (+", ftos(-lapdelta), "L)");
+			col = "^1";
+		}
+	}
+	else if(histime > 0) // anticipation
+	{
+		if(mytime >= histime)
+			timestr = strcat("+", ftos_decimals(mytime - histime, 1));
+		else
+			timestr = mmsss(histime * 10);
+		col = "^3";
+	}
+	else
+		col = "^7";
+
+	if(cp)
+		cpname = strcat("Intermediate ", ftos(cp));
+	else
+		cpname = "Finish line";
+	
+	if(histime < 0)
+		return strcat(col, cpname);
+	else if(hisname == "")
+		return strcat(col, cpname, " (", timestr, ")");
+	else
+		return strcat(col, cpname, " (", timestr, " ", strcat(hisname, col, lapstr), ")");
+}
+
+void dummyfunction(float a1, float a2, float a3, float a4, float a5, float a6, float a7, float a8)
+{
+}
+
 void Sbar_Score(float margin)
 {
 	float timelimit, timeleft, minutes, seconds, distribution, myplace, score;
@@ -1025,6 +1100,74 @@
 		drawpic(sbar + '-36 32 0', "gfx/num_colon", '12 12 0', '1 1 1', sbar_alpha_fg, 0);
 		Sbar_DrawXNum('-24 32 0', seconds, -2, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
 	}
+
+	if(gametype == GAME_RACE)
+	{
+		drawfont = sbar_bigfont;
+		float a;
+		vector m;
+		string s;
+
+		m = '0.5 0 0' * vid_conwidth + '0 0.25 0' * vid_conheight;
+
+		if(race_checkpointtime)
+		{
+
+			a = bound(0, 2 - (time - race_checkpointtime), 1);
+			s = "";
+			if(a > 0) // just hit a checkpoint?
+			{
+				if(race_time && race_previousbesttime)
+					s = MakeRaceString(race_checkpoint, race_time / 10 - race_previousbesttime / 10, 0, 0, race_previousbestname);
+				else
+					s = MakeRaceString(race_checkpoint, 0, -1, 0, race_previousbestname);
+			}
+			else
+			{
+				if(race_laptime && race_nextbesttime)
+				{
+					a = bound(0, 2 - ((race_laptime + race_nextbesttime/10) - time), 1);
+					if(a > 0) // next one?
+					{
+						s = MakeRaceString(race_nextcheckpoint, time - race_laptime, race_nextbesttime / 10, 0, race_nextbestname);
+					}
+				}
+			}
+
+			if(s != "")
+			if(a > 0)
+			{
+				dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+				drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', sbar_alpha_fg * a, 0);
+			}
+
+			if(race_laptime)
+			{
+				s = mmsss(10*(time - race_laptime));
+				drawstring(m - '0 0 0' - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', sbar_alpha_fg, 0);
+			}
+		}
+		else
+		{
+			if(race_mycheckpointtime)
+			{
+				a = bound(0, 2 - (time - race_mycheckpointtime), 1);
+				s = MakeRaceString(race_mycheckpoint, race_mycheckpointdelta / 10, -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy);
+				dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+				drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', sbar_alpha_fg * a, 0);
+			}
+			if(race_othercheckpointtime && race_othercheckpointenemy != "")
+			{
+				a = bound(0, 2 - (time - race_othercheckpointtime), 1);
+				s = MakeRaceString(race_othercheckpoint, -race_othercheckpointdelta / 10, -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy);
+				dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+				drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', sbar_alpha_fg * a, 0);
+			}
+		}
+
+		drawfont = sbar_font;
+	}
+
 	sbar = sbar_save;
 }
 
@@ -1183,7 +1326,7 @@
 		Sbar_FinaleOverlay();
 	else
 	{
-		if (sb_showscores || (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard")))
+		if (sb_showscores || sb_showscores_force || (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard")))
 		{
 			sbar_x = (vid_conwidth - 640.0)*0.5;
 			sbar_y = vid_conheight - 47;

Modified: branches/nexuiz-2.0/data/qcsrc/client/sortlist.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/sortlist.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/client/sortlist.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,4 +1,4 @@
-.float(entity,entity) sort_cmp;
+//.float(entity,entity) sort_cmp;
 .entity sort_next, sort_prev;
 
 entity Sort_Spawn()
@@ -9,7 +9,7 @@
 	sort.chain = sort;
 	return sort;
 }
-
+/*
 entity Sort_New(float(entity,entity) cmp)
 {
 	entity sort;
@@ -96,6 +96,7 @@
 		sort = sort.sort_next;
 	return sort;
 }
+*/
 
 /**
  * Swap two neighbours in a sortlist.
@@ -110,6 +111,7 @@
 	a.sort_prev = b;									\
 	b.sort_next = a
 
+/*
 void Sort_Erase(entity ent)
 {
 	ent.sort_prev.sort_next = ent.sort_next;
@@ -130,3 +132,4 @@
 		}
 	}
 }
+*/

Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -6,7 +6,10 @@
 // Revision 5: mapvote time fix
 // Revision 6: more robust against packet loss/delays, also show not yet connected clients
 // Revision 7: packet loss column
-#define CSQC_REVISION 7
+// Revision 8: race
+// Revision 9: race delta
+// Revision 10: scoreboard force
+#define CSQC_REVISION 9
 
 // probably put these in common/
 // so server/ and client/ can be synced better
@@ -20,6 +23,7 @@
 const float GAME_KEYHUNT		= 8;
 const float GAME_ASSAULT		= 9;
 const float GAME_ONSLAUGHT	= 10;
+const float GAME_RACE	= 11;
 
 const float AS_STRING		= 1;
 const float AS_INT		= 2;
@@ -183,6 +187,8 @@
 const float TE_CSQC_MAPVOTE = 106;
 const float TE_CSQC_CONFIG = 107;
 const float TE_CSQC_SCORESINFO = 108;
+const float TE_CSQC_RACE = 109;
+const float TE_CSQC_FORCESCOREBOARD = 110;
 
 const float STAT_KH_KEYS = 32;
 const float STAT_CTF_STATE = 33;
@@ -198,6 +204,12 @@
 const float MAPVOTE_NET_PIC = 2;
 const float MAPVOTE_NET_OWNVOTE = 3;
 
+const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
+const float RACE_NET_CHECKPOINT_CLEAR = 1;
+const float RACE_NET_CHECKPOINT_NEXT_QUALIFYING = 2; // byte nextcheckpoint, short recordtime, string recordholder
+const float RACE_NET_CHECKPOINT_HIT_RACE = 3; // byte checkpoint, short delta, byte lapsdelta, string opponent
+const float RACE_NET_CHECKPOINT_HIT_RACE_BY_OPPONENT = 4; // byte checkpoint, short delta, byte lapsdelta, string opponent
+
 /**
  * Lower scores are better (e.g. suicides)
  */
@@ -219,6 +231,14 @@
 #define SFL_RANK               32
 
 /**
+ * Display as mm:ss.s, value is stored as 10ths of a second (AND 0 is the worst possible value!)
+ */
+#define SFL_TIME               64
+
+// not an extra constant yet
+#define SFL_ZERO_IS_WORST SFL_TIME
+
+/**
  * Scoring priority (NOTE: PRIMARY is used for fraglimit)
  */
 #define SFL_SORT_PRIO_SECONDARY 4

Modified: branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -421,6 +421,8 @@
 					++spawnpoints;
 				else if(v == "info_player_deathmatch")
 					++spawnpoints;
+				else if(v == "trigger_race_checkpoint")
+					MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RACE;
 				else if(v == "weapon_nex")
 					{ }
 				else if(v == "weapon_railgun")
@@ -437,7 +439,7 @@
 	}
 	diameter = vlen(mapMaxs - mapMins);
 
-	twoBaseModes = MapInfo_Map_supportedGametypes & (MAPINFO_TYPE_CTF | MAPINFO_TYPE_ASSAULT);
+	twoBaseModes = MapInfo_Map_supportedGametypes & (MAPINFO_TYPE_CTF | MAPINFO_TYPE_ASSAULT | MAPINFO_TYPE_RACE);
 	if(twoBaseModes && (MapInfo_Map_supportedGametypes == twoBaseModes))
 	{
 		// we have a CTF-only or Assault-only map. Don't add other modes then,
@@ -508,6 +510,14 @@
 			cvar_set("fraglimit", sa);
 		s = cdr(s);
 	}
+
+	if(pWantedType == MAPINFO_TYPE_RACE)
+	{
+		sa = car(s); if(sa == "") sa = cvar_string("fraglimit");
+		if(cvar("g_race_teams"))
+			cvar_set("fraglimit", sa);
+		s = cdr(s);
+	}
 }
 
 float MapInfo_Type_FromString(string t)
@@ -522,6 +532,7 @@
 	else if(t == "kh")    return MAPINFO_TYPE_KEYHUNT;
 	else if(t == "as")    return MAPINFO_TYPE_ASSAULT;
 	else if(t == "ons")   return MAPINFO_TYPE_ONSLAUGHT;
+	else if(t == "race")  return MAPINFO_TYPE_RACE;
 	else if(t == "all")   return MAPINFO_TYPE_ALL;
 	else                  return 0;
 }
@@ -567,6 +578,7 @@
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ARENA)           fputs(fh, "type arena 10 20\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT)         fputs(fh, "type kh 1000 20 3\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT)         fputs(fh, "type as 20\n");
+		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE)            fputs(fh, "type race 5 20 15\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT)       fputs(fh, "type ons 20\n");
 
 		fh2 = fopen(strcat("scripts/", pFilename, ".arena"), FILE_READ);
@@ -727,7 +739,7 @@
 {
 	float req;
 	req = 0;
-	if(!(cvar("g_lms") || cvar("g_instagib") || cvar("g_minstagib") || cvar("g_nixnex") || cvar("g_rocketarena")))
+	if(!(cvar("g_lms") || cvar("g_instagib") || cvar("g_minstagib") || cvar("g_nixnex") || cvar("g_rocketarena") || !cvar("g_pickup_items")))
 		req |= MAPINFO_FEATURE_WEAPONS;
 	return req;
 }
@@ -752,6 +764,8 @@
 		return MAPINFO_TYPE_KEYHUNT;
 	else if(cvar("g_onslaught"))
 		return MAPINFO_TYPE_ONSLAUGHT;
+	else if(cvar("g_race"))
+		return MAPINFO_TYPE_RACE;
 	else
 		return MAPINFO_TYPE_DEATHMATCH;
 }
@@ -788,6 +802,7 @@
 	cvar_set("g_keyhunt",    (t == MAPINFO_TYPE_KEYHUNT)         ? "1" : "0");
 	cvar_set("g_assault",    (t == MAPINFO_TYPE_ASSAULT)         ? "1" : "0");
 	cvar_set("g_onslaught",  (t == MAPINFO_TYPE_ONSLAUGHT)       ? "1" : "0");
+	cvar_set("g_race",       (t == MAPINFO_TYPE_RACE)            ? "1" : "0");
 }
 
 void MapInfo_LoadMap(string s)

Modified: branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,13 +1,14 @@
-float MAPINFO_TYPE_DEATHMATCH		= 1;
-float MAPINFO_TYPE_TEAM_DEATHMATCH	= 2;
-float MAPINFO_TYPE_DOMINATION		= 4;
-float MAPINFO_TYPE_CTF				= 8;
-float MAPINFO_TYPE_RUNEMATCH		= 16;
-float MAPINFO_TYPE_LMS				= 32;
-float MAPINFO_TYPE_ARENA			= 64;
-float MAPINFO_TYPE_KEYHUNT			= 128;
-float MAPINFO_TYPE_ASSAULT			= 256;
-float MAPINFO_TYPE_ONSLAUGHT		= 512;
+float MAPINFO_TYPE_CTF				= 1;
+float MAPINFO_TYPE_ASSAULT			= 2;
+float MAPINFO_TYPE_ONSLAUGHT		= 4;
+float MAPINFO_TYPE_RACE				= 8;
+float MAPINFO_TYPE_DEATHMATCH		= 16;
+float MAPINFO_TYPE_TEAM_DEATHMATCH	= 32;
+float MAPINFO_TYPE_DOMINATION		= 64;
+float MAPINFO_TYPE_RUNEMATCH		= 128;
+float MAPINFO_TYPE_LMS				= 256;
+float MAPINFO_TYPE_ARENA			= 512;
+float MAPINFO_TYPE_KEYHUNT			= 1024;
 float MAPINFO_TYPE_ALL              = 65535; // this has to include all above bits
 
 float MAPINFO_FEATURE_WEAPONS       = 1; // not defined for minstagib-only maps

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -418,9 +418,21 @@
 	else if (g == GAME_CTF) return "ctf";
 	else if (g == GAME_RUNEMATCH) return "rune";
 	else if (g == GAME_LMS) return "lms";
+	else if (g == GAME_ARENA) return "arena";
 	else if (g == GAME_KEYHUNT) return "kh";
 	else if (g == GAME_ONSLAUGHT) return "ons";
 	else if (g == GAME_ASSAULT) return "as";
+	else if (g == GAME_RACE) return "race";
 	return "dm";
 }
 
+string mmsss(float tenths)
+{
+	float minutes;
+	string s;
+	tenths = floor(tenths + 0.5);
+	minutes = floor(tenths / 600);
+	tenths -= minutes * 600;
+	s = ftos(1000 + tenths);
+	return strcat(ftos(minutes), ":", substring(s, 1, 2), ".", substring(s, 3, 1));
+}

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -57,3 +57,4 @@
 #endif
 
 string GametypeNameFromType(float g);
+string mmsss(float t);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/classes.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -20,7 +20,9 @@
 #include "nexuiz/tab.c"
 #include "nexuiz/mainwindow.c"
 #include "nexuiz/button.c"
+#include "nexuiz/bigbutton.c"
 #include "nexuiz/commandbutton.c"
+#include "nexuiz/bigcommandbutton.c"
 #include "nexuiz/dialog_teamselect.c"
 #include "nexuiz/dialog_settings.c"
 #include "nexuiz/dialog_settings_video.c"

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/borderimage.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/borderimage.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/borderimage.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -13,6 +13,7 @@
 	ATTRIB(BorderImage, isNexposeeTitleBar, float, 0)
 	ATTRIB(BorderImage, zoomedOutTitleBarPosition, float, 0)
 	ATTRIB(BorderImage, zoomedOutTitleBar, float, 0)
+	ATTRIB(BorderImage, borderLines, float, 1)
 ENDCLASS(BorderImage)
 #endif
 
@@ -59,7 +60,7 @@
 	//print(vtos(me.borderVec), "\n");
 
 	if(me.src)
-		draw_BorderPicture('0 0 0', me.src, '1 1 0', me.color, 1, me.borderVec);
+		draw_BorderPicture('0 0 0', me.src, '1 1 0', me.color, 1, me.borderLines * me.borderVec);
 	if(me.fontSize > 0)
 	{
 		vector ro, rf;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -11,6 +11,8 @@
 	ATTRIB(Label, allowCut, float, 0)
 	ATTRIB(Label, keepspaceLeft, float, 0) // for use by subclasses (radiobuttons for example)
 	ATTRIB(Label, keepspaceRight, float, 0)
+	ATTRIB(Label, marginLeft, float, 0) // alternate way to specify keepspace* (in characters from the font)
+	ATTRIB(Label, marginRight, float, 0)
 	ATTRIB(Label, realFontSize, vector, '0 0 0')
 	ATTRIB(Label, realOrigin, vector, '0 0 0')
 	ATTRIB(Label, alpha, float, 0.7)
@@ -36,6 +38,10 @@
 	// absSize_y is height of label
 	me.realFontSize_y = me.fontSize / absSize_y;
 	me.realFontSize_x = me.fontSize / absSize_x;
+	if(me.marginLeft)
+		me.keepspaceLeft = me.marginLeft * me.realFontSize_x;
+	if(me.marginRight)
+		me.keepspaceRight = me.marginRight * me.realFontSize_x;
 	me.realOrigin_x = me.align * (1 - me.keepspaceLeft - me.keepspaceRight - min(me.realFontSize_x * draw_TextWidth(me.text, 0), (1 - me.keepspaceLeft - me.keepspaceRight))) + me.keepspaceLeft;
 	me.realOrigin_y = 0.5 * (1 - me.realFontSize_y);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/msys.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/msys.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/msys.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -106,6 +106,8 @@
 float SLIST_TEST_GREATER	= 5;
 float SLIST_TEST_GREATEREQUAL	= 6;
 float SLIST_TEST_NOTEQUAL	= 7;
+float SLIST_TEST_STARTSWITH	= 8;
+float SLIST_TEST_NOTSTARTSWITH	= 9;
 
 float SLIST_MASK_AND = 0;
 float SLIST_MASK_OR  = 512;

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigbutton.c (from rev 4119, trunk/data/qcsrc/menu/nexuiz/bigbutton.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigbutton.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigbutton.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -0,0 +1,23 @@
+#ifdef INTERFACE
+CLASS(NexuizBigButton) EXTENDS(NexuizButton)
+	METHOD(NexuizBigButton, configureNexuizBigButton, void(entity, string, vector))
+	ATTRIB(NexuizBigButton, image, string, SKINGFX_BUTTON_BIG)
+	ATTRIB(NexuizBigButton, grayImage, string, SKINGFX_BUTTON_BIG_GRAY)
+ENDCLASS(NexuizButton)
+entity makeNexuizButton(string theText, vector theColor);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizBigButton(string theText, vector theColor)
+{
+	entity me;
+	me = spawnNexuizBigButton();
+	me.configureNexuizBigButton(me, theText, theColor);
+	return me;
+}
+
+void configureNexuizBigButtonNexuizBigButton(entity me, string theText, vector theColor)
+{
+	me.configureNexuizButton(me, theText, theColor);
+}
+#endif

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigcommandbutton.c (from rev 4119, trunk/data/qcsrc/menu/nexuiz/bigcommandbutton.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigcommandbutton.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/bigcommandbutton.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -0,0 +1,23 @@
+#ifdef INTERFACE
+CLASS(NexuizBigCommandButton) EXTENDS(NexuizCommandButton)
+	METHOD(NexuizBigCommandButton, configureNexuizBigCommandButton, void(entity, string, vector, string, float))
+	ATTRIB(NexuizBigCommandButton, image, string, SKINGFX_BUTTON_BIG)
+	ATTRIB(NexuizBigCommandButton, grayImage, string, SKINGFX_BUTTON_BIG_GRAY)
+ENDCLASS(NexuizCommandButton)
+entity makeNexuizBigCommandButton(string theText, vector theColor, string theCommand, float closesMenu);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizBigCommandButton(string theText, vector theColor, string theCommand, float theFlags)
+{
+	entity me;
+	me = spawnNexuizBigCommandButton();
+	me.configureNexuizBigCommandButton(me, theText, theColor, theCommand, theFlags);
+	return me;
+}
+
+void configureNexuizBigCommandButtonNexuizBigCommandButton(entity me, string theText, vector theColor, string theCommand, float theFlags)
+{
+	me.configureNexuizCommandButton(me, theText, theColor, theCommand, theFlags);
+}
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -20,6 +20,7 @@
 	ATTRIB(NexuizDialog, titleFontSize, float, SKINFONTSIZE_TITLE) // pixels
 
 	ATTRIB(NexuizDialog, backgroundImage, string, SKINGFX_DIALOGBORDER)
+	ATTRIB(NexuizDialog, borderLines, float, SKINHEIGHT_DIALOGBORDER)
 	ATTRIB(NexuizDialog, closeButtonImage, string, SKINGFX_CLOSEBUTTON)
 	ATTRIB(NexuizDialog, zoomedOutTitleBarPosition, float, SKINHEIGHT_ZOOMEDTITLE * 0.5 - 0.5)
 	ATTRIB(NexuizDialog, zoomedOutTitleBar, float, SKINHEIGHT_ZOOMEDTITLE != 0)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -31,7 +31,7 @@
 	float n;
 
 	me.TR(me);
-		n = 9 + 1 * !!cvar("developer");
+		n = 10 + 1 * !!cvar("developer");
 		// NOTE: not using ?: due to fteqcc bug
 		// this actually means: cvar("developer") ? 10 : 9
 		me.TD(me, 2, me.columns / n, e = makeNexuizGametypeButton(1, "g_dm", "DM"));
@@ -57,6 +57,8 @@
 		}
 		me.TD(me, 2, me.columns / n, e = makeNexuizGametypeButton(1, "g_onslaught", "Onslaught"));
 			if(e.checked) e0 = NULL;
+		me.TD(me, 2, me.columns / n, e = makeNexuizGametypeButton(1, "g_race", "Race"));
+			if(e.checked) e0 = NULL;
 		if(e0)
 		{
 			//print("NO CHECK\n");

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -24,6 +24,7 @@
 	ATTRIB(NexuizMapInfoDialog, typeCTFLabel, entity, NULL)
 	ATTRIB(NexuizMapInfoDialog, typeAssaultLabel, entity, NULL)
 	ATTRIB(NexuizMapInfoDialog, typeOnslaughtLabel, entity, NULL)
+	ATTRIB(NexuizMapInfoDialog, typeRaceLabel, entity, NULL)
 
 	ATTRIB(NexuizMapInfoDialog, currentMapIndex, float, 0)
 	ATTRIB(NexuizMapInfoDialog, currentMapBSPName, string, string_null)
@@ -73,10 +74,9 @@
 	me.typeRuneLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RUNEMATCH);
 	me.typeKeyHuntLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT);
 	me.typeCTFLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTF);
-	if(me.typeAssaultLabel)
-		me.typeAssaultLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT);
-	if(me.typeOnslaughtLabel)
-		me.typeOnslaughtLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT);
+	me.typeAssaultLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT);
+	me.typeOnslaughtLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT);
+	me.typeRaceLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE);
 
 	MapInfo_ClearTemps();
 }
@@ -127,13 +127,12 @@
 		me.TD(me, 1, w/4, e = makeNexuizTextLabel(0, "CTF"));
 			me.typeCTFLabel = e;
 	me.TR(me);
-		if(cvar("developer"))
-		{
-			me.TD(me, 1, w/4, e = makeNexuizTextLabel(0, "Assault"));
-				me.typeAssaultLabel = e;
-		}
+		me.TD(me, 1, w/4, e = makeNexuizTextLabel(0, "Assault"));
+			me.typeAssaultLabel = e;
 		me.TD(me, 1, w/4, e = makeNexuizTextLabel(0, "Onslaught"));
 			me.typeOnslaughtLabel = e;
+		me.TD(me, 1, w/4, e = makeNexuizTextLabel(0, "Race"));
+			me.typeRaceLabel = e;
 
 	me.gotoRC(me, me.rows - 2, 0);
 		me.TD(me, 1, me.columns, e = makeNexuizTextLabel(0.5, ""));

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -48,9 +48,10 @@
 		me.TD(me, 1, 1, slist.sortButton2 = makeNexuizButton(string_null, '0 0 0'));
 		me.TD(me, 1, 1, slist.sortButton3 = makeNexuizButton(string_null, '0 0 0'));
 		me.TD(me, 1, 1, slist.sortButton4 = makeNexuizButton(string_null, '0 0 0'));
+		me.TD(me, 1, 1, slist.sortButton5 = makeNexuizButton(string_null, '0 0 0'));
 	me.TR(me);
 		me.TD(me, me.rows - 3, me.columns, slist);
-
+		
 	me.gotoRC(me, me.rows - 1, 0);
 		me.TD(me, 1, me.columns, e = makeNexuizButton("Join!", '0 0 0'));
 			e.onClick = ServerList_Connect_Click;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -33,15 +33,71 @@
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Music:"));
 		me.TD(me, 1, 2, s);
 	me.TR(me);
+	me.TR(me);
 		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "volume");
-		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Game:"));
+		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Master:"));
 		me.TD(me, 1, 2, s);
 	me.TR(me);
+		me.TDempty(me, 0.2);
 		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_staticvolume");
-		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Ambient:"));
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Ambient:"));
 		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
 	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_worldchannel0volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Info:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
 	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_entchannel3volume");
+		makeMulti(s, "snd_playerchannel0volume snd_playerchannel3volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Items:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_playerchannel6volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Pain:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_playerchannel7volume");
+		makeMulti(s, "snd_entchannel7volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Player:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_entchannel4volume");
+		makeMulti(s, "snd_playerchannel4volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Shots:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_playerchannel2volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Voice:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_playerchannel1volume");
+		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Weapons:"));
+		me.TD(me, 1, 2, s);
+		setDependentStringNotEqual(e, "volume", "0");
+		setDependentStringNotEqual(s, "volume", "0");
+
+	me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Frequency:"));
 		me.TD(me, 1, 2, e = makeNexuizTextSlider("snd_speed"));
 			e.addValue(e, "8 kHz", "8000");
@@ -59,8 +115,8 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 2.8, e = makeNexuizCheckBox(0, "snd_swapstereo", "Swap Stereo"));
-
-	me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
+	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_autodemo", "Demo recording"));
 	me.TR(me);
 	me.TR(me);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -55,7 +55,7 @@
 
 	me.TR(me);
 		me.TDempty(me, (me.columns - 2) / 2);
-		me.TD(me, 2, 2, e = makeNexuizButton("Instant action!", '0 0 0'));
+		me.TD(me, 2, 2, e = makeNexuizBigButton("Instant action!", '0 0 0'));
 			e.onClick = InstantAction_LoadMap;
 			e.onClickEntity = NULL;
 	me.TR(me);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -19,7 +19,7 @@
 entity makeTeamButton(string theName, vector theColor, string commandtheName)
 {
 	entity b;
-	b = makeNexuizCommandButton(theName, theColor, commandtheName, 1);
+	b = makeNexuizBigCommandButton(theName, theColor, commandtheName, 1);
 	return b;
 }
 
@@ -46,7 +46,7 @@
 		me.TD(me, 2, 1, me.team4 = makeTeamButton("pink", '1 0.5 1', "cmd selectteam pink; cmd join"));
 	me.TR(me);
 	me.TR(me);
-		me.TD(me, 1, 4, makeTeamButton("spectate", '0 0 0', "cmd spectate"));
+		me.TD(me, 1, 4, makeNexuizCommandButton("spectate", '0 0 0', "cmd spectate", 1));
 }
 #endif
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/gametypebutton.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/gametypebutton.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/gametypebutton.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -3,7 +3,7 @@
 	METHOD(NexuizGametypeButton, configureNexuizGametypeButton, void(entity, float, string, string))
 	METHOD(NexuizGametypeButton, setChecked, void(entity, float))
 	ATTRIB(NexuizGametypeButton, fontSize, float, SKINFONTSIZE_NORMAL)
-	ATTRIB(NexuizGametypeButton, image, string, SKINGFX_BUTTON)
+	ATTRIB(NexuizGametypeButton, image, string, SKINGFX_BUTTON_BIG)
 	ATTRIB(NexuizGametypeButton, color, vector, SKINCOLOR_BUTTON_N)
 	ATTRIB(NexuizGametypeButton, colorC, vector, SKINCOLOR_BUTTON_C)
 	ATTRIB(NexuizGametypeButton, colorF, vector, SKINCOLOR_BUTTON_F)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/inputbox.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/inputbox.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/inputbox.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -7,8 +7,8 @@
 	ATTRIB(NexuizInputBox, image, string, SKINGFX_INPUTBOX)
 	ATTRIB(NexuizInputBox, onChange, void(entity, entity), SUB_Null)
 	ATTRIB(NexuizInputBox, onChangeEntity, entity, NULL)
-	ATTRIB(NexuizInputBox, keepspaceLeft, float, SKINMARGIN_INPUTBOX)
-	ATTRIB(NexuizInputBox, keepspaceRight, float, SKINMARGIN_INPUTBOX)
+	ATTRIB(NexuizInputBox, marginLeft, float, SKINMARGIN_INPUTBOX_CHARS)
+	ATTRIB(NexuizInputBox, marginRight, float, SKINMARGIN_INPUTBOX_CHARS)
 	ATTRIB(NexuizInputBox, color, vector, SKINCOLOR_INPUTBOX_N)
 	ATTRIB(NexuizInputBox, colorF, vector, SKINCOLOR_INPUTBOX_F)
 
@@ -17,6 +17,7 @@
 	ATTRIB(NexuizInputBox, cvarName, string, string_null)
 	METHOD(NexuizInputBox, loadCvars, void(entity))
 	METHOD(NexuizInputBox, saveCvars, void(entity))
+	METHOD(NexuizInputBox, keyDown, float(entity, float, float, float))
 ENDCLASS(NexuizInputBox)
 entity makeNexuizInputBox(float, string);
 #endif
@@ -63,4 +64,18 @@
 {
 	cvar_set(me.cvarName, me.text);
 }
+float keyDownNexuizInputBox(entity me, float key, float ascii, float shift)
+{
+	float r;
+	r = 0;
+	if(key == K_ENTER)
+		if(me.cvarName)
+		{
+			me.saveCvars(me);
+			r = 1;
+		}
+	if(keyDownInputBox(me, key, ascii, shift))
+		r = 1;
+	return r;
+}
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2008-08-12 12:20:43 UTC (rev 4120)
@@ -16,6 +16,8 @@
 	ATTRIB(NexuizServerList, columnNameSize, float, 0)
 	ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
 	ATTRIB(NexuizServerList, columnMapSize, float, 0)
+	ATTRIB(NexuizServerList, columnTypeOrigin, float, 0)
+	ATTRIB(NexuizServerList, columnTypeSize, float, 0)
 	ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
 	ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
 
@@ -35,6 +37,7 @@
 	ATTRIB(NexuizServerList, sortButton2, entity, NULL)
 	ATTRIB(NexuizServerList, sortButton3, entity, NULL)
 	ATTRIB(NexuizServerList, sortButton4, entity, NULL)
+	ATTRIB(NexuizServerList, sortButton5, entity, NULL)
 	ATTRIB(NexuizServerList, connectButton, entity, NULL)
 	ATTRIB(NexuizServerList, currentSortOrder, float, 0)
 	ATTRIB(NexuizServerList, currentSortField, float, -1)
@@ -61,6 +64,8 @@
 float SLIST_FIELD_NUMBOTS;
 float SLIST_FIELD_PROTOCOL;
 float SLIST_FIELD_FREESLOTS;
+float SLIST_FIELD_PLAYERS;
+float SLIST_FIELD_QCSTATUS;
 void ServerList_UpdateFieldIDs()
 {
 	SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
@@ -75,6 +80,8 @@
 	SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
 	SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
 	SLIST_FIELD_FREESLOTS = gethostcacheindexforkey( "freeslots" );
+	SLIST_FIELD_PLAYERS = gethostcacheindexforkey( "players" );
+	SLIST_FIELD_QCSTATUS = gethostcacheindexforkey( "qcstatus" );
 }
 
 entity makeNexuizServerList()
@@ -124,17 +131,35 @@
 	else */
 	{
 		float m;
+		string s, typestr;
+		s = me.filterString;
+
+		m = strstrofs(s, ":", 0);
+		if(m >= 0)
+		{
+			typestr = substring(s, 0, m);
+			s = substring(s, m + 1, strlen(s) - m - 1);
+			while(substring(s, 0, 1) == " ")
+				s = substring(s, 1, strlen(s) - 1);
+		}
+		else
+			typestr = "";
+
 		m = SLIST_MASK_AND - 1;
 		resethostcachemasks();
 		if(!me.filterShowFull)
 			sethostcachemasknumber(++m, SLIST_FIELD_FREESLOTS, 1, SLIST_TEST_GREATEREQUAL);
 		if(!me.filterShowEmpty)
 			sethostcachemasknumber(++m, SLIST_FIELD_NUMHUMANS, 1, SLIST_TEST_GREATEREQUAL);
+		if(typestr != "")
+			sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(typestr, ":"), SLIST_TEST_STARTSWITH);
 		m = SLIST_MASK_OR - 1;
-		if(me.filterString)
+		if(s != "")
 		{
-			sethostcachemaskstring(++m, SLIST_FIELD_NAME, me.filterString, SLIST_TEST_CONTAINS);
-			sethostcachemaskstring(++m, SLIST_FIELD_MAP, me.filterString, SLIST_TEST_CONTAINS);
+			sethostcachemaskstring(++m, SLIST_FIELD_NAME, s, SLIST_TEST_CONTAINS);
+			sethostcachemaskstring(++m, SLIST_FIELD_MAP, s, SLIST_TEST_CONTAINS);
+			sethostcachemaskstring(++m, SLIST_FIELD_PLAYERS, s, SLIST_TEST_CONTAINS);
+			sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(s, ":"), SLIST_TEST_STARTSWITH);
 		}
 		sethostcachesort(me.currentSortField, me.currentSortOrder < 0);
 		resorthostcache();
@@ -217,6 +242,52 @@
 {
 	me.setSortOrder(me, SLIST_FIELD_NUMHUMANS, -1);
 }
+void ServerList_TypeSort_Click(entity btn, entity me)
+{
+	string s, t;
+	float i, m;
+	s = me.filterString;
+	m = strstrofs(s, ":", 0);
+	if(m >= 0)
+	{
+		s = substring(s, 0, m);
+		while(substring(s, m+1, 1) == " ") // skip spaces
+			++m;
+	}
+	else
+		s = "";
+
+	for(i = 1; ; ++i) // 20 modes ought to be enough for anyone
+	{
+		t = GametypeNameFromType(i);
+		if(i > 1)
+			if(t == GametypeNameFromType(0)) // it repeats (default case)
+			{
+				// no type was found
+				// choose the first one
+				s = t;
+				break;
+			}
+		if(s == GametypeNameFromType(i))
+		{
+			// the type was found
+			// choose the next one
+			s = GametypeNameFromType(i + 1);
+			if(s == GametypeNameFromType(0))
+				s = "";
+			break;
+		}
+	}
+
+	if(s != "")
+		s = strcat(s, ":");
+	s = strcat(s, substring(me.filterString, m+1, strlen(me.filterString) - m - 1));
+
+	me.controlledTextbox.setText(me.controlledTextbox, s);
+	me.controlledTextbox.keyDown(me.controlledTextbox, K_END, 0, 0);
+	me.controlledTextbox.keyUp(me.controlledTextbox, K_END, 0, 0);
+	//ServerList_Filter_Change(me.controlledTextbox, me);
+}
 void ServerList_Filter_Change(entity box, entity me)
 {
 	if(me.filterString)
@@ -246,7 +317,8 @@
 	me.sortButton1.forcePressed = (field == SLIST_FIELD_PING);
 	me.sortButton2.forcePressed = (field == SLIST_FIELD_NAME);
 	me.sortButton3.forcePressed = (field == SLIST_FIELD_MAP);
-	me.sortButton4.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
+	me.sortButton4.forcePressed = 0;
+	me.sortButton5.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
 	me.selectedItem = 0;
 	if(me.selectedServer)
 		strunzone(me.selectedServer);
@@ -281,16 +353,19 @@
 	me.columnPingOrigin = 0;
 	me.columnPingSize = me.realFontSize_x * 4;
 	me.columnMapSize = me.realFontSize_x * 12;
+	me.columnTypeSize = me.realFontSize_x * 4;
 	me.columnPlayersSize = me.realFontSize_x * 6;
-	me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - 3 * me.realFontSize_x;
+	me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - me.columnTypeSize - 4 * me.realFontSize_x;
 	me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
 	me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
-	me.columnPlayersOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
+	me.columnTypeOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
+	me.columnPlayersOrigin = me.columnTypeOrigin + me.columnTypeSize + me.realFontSize_x;
 
 	me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, "Ping", ServerList_PingSort_Click);
 	me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, "Host name", ServerList_NameSort_Click);
 	me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, "Map", ServerList_MapSort_Click);
-	me.positionSortButton(me, me.sortButton4, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
+	me.positionSortButton(me, me.sortButton4, me.columnTypeOrigin, me.columnTypeSize, "Type", ServerList_TypeSort_Click);
+	me.positionSortButton(me, me.sortButton5, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
 
 	float f;
 	f = me.currentSortField;
@@ -352,13 +427,21 @@
 		theColor = eX;
 		theAlpha *= SKINALPHA_SERVERLIST_HIGHPING;
 	}
-	
+
 	s = ftos(p);
 	draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s, 0) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 	s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x, 0);
 	draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
 	s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x, 0);
 	draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
+	s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
+	p = strstrofs(s, ":", 0);
+	if(p >= 0)
+		s = substring(s, 0, p);
+	else
+		s = "";
+	s = draw_TextShortenToWidth(s, me.columnMapSize / me.realFontSize_x, 0);
+	draw_Text(me.realUpperMargin * eY + (me.columnTypeOrigin + (me.columnTypeSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 	s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
 	draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -26,6 +26,28 @@
 	forAllDescendants(root, loadCvarsOf, SUB_Null_ee, NULL);
 }
 
+.string cvarNames_Multi;
+.void(entity me) saveCvars_Multi;
+void saveCvarsMulti(entity me)
+{
+	float n, i;
+	string s;
+
+	me.saveCvars_Multi(me);
+	s = cvar_string(me.cvarName);
+
+	n = tokenize(me.cvarNames_Multi);
+	for(i = 0; i < n; ++i)
+		cvar_set(argv(i), s);
+}
+
+void makeMulti(entity e, string otherCvars)
+{
+	e.cvarNames_Multi = otherCvars;
+	e.saveCvars_Multi = e.saveCvars;
+	e.saveCvars = saveCvarsMulti;
+}
+
 .void(entity) draw_setDependent;
 .string cvar_setDependent;
 .float cvarMin_setDependent;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -2,6 +2,8 @@
 void saveAllCvars(entity root);
 void loadAllCvars(entity root);
 
+void makeMulti(entity me, string otherCvars);
+
 void setDependent(entity e, string theCvarName, float theCvarMin, float theCvarMax);
 void setDependentAND(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max);
 void setDependentOR(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -73,6 +73,8 @@
 	// item: button
 	SKINSTRING(GFX_BUTTON, "button");
 	SKINSTRING(GFX_BUTTON_GRAY, "buttongray");
+	SKINSTRING(GFX_BUTTON_BIG, "bigbutton");
+	SKINSTRING(GFX_BUTTON_BIG_GRAY, "bigbuttongray");
 	SKINVECTOR(COLOR_BUTTON_N, '1 1 1');
 	SKINVECTOR(COLOR_BUTTON_C, '1 1 1');
 	SKINVECTOR(COLOR_BUTTON_F, '1 1 1');
@@ -116,12 +118,13 @@
 	SKINFLOAT(MARGIN_RIGHT, 8);
 	SKINFLOAT(MARGIN_COLUMNS, 4);
 	SKINFLOAT(MARGIN_ROWS, 4);
+	SKINFLOAT(HEIGHT_DIALOGBORDER, 1);
 
 	// item: input box
 	SKINSTRING(GFX_INPUTBOX, "inputbox");
 	SKINVECTOR(COLOR_INPUTBOX_N, '1 1 1');
 	SKINVECTOR(COLOR_INPUTBOX_F, '1 1 1');
-	SKINFLOAT(MARGIN_INPUTBOX, 0.02);
+	SKINFLOAT(MARGIN_INPUTBOX_CHARS, 1);
 
 	// item: key grabber
 	SKINVECTOR(COLOR_KEYGRABBER_TITLES, '1 1 1');

Modified: branches/nexuiz-2.0/data/qcsrc/server/arena.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -28,10 +28,12 @@
 	if(g_arena)
 	if(cvar("g_arena_warmup"))
 		warmup = time + cvar("g_arena_warmup");
-	
+
 	lms_lowest_lives = 999;
 	lms_next_place = player_count;
 
+	race_ReadyRestart();
+	
 	self = nextent(world);
 	while(self)
 	{
@@ -79,7 +81,7 @@
 		}
 		else if(self.flags & FL_PROJECTILE)		// remove any projectiles left
 		{
-			sound(self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM);
+			sound(self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 			remove(self);
 		}
 		else if(self.isdecor)
@@ -148,6 +150,8 @@
 	if(g_arena)
 	if(champion)
 		UpdateFrags(champion, +1);
+
+	Score_ClearAll();
 }
 
 void Spawnqueue_Insert(entity e)

Modified: branches/nexuiz-2.0/data/qcsrc/server/bots.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1240,6 +1240,7 @@
 		e.nearestwaypointtimeout = time + random() * 3 + 5;
 	}
 	//dprint(e.classname, " ", ftos(f));
+	//dprint("-- checking ", e.classname, " (with cost ", ftos(e.nearestwaypoint.wpcost), ")\n");
 	if (e.nearestwaypoint)
 	if (e.nearestwaypoint.wpcost < 10000000)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/campaign.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/campaign.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/campaign.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -81,8 +81,6 @@
 	{
 		while((l = fgets(fh)))
 		{
-			cvarname = strcat1(cvarname);
-			contents = strcat1(contents);
 			len = tokenize(l);
 			if(len != 3)
 				continue;

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -43,16 +43,45 @@
 	if(spot.team != teamcheck)
 		return -1;
 
+	if(race_spawns)
+		if(spot.target == "")
+			return -1;
+
 	// filter out spots for assault
 	if(spot.target != "") {
 		local entity ent;
+		float good;
 		ent = find(world, targetname, spot.target);
 		while(ent) {
 			if(ent.classname == "target_objective")
+			{
 				if(ent.health < 0 || ent.health >= ASSAULT_VALUE_INACTIVE)
 					return -1;
+				good = 1;
+			}
+			else if(ent.classname == "trigger_race_checkpoint")
+			{
+				if(self.classname == "player") // spectators may spawn everywhere
+				{
+					if(ent.race_checkpoint != race_PreviousCheckpoint(self.race_checkpoint))
+						return -1;
+					float pl;
+					pl = self.race_place;
+					if(pl > race_highest_place_spawn)
+						pl = 0;
+					if(spot.race_place != pl)
+						return -1;
+				}
+				good = 1;
+			}
+			else
+			{
+			}
 			ent = find(ent, targetname, spot.target);
 		}
+
+		if(!good)
+			return -1;
 	}
 
 	player = playerlist;
@@ -354,6 +383,9 @@
 void PutObserverInServer (void)
 {
 	entity	spot;
+
+	race_PreSpawnObserver();
+
 	spot = SelectSpawnPoint (TRUE);
 	if(!spot)
 		error("No spawnpoints for observers?!?\n");
@@ -446,15 +478,14 @@
 
 	if(g_arena)
 	{
-		if(self.frags != -2)
+		if(self.version_mismatch)
 		{
-			Spawnqueue_Insert(self);
-			// FIXME what IS this?
+			Spawnqueue_Unmark(self);
+			Spawnqueue_Remove(self);
 		}
 		else
 		{
-			Spawnqueue_Unmark(self);
-			Spawnqueue_Remove(self);
+			Spawnqueue_Insert(self);
 		}
 	}
 	else if(g_lms)
@@ -568,6 +599,8 @@
 	if(self.classname == "player") {
 		entity	spot;
 
+		race_PreSpawn();
+
 		spot = SelectSpawnPoint (FALSE);
 		if(!spot)
 		{
@@ -581,6 +614,8 @@
 		self.iscreature = TRUE;
 		self.movetype = MOVETYPE_WALK;
 		self.solid = SOLID_SLIDEBOX;
+		if(independent_players)
+			MAKE_INDEPENDENT_PLAYER(self);
 		self.flags = FL_CLIENT;
 		self.takedamage = DAMAGE_AIM;
 		if(g_minstagib)
@@ -692,6 +727,8 @@
 		self.lms_traveled_distance = 0;
 		self.speedrunning = FALSE;
 
+		race_PostSpawn(spot);
+
 		if(cvar("spawn_debug"))
 		{
 			sprint(self, strcat("spawnpoint origin:  ", vtos(spot.origin), "\n"));
@@ -702,7 +739,7 @@
 	 	//stuffcmd(self, "set viewsize $tmpviewsize \n");
 
 		if (cvar("g_spawnsound"))
-			sound (self, CHAN_AUTO, "misc/spawn.wav", 1, ATTN_NORM);
+			sound (self, CHAN_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
 
 		if(g_assault) {
 			if(self.team == assault_attacker_team)
@@ -830,7 +867,7 @@
 		if(clienttype(self.owner) == CLIENTTYPE_REAL)
 		{
 			if(self.cnt <= 10)
-				play2(self.owner, strcat("announcer/robotic/", ftos(self.cnt), ".ogg"));
+				announce(self.owner, strcat("announcer/robotic/", ftos(self.cnt), ".ogg"));
 			if(self.owner.killindicator_teamchange)
 			{
 				if(self.owner.killindicator_teamchange == -1)
@@ -1022,6 +1059,8 @@
 
 	bot_clientconnect();
 
+	race_PreSpawnObserver();
+
 	//if(g_domination)
 	//	dom_player_join_team(self);
 
@@ -1175,6 +1214,7 @@
 void(entity e) DropFlag;
 .entity chatbubbleentity;
 .entity teambubbleentity;
+void ReadyCount();
 //void() ctf_clientdisconnect;
 void ClientDisconnect (void)
 {
@@ -1253,6 +1293,8 @@
 	// free cvars
 	GetCvars(-1);
 	self.playerid = 0;
+
+	ReadyCount();
 }
 
 .float BUTTON_CHAT;
@@ -1696,7 +1738,7 @@
 		{
 			self.respawn_countdown = number - 1;
 			if(ceil(self.death_time - (time + 0.5)) == number) // only say it if it is the same number even in 0.5s; to prevent overlapping sounds
-				play2(self, strcat("announcer/robotic/", ftos(number), ".ogg"));
+				announce(self, strcat("announcer/robotic/", ftos(number), ".ogg"));
 		}
 	}
 }
@@ -1808,12 +1850,12 @@
 void ObserverThink()
 {
 	if (self.flags & FL_JUMPRELEASED) {
-		if (self.BUTTON_JUMP && self.version == cvar("gameversion")) {
+		if (self.BUTTON_JUMP && !self.version_mismatch) {
 			self.welcomemessage_time = 0;
 			self.flags = self.flags - FL_JUMPRELEASED;
 			LeaveSpectatorMode();
 			return;
-		} else if(self.BUTTON_ATCK && self.version == cvar("gameversion")) {
+		} else if(self.BUTTON_ATCK && !self.version_mismatch) {
 			self.welcomemessage_time = 0;
 			self.flags = self.flags - FL_JUMPRELEASED;
 			if(SpectateNext() == 1) {
@@ -1834,7 +1876,7 @@
 void SpectatorThink()
 {
 	if (self.flags & FL_JUMPRELEASED) {
-		if (self.BUTTON_JUMP && self.version == cvar("gameversion")) {
+		if (self.BUTTON_JUMP && !self.version_mismatch) {
 			self.welcomemessage_time = 0;
 			self.flags = self.flags - FL_JUMPRELEASED;
 			LeaveSpectatorMode();
@@ -2156,6 +2198,8 @@
 =============
 */
 .float idlekick_lasttimeleft;
+.float race_penalty;
+.float race_penalty_nagged;
 void PlayerPostThink (void)
 {
 	// Savage: Check for nameless players
@@ -2171,7 +2215,7 @@
 		if(timeleft <= 0)
 		{
 			bprint("^3", self.netname, "^3 was kicked for idling.\n");
-			play2(self, "announcer/robotic/terminated.ogg");
+			announce(self, "announcer/robotic/terminated.ogg");
 			dropclient(self);
 			return;
 		}
@@ -2180,7 +2224,7 @@
 			if(timeleft != self.idlekick_lasttimeleft)
 			{
 				centerprint_atprio(self, CENTERPRIO_IDLEKICK, strcat("^3Stop idling!\n^3Disconnecting in ", ftos(timeleft), "..."));
-				play2(self, strcat("announcer/robotic/", ftos(timeleft), ".ogg"));
+				announce(self, strcat("announcer/robotic/", ftos(timeleft), ".ogg"));
 			}
 		}
 		else
@@ -2207,12 +2251,35 @@
 			if(time < restart_countdown) {
 				if (!cvar("sv_ready_restart_after_countdown"))
 				{
+					if(self.movement != '0 0 0' && g_race && !g_race_qualifying)
+					{
+						if(time < restart_countdown - 2)
+						{
+							if(!self.race_penalty_nagged)
+							{
+								centerprint_atprio(self, CENTERPRIO_IDLEKICK, "^1DO NOT MOVE DURING THE COUNTDOWN.");
+								self.race_penalty_nagged = 1;
+							}
+						}
+						else if(!self.race_penalty)
+						{
+							centerprint_atprio(self, CENTERPRIO_IDLEKICK, "^1FIVE SECONDS PENALTY.");
+							self.race_penalty = time + 5;
+						}
+					}
 					self.movetype = MOVETYPE_NONE;		
 					self.velocity = '0 0 0';
 					self.avelocity = '0 0 0';
 					self.movement = '0 0 0';
 				}
 			}
+			else if (time < self.race_penalty)
+			{
+				self.movetype = MOVETYPE_NONE;		
+				self.velocity = '0 0 0';
+				self.avelocity = '0 0 0';
+				self.movement = '0 0 0';
+			}
 			else
 			{
 				//allow the player to move again if sv_ready_restart_after_countdown is not used and countdown is over
@@ -2222,6 +2289,8 @@
 					{
 						self.movetype = MOVETYPE_WALK;
 					}
+					self.race_penalty = 0;
+					self.race_penalty_nagged = 0;
 				}
 			}
 		}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -13,6 +13,7 @@
 .float swamp_slowdown;
 .float lastflags;
 .float lastground;
+.float wasFlying;
 
 #define SHTEST_DELTA 15
 .float shtest_next;
@@ -82,7 +83,7 @@
 		player_setanim(self.anim_jump, FALSE, TRUE, TRUE);
 
 	if(g_jump_grunt)
-		PlayerSound(playersound_jump, CHAN_AUTO, 0);
+		PlayerSound(playersound_jump, CHAN_PLAYER, 0);
 }
 
 void CheckWaterJump()
@@ -234,7 +235,13 @@
 	}
 
 	if(self.flags & FL_ONGROUND)
-		if not(self.lastflags & FL_ONGROUND)
+	if(self.wasFlying)
+	{
+		self.wasFlying = 0;
+
+		if(self.waterlevel < 2)
+		if(time >= self.ladder_time)
+		if not(self.hook)
 		{
 			self.nextstep = time + 0.3 + random() * 0.1;
 			trace_dphitq3surfaceflags = 0;
@@ -242,12 +249,16 @@
 			if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
 			{
 				if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-					GlobalSound(globalsound_metalfall, CHAN_AUTO, 0);
+					GlobalSound(globalsound_metalfall, CHAN_PLAYER, 0);
 				else
-					GlobalSound(globalsound_fall, CHAN_AUTO, 0);
+					GlobalSound(globalsound_fall, CHAN_PLAYER, 0);
 			}
 		}
+	}
 
+	if(IsFlying(self))
+		self.wasFlying = 1;
+
 	if(self.classname == "player")
 	{
 		if(sv_doublejump)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -267,11 +267,11 @@
 	take = bound(0, damage - save, damage);
 
 	if (save > 10)
-		sound (self, CHAN_IMPACT, "misc/armorimpact.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
 	else if (take > 30)
-		sound (self, CHAN_IMPACT, "misc/bodyimpact2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
 	else if (take > 10)
-		sound (self, CHAN_IMPACT, "misc/bodyimpact1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
 
 	if(sv_gentle < 1) {	
 		if (take > 50)
@@ -344,7 +344,7 @@
 				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
 				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
 			}
-			sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PLAYER, "misc/gib.wav", VOL_BASE, ATTN_NORM);
 		}
 	}
 }
@@ -354,7 +354,6 @@
 void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
 	local float take, save, waves, sdelay;
-	float painsequence;
 
 	damage = damage * bound(1.0, self.cvar_cl_handicap, 100.0);
 	if(sv_gentle > 0) {
@@ -379,11 +378,11 @@
 	}
 
 	if (save > 10)
-		sound (self, CHAN_IMPACT, "misc/armorimpact.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
 	else if (take > 30)
-		sound (self, CHAN_IMPACT, "misc/bodyimpact2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
 	else if (take > 10)
-		sound (self, CHAN_IMPACT, "misc/bodyimpact1.wav", 1, ATTN_NORM); // FIXME possibly remove them?
+		sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
 
 	if (take > 50)
 		TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
@@ -413,13 +412,13 @@
 					// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
 					{
 						if(self.health > 75) // TODO make a "gentle" version?
-							PlayerSound(playersound_pain100, CHAN_AUTO, 0);
+							PlayerSound(playersound_pain100, CHAN_PAIN, 0);
 						else if(self.health > 50)
-							PlayerSound(playersound_pain75, CHAN_AUTO, 0);
+							PlayerSound(playersound_pain75, CHAN_PAIN, 0);
 						else if(self.health > 25)
-							PlayerSound(playersound_pain50, CHAN_AUTO, 0);
+							PlayerSound(playersound_pain50, CHAN_PAIN, 0);
 						else if(self.health > 1)
-							PlayerSound(playersound_pain25, CHAN_AUTO, 0);
+							PlayerSound(playersound_pain25, CHAN_PAIN, 0);
 					}
 				}
 
@@ -464,9 +463,9 @@
 		if(sv_gentle < 1) // TODO make a "gentle" version?
 		{
 			if(deathtype == DEATH_DROWN)
-				PlayerSound(playersound_drown, CHAN_AUTO, 0);
+				PlayerSound(playersound_drown, CHAN_PAIN, 0);
 			else
-				PlayerSound(playersound_death, CHAN_AUTO, 0);
+				PlayerSound(playersound_death, CHAN_PAIN, 0);
 		}
 
 		// get rid of kill indicator
@@ -732,26 +731,6 @@
 		self.last_selected_player = self.selected_player;
 }
 
-float precache_sound_index (string s) = #19;
-void soundto(entity e, entity sounddest, float chan, string samp, float vol, float atten)
-{
-	vector o;
-	if(clienttype(sounddest) != CLIENTTYPE_REAL)
-		return;
-	o = e.origin + 0.5 * (e.mins + e.maxs);
-	msg_entity = sounddest;
-	WriteByte(MSG_ONE, 6);
-	WriteByte(MSG_ONE, 27); // all bits except SND_LOOPING
-	WriteByte(MSG_ONE, vol * 255);
-	WriteByte(MSG_ONE, atten * 64);
-	WriteEntity(MSG_ONE, e);
-	WriteByte(MSG_ONE, chan);
-	WriteShort(MSG_ONE, precache_sound_index(samp));
-	WriteCoord(MSG_ONE, o_x);
-	WriteCoord(MSG_ONE, o_y);
-	WriteCoord(MSG_ONE, o_z);
-}
-
 float GetVoiceMessageTeamsayType(string type)
 {
 	if(type == "taunt")
@@ -882,7 +861,7 @@
 			field = GetVoiceMessageSampleField(argv(0));
 		if(GetPlayerSoundSampleField_notFound)
 			continue;
-		if not(GetPlayerSoundSampleField_fixed)
+		if(GetPlayerSoundSampleField_fixed)
 			if not(first)
 				continue;
 		if(self.field)
@@ -923,21 +902,33 @@
 			if(self.pusher)
 				if(self.pusher.team == self.team)
 				{
-					soundto(self, self.pusher, chan, sample, 1, ATTN_NONE);
-					soundto(self, self, chan, sample, 1, ATTN_NONE);
+					msg_entity = self.pusher;
+					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+					msg_entity = self;
+					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
 				}
 	}
 	else if(teamsay == 0) // to everyone
 	{
 		// broadcast the sound, but it's directional
-		sound(self, chan, sample, 1, ATTN_NORM);
+		sound(self, chan, sample, VOL_BASE, ATTN_NORM);
 	}
 	else if(teamsay == 1) // to the same team
 	{
-		entity e;
-		FOR_EACH_REALCLIENT(e)
-			if(!teams_matter || e.team == self.team)
-				soundto(self, e, chan, sample, 1, ATTN_NONE);
+		if(teams_matter)
+		{
+			entity e;
+			FOR_EACH_REALCLIENT(e)
+				if(!teams_matter || e.team == self.team)
+				{
+					msg_entity = e;
+					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+				}
+		}
+		else
+		{
+			sound(self, chan, sample, VOL_BASE, ATTN_NONE);
+		}
 	}
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -252,7 +252,7 @@
 		}
 		else if (self.weaponentity.state == WS_READY)
 		{
-			sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);
+			sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
 			self.weaponentity.state = WS_DROP;
 			// set up weapon switch think in the future, and start drop anim
 			weapon_thinkf(WFRAME_IDLE, cvar("g_balance_weaponswitchdelay"), w_clear);

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -119,11 +119,11 @@
 		self.punchangle_x = recoil * -1;
 
 	if (snd != "")
-		sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM);
+		sound (self, CHAN_WEAPON, snd, VOL_BASE, ATTN_NORM);
 
 	if (self.items & IT_STRENGTH)
 	if (!g_minstagib)
-		sound (self, CHAN_AUTO, "weapons/strength_fire.wav", 1, ATTN_NORM);
+		sound (self, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
 };
 
 void LaserTarget_Think()
@@ -422,12 +422,13 @@
 };
 
 // perform weapon to attack (weaponstate and attack_finished check is here)
+.float race_penalty;
 float weapon_prepareattack(float secondary, float attacktime)
 {
 	//if sv_ready_restart_after_countdown is set, don't allow the player to shoot
 	//if all players readied up and the countdown is running
 	if (cvar("sv_ready_restart_after_countdown"))
-		if(time < restart_countdown) {
+		if(time < restart_countdown || time < self.race_penalty) {
 			return FALSE;
 		}
 	

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -197,7 +197,7 @@
 		if(self.version != cvar("gameversion"))
 		{
 			self.classname = "observer";
-			self.frags = -2;
+			self.version_mismatch = 1;
 			PutClientInServer();
 		} else if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force")) {
 			//JoinBestTeam(self, FALSE, TRUE);
@@ -378,44 +378,14 @@
 	}
 }
 
-/**
- * Counts how many players are ready. If not enough players are ready, the function
- * does nothing. If all players are ready, the timelimit will be extended and the
- * restart_countdown variable is set to allow other functions like PlayerPostThink
- * to detect that the countdown is now active. If the cvar sv_ready_restart_after_countdown
- * is not set the map will be resetted.
- * 
- * Function is called after the server receives a 'ready' sign from a player.
- */
-void ReadyCount()
+void ReadyRestart()
 {
 	local entity e;
-	local float r, p;
 
-	FOR_EACH_REALPLAYER(e)
-	{
-		p += 1;
-		if(e.ready)
-			r += 1;
-	}
-
-	if(cvar("sv_ready_restart_nag")) {
-		if(!readyNagActive) {
-			readyNagger = spawn();
-			readyNagger.think = readyNagger_Think;
-			readyNagger.cnt = cvar("sv_ready_restart_nag_duration");
-			readyNagger.nextthink = time;
-			readyNagActive = 1;
-		}
-	}
-
-	if(!p || r < p)
-		return;
-
 	bprint("^1Server is restarting...\n");
 
 	// no arena, assault support yet...
-	if(g_arena | g_assault | gameover | intermission_running)
+	if(g_arena | g_assault | gameover | intermission_running | race_completing)
 		localcmd("restart\n");
 
 	if(readyNagActive) { //if every player is ready, remove the ready-nagger again
@@ -435,7 +405,6 @@
 		start_health = cvar("g_balance_health_start");
 		start_armorvalue = cvar("g_balance_armor_start");
 	}
-
 	restart_countdown = time + RESTART_COUNTDOWN;
 	restart_mapalreadyrestarted = 0; //reset this var, needed when cvar sv_ready_restart_repeatable is in use
 	//reset the .ready status of all players (also spectators)
@@ -452,6 +421,7 @@
 		if(timelimit_orig)
 			cvar_set("timelimit", ftos(timelimit_orig + ceil(restart_countdown)/60));
 	}
+
 	if(cvar("teamplay_lockonrestart") && teams_matter) {
 		lockteams = 1;
 		bprint("^1The teams are now locked.\n");
@@ -473,20 +443,54 @@
 	}
 
 	//play the prepareforbattle sound to everyone
-	sound(world, CHAN_AUTO, "announcer/robotic/prepareforbattle.wav", 1, ATTN_NONE);
+	play2all("announcer/robotic/prepareforbattle.wav");
 
 	//reset map immediately if this cvar is not set
 	if (!cvar("sv_ready_restart_after_countdown"))
-	{
 		reset_map();
-		Score_ClearAll();
-	}
 	
 	if(cvar("sv_eventlog"))
 		GameLogEcho(":restart", FALSE);
 }
 
 /**
+ * Counts how many players are ready. If not enough players are ready, the function
+ * does nothing. If all players are ready, the timelimit will be extended and the
+ * restart_countdown variable is set to allow other functions like PlayerPostThink
+ * to detect that the countdown is now active. If the cvar sv_ready_restart_after_countdown
+ * is not set the map will be resetted.
+ * 
+ * Function is called after the server receives a 'ready' sign from a player.
+ */
+void ReadyCount()
+{
+	local entity e;
+	local float r, p;
+
+	FOR_EACH_REALPLAYER(e)
+	{
+		p += 1;
+		if(e.ready)
+			r += 1;
+	}
+
+	if(cvar("sv_ready_restart_nag")) {
+		if(!readyNagActive) {
+			readyNagger = spawn();
+			readyNagger.think = readyNagger_Think;
+			readyNagger.cnt = cvar("sv_ready_restart_nag_duration");
+			readyNagger.nextthink = time;
+			readyNagActive = 1;
+		}
+	}
+
+	if(!p || r < p)
+		return;
+	
+	ReadyRestart();
+}
+
+/**
  * Centerprints the information to all players who didn't ready up yet to do so.
  */
 void readyNagger_Think() {
@@ -541,7 +545,7 @@
 				centerprint(plr, s);
 			}
 		}
-		sound(world, CHAN_AUTO, "announcer/robotic/begin.wav", 1, ATTN_NONE);
+		play2all("announcer/robotic/begin.wav");
 
 		remove(self);
 		return;
@@ -555,7 +559,7 @@
 		}
 
 		if(self.cnt <= 3) {
-			sound(world, CHAN_AUTO, strcat("announcer/robotic/", ftos(self.cnt), ".ogg"), 1, ATTN_NONE);
+			play2all(strcat("announcer/robotic/", ftos(self.cnt), ".ogg"));
 		}
 		self.nextthink = time + 1;
 		self.cnt -= 1;
@@ -612,7 +616,7 @@
 	timeoutHandler.nextthink = time; //always let the entity think asap
 
 	//inform all connected clients about the timeout call
-	sound(world, CHAN_AUTO, "announcer/robotic/timeoutcalled.wav", 1, ATTN_NONE);
+	play2all("announcer/robotic/timeoutcalled.wav");
 }
 
 /**

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -106,12 +106,13 @@
 float	TE_LAVASPLASH				= 10;
 float	TE_TELEPORT				= 11;
 
-float	CHAN_AUTO				= 0;
-float	CHAN_WEAPON				= 1;
-float	CHAN_VOICE				= 2;
-float	CHAN_ITEM				= 3;
-float	CHAN_BODY				= 4;
-float	CHAN_IMPACT				= 5;
+float	CHAN_AUTO				= 0; // Announcer/Chat, on player: Triggers/Items
+float	CHAN_WEAPON				= 1; // Weapon fire
+float	CHAN_VOICE				= 2; // Voice/Radio
+float	CHAN_TRIGGER			= 3; // Triggers/Items
+float	CHAN_PROJECTILE			= 4; // Projectiles
+float	CHAN_PAIN				= 6; // Pain
+float	CHAN_PLAYER				= 7; // Player body
 
 float	ATTN_NONE				= 0;
 float	ATTN_NORM				= 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -214,7 +214,7 @@
 		if (time > self.pain_finished)
 		{
 			bprint("The ", self.netname, " has returned to base\n");
-			sound (e, CHAN_AUTO, self.noise3, 1, ATTN_NONE);
+			sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
 			LogCTF("returned", self.team, world);
 			ReturnFlag(self);
 		}
@@ -294,7 +294,7 @@
 			if (head.team == self.team)
 				UpdateFrags(head, cvar("g_ctf_flagscore_capture_team"));
 
-		sound (self, CHAN_AUTO, self.noise2, 1, ATTN_NONE);
+		sound (other, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
 		WaypointSprite_DetachCarrier(other);
 		if(self.speedrunning)
 			FakeTimeLimit(other, -1);
@@ -325,7 +325,7 @@
 		UpdateFrags(other, cvar("g_ctf_flagscore_pickup"));
 		PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
 		LogCTF("steal", self.team, other);
-		sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE);
+		sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
 
 		FOR_EACH_PLAYER(player)
 			if(player.team == self.team)
@@ -352,7 +352,7 @@
 				UpdateFrags(other, cvar("g_ctf_flagscore_return_rogue"));
 			PlayerScore_Add(other, SP_CTF_RETURNS, 1);
 			LogCTF("return", self.team, other);
-			sound (self, CHAN_AUTO, self.noise1, 1, ATTN_NONE);
+			sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
 			ReturnFlag(self);
 		}
 		else if (!other.flagcarried)
@@ -366,7 +366,7 @@
 			bprint(other.netname, "^7 picked up the ", self.netname, "\n");
 			UpdateFrags(other, cvar("g_ctf_flagscore_pickup"));
 			LogCTF("pickup", self.team, other);
-			sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE);
+			sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
 
 			FOR_EACH_PLAYER(player)
 				if(player.team == self.team)

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -11,12 +11,15 @@
 #define BUTTON_CHAT   buttonchat
 #define BUTTON_USE    buttonuse
 
+#define VOL_BASE 0.7
+
 // Globals
 
-float g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_lms, g_runematch;
+float g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_lms, g_runematch, g_race;
 float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_instagib, g_laserguided_missile, g_midair, g_minstagib, g_nixnex, g_nixnex_with_laser, g_norecoil, g_rocketarena, g_vampire, g_minstagib_invis_alpha;
 float g_tourney;
 float g_ctf_win_mode;
+float g_race_qualifying;
 float tourneyInMatchStage;
 
 float sv_cheats;
@@ -477,3 +480,9 @@
 void PlayerSound(.string samplefield, float channel, float teamsay); // 0 is normal, 1 is team, 2 is last attacker
 void GlobalSound(string samplestring, float channel, float teamsay); // 0 is normal, 1 is team, 2 is last attacker
 void VoiceMessage(string type);
+
+.float version_mismatch;
+
+float independent_players;
+#define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
+#define MAKE_INDEPENDENT_PLAYER(e) ((e).solid = SOLID_TRIGGER)

Modified: branches/nexuiz-2.0/data/qcsrc/server/domination.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -68,9 +68,12 @@
 		self.enemy = world;
 
 	if (head.noise != "")
-		sound(self, CHAN_BODY, head.noise, 1, ATTN_NORM);
+		if(self.enemy)
+			sound(self.enemy, CHAN_AUTO, head.noise, VOL_BASE, ATTN_NORM);
+		else
+			sound(self, CHAN_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
 	if (head.noise1 != "")
-		sound(self, CHAN_VOICE, head.noise1, 1, ATTN_NONE);
+		play2all(head.noise1);
 
 	//self.nextthink = time + cvar("g_domination_point_rate");
 	//self.think = dompointthink;
@@ -106,7 +109,6 @@
 
 void dompointthink()
 {
-	local entity head;
 	local float waittime;
 	local float fragamt;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/extensions.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1235,6 +1235,14 @@
 //description:
 //this extension allows precache_model and precache_sound (and any variants) to be used during the game (with automatic messages to clients to precache the new model/sound indices), also setmodel/sound/ambientsound can be called without precaching first (they will cause an automatic precache).
 
+//DP_SV_QCSTATUS
+//idea: div0
+//darkplaces implementation: div0
+//Fields whose contents are used instead of frags, or set as "qcstatus" field
+//in the getstatus/getinfo response.
+string worldstatus;
+.string clientstatus;
+
 //DP_SV_ROTATINGBMODEL
 //idea: id Software
 //darkplaces implementation: LordHavoc

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -8,7 +8,7 @@
 	if (other.solid == SOLID_BSP)
 	if (vlen(self.velocity) >= 50)
 	if (time >= self.attack_finished_single)
-	sound (self, CHAN_IMPACT, "weapons/tink1.wav", 0.5, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/tink1.wav", 0.5 * VOL_BASE, ATTN_NORM);
 	self.attack_finished_single = time + 0.2;
 	//self.touch = SUB_Null; // one tink is enough
 	//self.dest = self.origin - self.groundentity.origin;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -1,17 +1,7 @@
 
 float checkrules_firstblood;
 
-.float announcetime;
 float yoda;
-void announce(entity player, string msg)
-{
-	if(time > player.announcetime)
-	if(clienttype(player) == CLIENTTYPE_REAL)
-	{
-		player.announcetime = time + 0.3;
-		play2(player, msg);
-	}
-}
 
 float IsDifferentTeam(entity a, entity b)
 {
@@ -226,7 +216,6 @@
 				else if (deathtype == DEATH_NOAMMO)
 				{
 					bprint ("^7",s, " ^7committed suicide. What's the point of living without ammo?\n");
-					//sound (self, CHAN_BODY, "minstagib/mockery.wav", 1, ATTN_NONE);
 				}
 				else if (deathtype == DEATH_CAMP)
 					bprint ("^1",s, "^1 thought he found a nice camping ground\n");
@@ -277,9 +266,6 @@
 				if (!checkrules_firstblood)
 				{
 					checkrules_firstblood = TRUE;
-					//sound(world, CHAN_AUTO, "announcer/firstblood.wav", 1, ATTN_NONE);
-					//if (g_minstagib)
-						//sound(world, CHAN_AUTO, "announce/male/mapkill1.wav", 1, ATTN_NONE);
 					if(sv_gentle)
 						bprint("^1",a, "^1 was the first to score", "\n");
 					else
@@ -527,37 +513,43 @@
 
 		// nullify damage if teamplay is on
 		if(deathtype != DEATH_TELEFRAG)
-		if(attacker.team == targ.team)
 		if(attacker.classname == "player")
 		{
-			if(teamplay == 1)
+			if(targ.classname == "player" && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
+			{
 				damage = 0;
-			else if(attacker != targ)
+				force = '0 0 0';
+			}
+			else if(attacker.team == targ.team)
 			{
-				if(teamplay == 3)
+				if(teamplay == 1)
 					damage = 0;
-				else if(teamplay == 4)
+				else if(attacker != targ)
 				{
-					if(targ.classname == "player" && targ.deadflag == DEAD_NO)
+					if(teamplay == 3)
+						damage = 0;
+					else if(teamplay == 4)
 					{
-						mirrordamage = cvar("g_mirrordamage") * damage;
-						mirrorforce = cvar("g_mirrordamage") * vlen(force);
-						if(g_minstagib)
+						if(targ.classname == "player" && targ.deadflag == DEAD_NO)
 						{
-							if(cvar("g_friendlyfire") == 0)
-								damage = 0;
+							mirrordamage = cvar("g_mirrordamage") * damage;
+							mirrorforce = cvar("g_mirrordamage") * vlen(force);
+							if(g_minstagib)
+							{
+								if(cvar("g_friendlyfire") == 0)
+									damage = 0;
+							}
+							else
+								damage = cvar("g_friendlyfire") * damage;
+							// mirrordamage will be used LATER
 						}
 						else
-							damage = cvar("g_friendlyfire") * damage;
-						// mirrordamage will be used LATER
+							damage = 0;
 					}
-					else
-						damage = 0;
 				}
 			}
 		}
 
-		if(g_lms)
 		if(targ.classname == "player")
 		if(attacker.classname == "player")
 		if(attacker != targ)
@@ -669,6 +661,7 @@
 		self.flags = self.flags - (self.flags & FL_ONGROUND);
 	}
 	// apply damage
+	if (damage != 0)
 	if (self.event_damage)
 		self.event_damage (inflictor, attacker, damage, deathtype, hitloc, force);
 	self = oldself;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -185,7 +185,7 @@
 	}
 
 	pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1);
-	sound (self, CHAN_BODY, "weapons/hook_impact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/hook_impact.wav", VOL_BASE, ATTN_NORM);
 
 	self.state = 1;
 	self.think = GrapplingHookThink;
@@ -225,7 +225,7 @@
 
 	makevectors(self.v_angle);
 
-	sound (self, CHAN_WEAPON, "weapons/hook_fire.wav", 1, ATTN_NORM);
+	sound (self, CHAN_WEAPON, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
 	org = self.origin + self.view_ofs + v_forward * 8 - v_right * 8 + '0 0 -12';
 	pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -66,7 +66,7 @@
 	else
 		self.light_lev = 0;
 };
-void dynlight()
+void spawnfunc_dynlight()
 {
 	local	entity	targ;
 
@@ -117,4 +117,4 @@
 		self.nextthink = self.ltime + 0.1;
 		self.think = dynlight_find_path;
 	}
-};
\ No newline at end of file
+};

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -205,25 +205,6 @@
 
 }
 
-// Sound functions
-
-/*
-==================
-PointSound
-
-Play a sound at the given location
-==================
-*/
-void PointSound (vector org, string snd, float vol, float attn)
-{
-	entity	speaker;
-
-	speaker = spawn ();
-	setorigin (speaker, org);
-	sound (speaker, CHAN_BODY, snd, vol, attn);
-	remove (speaker);
-}
-
 // Misc
 
 /*
@@ -398,7 +379,14 @@
 	if (self.angles != '0 0 0')
 		SetMovedir ();
 	self.solid = SOLID_TRIGGER;
-	setmodel (self, self.model);	// set size and link into world, no precision needed
+	if(self.model != "")
+		setmodel (self, self.model);	// set size and link into world, no precision needed
+	else
+	{
+		// force relinking
+		setorigin(self, self.origin);
+		setsize (self, self.mins, self.maxs);
+	}
 	self.movetype = MOVETYPE_NONE;
 	self.modelindex = 0;
 	self.model = "";
@@ -412,7 +400,14 @@
 	if (self.angles != '0 0 0')
 		SetMovedir ();
 	self.solid = SOLID_BSP;
-	setmodel (self, self.model);	// set size and link into world, no precision needed
+	if(self.model != "")
+		setmodel (self, self.model);	// set size and link into world, no precision needed
+	else
+	{
+		// force relinking
+		setorigin(self, self.origin);
+		setsize (self, self.mins, self.maxs);
+	}
 	self.movetype = MOVETYPE_PUSH;
 //	self.modelindex = 0;
 	self.model = "";

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -56,7 +56,7 @@
 	{
 		centerprint (activator, self.message);
 		if (!self.noise)
-			sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
+			play2(activator, "misc/talk.wav");
 	}
 
 //
@@ -140,7 +140,7 @@
 	}
 
 	if (self.noise)
-		sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+		sound (self.enemy, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
 
 // don't trigger again until reset
 	self.takedamage = DAMAGE_NO;
@@ -458,7 +458,7 @@
 }
 
 
-void target_speaker_use() {sound(self, CHAN_VOICE, self.noise, 1, 1);}
+void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);}
 
 void spawnfunc_target_speaker()
 {
@@ -467,7 +467,7 @@
 	if(self.targetname)
 		self.use = target_speaker_use;
 	else
-		ambientsound (self.origin, self.noise, 1, ATTN_STATIC);
+		ambientsound (self.origin, self.noise, VOL_BASE, ATTN_STATIC);
 };
 
 
@@ -506,7 +506,7 @@
   // sound
   if(self.noise) {
     precache_sound (self.noise);
-    ambientsound (self.origin, self.noise, 1, ATTN_STATIC);
+    ambientsound (self.origin, self.noise, VOL_BASE, ATTN_STATIC);
   }
 }
 */

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -3,13 +3,13 @@
 	float r;
 	r = random ();
 	if (r < 0.60)
-		sound (self, CHAN_IMPACT, "misc/gib_splat01.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/gib_splat01.wav", VOL_BASE, ATTN_NORM);
 	else if (r < 0.65)
-		sound (self, CHAN_IMPACT, "misc/gib_splat02.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/gib_splat02.wav", VOL_BASE, ATTN_NORM);
 	else if (r < 0.70)
-		sound (self, CHAN_IMPACT, "misc/gib_splat03.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/gib_splat03.wav", VOL_BASE, ATTN_NORM);
 	else if (r < 0.75)
-		sound (self, CHAN_IMPACT, "misc/gib_splat04.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/gib_splat04.wav", VOL_BASE, ATTN_NORM);
 	
 	if(sv_gentle < 1)
 		pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10);

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -98,7 +98,7 @@
 				}
 			}
 			if(remainingTimeoutTime == cvar("sv_timeout_resumetime")) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
-				sound(world, CHAN_AUTO, "announcer/robotic/prepareforbattle.wav", 1, ATTN_NONE);
+				play2all("announcer/robotic/prepareforbattle.wav");
 			}
 			remainingTimeoutTime -= 1;
 			self.nextthink = time + TIMEOUT_SLOWMO_VALUE;
@@ -262,8 +262,8 @@
 	if(cvar("g_campaign"))
 		CampaignPreInit();
 
+	readlevelcvars();
 	InitGameplayMode();
-	readlevelcvars();
 	precache();
 
 	WaypointSprite_Init();
@@ -975,7 +975,7 @@
 			fputs(file, strcat(s, "\n"));
 	}
 
-	s = strcat(":labels:player:", GetPlayerScoreString(world));
+	s = strcat(":labels:player:", GetPlayerScoreString(world, 0));
 	if(to_console)
 		ServerConsoleEcho(s, TRUE);
 	if(to_eventlog)
@@ -985,12 +985,11 @@
 
 	FOR_EACH_CLIENT(other)
 	{
-		// FIXME make this use the new score system
 		if ((clienttype(other) == CLIENTTYPE_REAL) || (clienttype(other) == CLIENTTYPE_BOT && cvar("sv_logscores_bots")))
 		{
-			s = strcat(":player:see-labels:", GetPlayerScoreString(other), ":");
+			s = strcat(":player:see-labels:", GetPlayerScoreString(other, 0), ":");
 			s = strcat(s, ftos(rint(time - other.jointime)), ":");
-			if(other.classname == "player")
+			if(other.classname == "player" || g_arena || g_lms)
 				s = strcat(s, ftos(other.team), ":");
 			else
 				s = strcat(s, "spectator:");
@@ -1006,7 +1005,7 @@
 
 	if(teamplay)
 	{
-		s = strcat(":labels:teamscores:", GetTeamScoreString(0));
+		s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
 		if(to_console)
 			ServerConsoleEcho(s, TRUE);
 		if(to_eventlog)
@@ -1016,7 +1015,7 @@
 	
 		for(i = 1; i < 16; ++i)
 		{
-			s = strcat(":teamscores:see-labels:", GetTeamScoreString(i));
+			s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
 			s = strcat(s, ":", ftos(i));
 			if(to_console)
 				ServerConsoleEcho(s, TRUE);
@@ -1173,8 +1172,6 @@
 };
 
 float checkrules_oneminutewarning;
-float checkrules_leaderfrags;
-float tdm_max_score, tdm_old_score;
 
 float checkrules_equality;
 float checkrules_overtimewarning;
@@ -1489,9 +1486,70 @@
 	if(WinningConditionHelper_topscore == 0)
 		WinningConditionHelper_equality = 0;
 	
-	return GetWinningCode(limit && (WinningConditionHelper_topscore >= limit), WinningConditionHelper_equality);
+	if(WinningConditionHelper_lowerisbetter)
+	{
+		WinningConditionHelper_topscore = -WinningConditionHelper_topscore;
+		limit = -limit;
+	}
+	
+	return GetWinningCode(limit && WinningConditionHelper_topscore && (WinningConditionHelper_topscore >= limit), WinningConditionHelper_equality);
 }
 
+float WinningCondition_Race(float fraglimit)
+{
+	float wc;
+	entity p;
+	wc = WinningCondition_Scores(fraglimit);
+
+	// ALWAYS initiate overtime, unless EVERYONE has finished the race!
+	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
+	// do NOT support equality when the laps are all raced!
+	{
+		FOR_EACH_PLAYER(p)
+			if not(p.race_completed)
+				return WINNING_STARTOVERTIME;
+		return WINNING_YES;
+	}
+	return wc;
+}
+
+void ReadyRestart();
+float WinningCondition_QualifyingThenRace()
+{
+	float wc;
+	wc = WinningCondition_Scores(0);
+
+	// NEVER initiate overtime
+	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
+	// do NOT support equality when the laps are all raced!
+	{
+		float totalplayers;
+		float playerswithlaps;
+		entity head;
+		totalplayers = playerswithlaps = 0;
+		FOR_EACH_PLAYER(head)
+		{
+			++totalplayers;
+			if(PlayerScore_Add(head, SP_RACE_FASTEST, 0))
+				++playerswithlaps;
+		}
+
+		// at least 2/3 of the players have completed a lap: start the RACE
+		// otherwise, the players should end the qualifying on their own
+		if(totalplayers >= 3)
+		if(playerswithlaps >= totalplayers * 2 / 3)
+		{
+			checkrules_overtimeend = 0;
+			ReadyRestart();
+			return WINNING_NEVER;
+		}
+
+		return WINNING_YES;
+	}
+
+	return wc;
+}
+
 float WinningCondition_RanOutOfSpawns()
 {
 	entity head;
@@ -1603,8 +1661,11 @@
 		if(!checkrules_overtimewarning)
 		{
 			checkrules_overtimewarning = TRUE;
-			//sound(world, CHAN_AUTO, "announcer/robotic/1minuteremains.wav", 1, ATTN_NONE);
-			bcenterprint("^3Now playing ^1OVERTIME^3!\n\n^3Keep fragging until we have a ^1winner^3!");
+			//announceall("announcer/robotic/1minuteremains.wav");
+			if(!g_race_qualifying)
+				bcenterprint("^3Everyone, finish your lap! The race is over!");
+			else
+				bcenterprint("^3Now playing ^1OVERTIME^3!\n\n^3Keep fragging until we have a ^1winner^3!");
 		}
 	}
 	else
@@ -1622,7 +1683,7 @@
 	if (!checkrules_oneminutewarning && timelimit > 0 && time > timelimit - 60)
 	{
 		checkrules_oneminutewarning = TRUE;
-		sound(world, CHAN_AUTO, "announcer/robotic/1minuteremains.wav", 1, ATTN_NONE);
+		play2all("announcer/robotic/1minuteremains.wav");
 	}
 
 	status = WinningCondition_RanOutOfSpawns();
@@ -1630,6 +1691,14 @@
 	{
 		bprint("Hey! Someone ran out of spawns!\n");
 	}
+	else if(g_race && !g_race_qualifying && timelimit >= 0)
+	{
+		status = WinningCondition_Race(fraglimit);
+	}
+	else if(g_race && g_race_qualifying == 2 && timelimit >= 0)
+	{
+		status = WinningCondition_QualifyingThenRace();
+	}
 	else if(g_assault)
 	{
 		status = WinningCondition_Assault(); // TODO remove this?

Modified: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -206,6 +206,10 @@
 	{
 		Score_DebugPrint();
 	}
+	if (argv(0) == "allready")
+	{
+		ReadyRestart();
+	}
 
 	print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -258,7 +258,7 @@
 	local entity head, best;
 	local float rating, bestrating;
 	local vector eye, v;
-	if (cvar("bot_nofire"))
+	if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 	{
 		self.enemy = world;
 		return;
@@ -457,7 +457,7 @@
 	if (self.bot_aimtarg)
 	{
 		weapon_action(self.weapon, WR_AIM);
-		if (cvar("bot_nofire"))
+		if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 		{
 			self.BUTTON_ATCK = FALSE;
 			self.BUTTON_ATCK2 = FALSE;

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -532,11 +532,47 @@
 	}
 };
 
+//Race:
+//go to next checkpoint, and annoy enemies
+.float race_checkpoint;
+void havocbot_role_race()
+{
+	entity e;
+	if (self.bot_strategytime < time)
+	{
+		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+		navigation_goalrating_start();
+		/*
+		havocbot_goalrating_items(100, self.origin, 10000);
+		havocbot_goalrating_enemyplayers(500, self.origin, 20000);
+		*/
+
+		for(e = world; (e = find(e, classname, "trigger_race_checkpoint")) != world; )
+		{
+			if(e.cnt == self.race_checkpoint)
+			{
+				navigation_routerating(e, 1000000, 5000);
+			}
+			else if(self.race_checkpoint == -1)
+			{
+				navigation_routerating(e, 1000000, 5000);
+			}
+		}
+		
+		navigation_goalrating_end();
+	}
+};
+
 void havocbot_chooserole_dm()
 {
 	self.havocbot_role = havocbot_role_dm;
 };
 
+void havocbot_chooserole_race()
+{
+	self.havocbot_role = havocbot_role_race;
+};
+
 void havocbot_chooserole_dom()
 {
 	self.havocbot_role = havocbot_role_dom;
@@ -759,6 +795,8 @@
 		havocbot_chooserole_dom();
 	else if (g_keyhunt)
 		havocbot_chooserole_kh();
+	else if (g_race)
+		havocbot_chooserole_race();
 	else // assume anything else is deathmatch
 		havocbot_chooserole_dm();
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -435,7 +435,7 @@
 
 void kh_Key_Collect(entity key, entity player)  //a player picks up a dropped key
 {
-	sound(player, CHAN_AUTO, kh_sound_collect, 1, ATTN_NORM);
+	sound(player, CHAN_AUTO, kh_sound_collect, VOL_BASE, ATTN_NORM);
 
 	if(key.kh_dropperteam != player.team)
 	{
@@ -477,7 +477,7 @@
 			if(suicide)
 				key.kh_dropperteam = player.team;
 		}
-		sound(player, CHAN_AUTO, kh_sound_drop, 1, ATTN_NORM);
+		sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
 	}
 }
 
@@ -542,7 +542,7 @@
 			self.pusher = world;
 			kh_Scores_Event(self.owner, self, "dropkey", 0, 0);
 			bprint(self.owner.netname, "^7 dropped the ", self.netname, "\n");
-			sound(self.owner, CHAN_AUTO, kh_sound_drop, 1, ATTN_NORM);
+			sound(self.owner, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
 			makevectors(self.owner.v_angle);
 			self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, cvar("g_balance_keyhunt_throwvelocity") * v_forward);
 			kh_Key_AssignTo(self, world);
@@ -561,7 +561,7 @@
 	{
 		if(self.siren_time < time)
 		{
-			sound(world, CHAN_AUTO, kh_sound_alarm, 1, ATTN_NORM);  // play a simple alarm
+			sound(self.owner, CHAN_AUTO, kh_sound_alarm, VOL_BASE, ATTN_NORM);  // play a simple alarm
 			self.siren_time = time + 2.5;  // repeat every 2.5 seconds
 		}
 
@@ -647,7 +647,7 @@
 	midpoint = midpoint * (1 / kh_teams);
 	te_customflash(midpoint, 1000, 1, TeamColor(teem) * 0.5 + '0.5 0.5 0.5');  // make the color >=0.5 in each component
 
-	sound(world, CHAN_AUTO, kh_sound_capture, 1, ATTN_NONE);
+	play2all(kh_sound_capture);
 	kh_FinishRound();
 }
 
@@ -736,7 +736,7 @@
 
 		bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "\n");
 	}
-	sound(world, CHAN_AUTO, kh_sound_destroy, 1, ATTN_NONE);
+	play2all(kh_sound_destroy);
 	te_tarexplosion(lostkey.origin);
 
 	kh_FinishRound();

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -124,10 +124,8 @@
 #define FOR_EACH_REALPLAYER(v) FOR_EACH_REALCLIENT(v) if(v.classname == STR_PLAYER)
 #endif
 
-// change that to actually calling strcat when running on an engine without
-// unlimited tempstrings:
-// string strcat1(string s) = #115; // FRIK_FILE
-#define strcat1(s) (s)
+// copies a string to a tempstring (so one can strunzone it)
+string strcat1(string s) = #115; // FRIK_FILE
 
 float logfile_open;
 float logfile;
@@ -215,6 +213,7 @@
 	}
 }
 
+float spawnpoint_nag;
 void relocate_spawnpoint()
 {
 	// nudge off the floor
@@ -223,8 +222,28 @@
 	tracebox(self.origin, PL_MIN, PL_MAX, self.origin, TRUE, self);
 	if (trace_startsolid)
 	{
-		objerror("player spawn point in solid, mapper sucks!\n");
-		return;
+		vector o;
+		o = self.origin;
+		self.mins = PL_MIN;
+		self.maxs = PL_MAX;
+		move_out_of_solid(self);
+		print("^1NOTE: this map needs FIXING. Spawnpoint at ", vtos(o - '0 0 1'));
+		print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
+		print(" ", ftos(self.origin_y - o_y));
+		print(" ", ftos(self.origin_z - o_z), "'\n");
+		if(cvar("g_spawnpoints_auto_move_out_of_solid"))
+		{
+			if(!spawnpoint_nag)
+				print("\{1}^1NOTE: this map needs FIXING (it contains spawnpoints in solid, see server log)\n");
+			spawnpoint_nag = 1;
+		}
+		else
+		{
+			self.origin = o;
+			self.mins = self.maxs = '0 0 0';
+			objerror("player spawn point in solid, mapper sucks!\n");
+			return;
+		}
 	}
 
 	if(cvar("g_spawnpoints_autodrop"))
@@ -241,6 +260,18 @@
 	if(g_ctf || g_assault || g_onslaught || g_domination)
 	if(self.team)
 		have_team_spawns = 1;
+
+	if(cvar("r_showbboxes"))
+	{
+		// show where spawnpoints point at too
+		makevectors(self.angles);
+		entity e;
+		e = spawn();
+		e.classname = "info_player_foo";
+		setorigin(e, self.origin + v_forward * 24);
+		setsize(e, '-8 -8 -8', '8 8 8');
+		e.solid = SOLID_TRIGGER;
+	}
 }
 
 #define strstr strstrofs
@@ -573,62 +604,6 @@
 	return "neutral";
 }
 
-/*
-string decolorize(string s)
-{
-	string out;
-	out = "";
-	while(s != "")
-	{
-		float n;
-		string ch1, ch2;
-		n = 1;
-		ch1 = substring(s, 0, 1);
-		ch2 = substring(s, 1, 1);
-		if(ch1 == "^")
-		{
-			n = 2;
-			if(ch2 == "^")
-				out = strcat(out, "^^");
-			else if(ch2 == "0")
-				out = strcat1(out);
-			else if(ch2 == "1")
-				out = strcat1(out);
-			else if(ch2 == "2")
-				out = strcat1(out);
-			else if(ch2 == "3")
-				out = strcat1(out);
-			else if(ch2 == "4")
-				out = strcat1(out);
-			else if(ch2 == "5")
-				out = strcat1(out);
-			else if(ch2 == "6")
-				out = strcat1(out);
-			else if(ch2 == "7")
-				out = strcat1(out);
-			else if(ch2 == "8")
-				out = strcat1(out);
-			else if(ch2 == "9")
-				out = strcat1(out);
-			else
-			{
-				n = 1;
-				out = strcat(out, "^^");
-			}
-			s = substring(s, n, strlen(s) - n);
-		}
-		else
-		{
-			s = substring(s, 1, strlen(s) - 1);
-			out = strcat(out, ch1);
-		}
-	}
-	return out;
-}
-#define strdecolorize(s) decolorize(s)
-#define strlennocol(s) strlen(decolorize(s))
-*/
-
 #define CENTERPRIO_POINT 1
 #define CENTERPRIO_SPAM 2
 #define CENTERPRIO_REBALANCE 2
@@ -756,6 +731,7 @@
 	sv_pogostick = cvar("sv_pogostick");
 	sv_doublejump = cvar("sv_doublejump");
 	g_ctf_win_mode = cvar("g_ctf_win_mode");
+	g_race_qualifying = cvar("g_race_qualifying");
 
 	g_pickup_shells                    = cvar("g_pickup_shells");
 	g_pickup_shells_max                = cvar("g_pickup_shells_max");
@@ -927,13 +903,53 @@
 }
 */
 
+// Sound functions
 string precache_sound (string s) = #19;
 void(entity e, float chan, string samp, float vol, float atten) sound = #8;
+float precache_sound_index (string s) = #19;
+
+void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten)
+{
+	WriteByte(dest, 6);
+	WriteByte(dest, 27); // all bits except SND_LOOPING
+	WriteByte(dest, vol * 255);
+	WriteByte(dest, atten * 64);
+	WriteEntity(dest, e);
+	WriteByte(dest, chan);
+	WriteShort(dest, precache_sound_index(samp));
+	WriteCoord(dest, o_x);
+	WriteCoord(dest, o_y);
+	WriteCoord(dest, o_z);
+}
+void soundto(float dest, entity e, float chan, string samp, float vol, float atten)
+{
+	vector o;
+	o = e.origin + 0.5 * (e.mins + e.maxs);
+	soundtoat(dest, e, o, chan, samp, vol, atten);
+}
+void soundat(entity e, vector o, float chan, string samp, float vol, float atten)
+{
+	soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten);
+}
+
 void play2(entity e, string filename)
 {
-	stuffcmd(e, strcat("play2 ", filename, "\n"));
+	//stuffcmd(e, strcat("play2 ", filename, "\n"));
+	msg_entity = e;
+	soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE);
 }
 
+.float announcetime;
+void announce(entity player, string msg)
+{
+	if(time > player.announcetime)
+	if(clienttype(player) == CLIENTTYPE_REAL)
+	{
+		player.announcetime = time + 0.3;
+		play2(player, msg);
+	}
+}
+
 void play2team(float t, string filename)
 {
 	local entity head;
@@ -944,6 +960,11 @@
 	}
 }
 
+void play2all(string samp)
+{
+	sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE);
+}
+
 void PrecachePlayerSounds(string f);
 void precache_all_models(string pattern)
 {
@@ -1113,6 +1134,6 @@
 	if (self.noise)
 	{
 		precache_sound (self.noise);
-		ambientsound ('0 0 0', self.noise, 1.00, ATTN_NONE);
+		ambientsound ('0 0 0', self.noise, VOL_BASE, ATTN_NONE);
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -319,7 +319,7 @@
 	{
 		// self.max_health / 300 gives 5 minutes of overtime.
 		// control points reduce the overtime duration.
-		sound(self, CHAN_AUTO, "sound/onslaught/generator_decay.wav", 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "sound/onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
 		d = 1;
 		e = findchain(classname, "onslaught_controlpoint");
 		while (e)
@@ -343,13 +343,13 @@
 		self.count = self.count - 1;
 		org = randompos(self.origin + self.mins + '8 8 8', self.origin + self.maxs + '-8 -8 -8');
 		pointparticles(particleeffectnum("onslaught_generator_smallexplosion"), org, '0 0 0', 1);
-		sound(self, CHAN_AUTO, "sound/weapons/grenade_impact.wav", 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "sound/weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 	}
 	else
 	{
 		org = self.origin;
 		pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
-		sound(self, CHAN_AUTO, "sound/weapons/rocket_impact.wav", 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "sound/weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
 	}
 };
 
@@ -622,7 +622,7 @@
 	self.colormod = '2 2 2';
 	if (self.health < 0)
 	{
-		sound(self, CHAN_AUTO, "sound/weapons/grenade_impact.wav", 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "sound/weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 		pointparticles(particleeffectnum("onslaught_controlpoint_explosion"), self.origin, '0 0 0', 1);
 		{
 			string t;
@@ -672,7 +672,7 @@
 		self.health = self.max_health;
 		self.count = self.count * 0.2; // slow repair rate from now on
 		self.think = onslaught_controlpoint_icon_think;
-		sound(self, CHAN_BODY, "sound/onslaught/controlpoint_built.wav", 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "sound/onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
 		bprint(ColoredTeamName(self.team), " captured ", self.owner.message, " control point\n");
 		self.owner.iscaptured = TRUE;
 		onslaught_updatelinks();
@@ -719,7 +719,7 @@
 	e.think = onslaught_controlpoint_icon_buildthink;
 	e.nextthink = time + 0.1;
 	e.count = e.max_health / 50; // how long it takes to build
-	sound(e, CHAN_BODY, "sound/onslaught/controlpoint_build.wav", 1, ATTN_NORM);
+	sound(e, CHAN_TRIGGER, "sound/onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
 	self.team = e.team;
 	self.colormap = e.colormap;
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2008-08-12 12:20:43 UTC (rev 4120)
@@ -22,6 +22,8 @@
 
 ipban.qh
 
+race.qh
+
 keyhunt.qh
 
 antilag.qh
@@ -122,7 +124,9 @@
 t_halflife.qc
 t_quake.qc
 
+race.qc
 
+
 //// tZork Turrets ////
 tturrets/include/turret_tturrets.qh
 

Copied: branches/nexuiz-2.0/data/qcsrc/server/race.qc (from rev 4119, trunk/data/qcsrc/server/race.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/race.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/race.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -0,0 +1,460 @@
+#define MAX_CHECKPOINTS 255
+
+.float race_checkpoint; // player: next checkpoint that has to be reached
+.float race_laptime;
+
+.entity sprite;
+
+float race_checkpoint_records[MAX_CHECKPOINTS];
+string race_checkpoint_recordholders[MAX_CHECKPOINTS];
+float race_checkpoint_lasttimes[MAX_CHECKPOINTS];
+float race_checkpoint_lastlaps[MAX_CHECKPOINTS];
+entity race_checkpoint_lastplayers[MAX_CHECKPOINTS];
+
+float race_highest_checkpoint;
+float race_highest_place_spawn;
+
+float race_NextCheckpoint(float f)
+{
+	if(f >= race_highest_checkpoint)
+		return 0;
+	else
+		return f + 1;
+}
+
+float race_PreviousCheckpoint(float f)
+{
+	if(f == -1)
+		return 0;
+	else if(f == 0)
+		return race_highest_checkpoint;
+	else
+		return f - 1;
+}
+
+void race_SendNextCheckpoint(entity e)
+{
+	float recordtime;
+	string recordholder;
+	float cp;
+
+	if(clienttype(e) != CLIENTTYPE_REAL)
+		return;
+
+	if(!e.race_laptime)
+		return;
+
+	cp = e.race_checkpoint;
+	recordtime = race_checkpoint_records[cp];
+	recordholder = race_checkpoint_recordholders[cp];
+	/*
+	recordtime = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/racerecord/", ftos(cp), "/time")));
+	recordholder = db_get(ServerProgsDB, strcat(GetMapname(), "/racerecord/", ftos(cp), "/netname"));
+	*/
+	if(recordholder == e.netname)
+		recordholder = "";
+
+	msg_entity = e;
+	WriteByte(MSG_ONE, SVC_TEMPENTITY);
+	WriteByte(MSG_ONE, TE_CSQC_RACE);
+	WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_NEXT_QUALIFYING);
+	WriteByte(MSG_ONE, cp); // checkpoint the player will be at next
+	WriteShort(MSG_ONE, recordtime);
+	WriteString(MSG_ONE, recordholder);
+}
+
+void race_SendTime(entity e, float cp, float t, float tvalid)
+{
+	float snew, l;
+	t = floor(0.5 + 10 * t); // make integer
+
+	if(tvalid)
+	if(cp == 0) // finish line
+	if not(e.race_completed)
+	{
+		float s;
+		if(g_race_qualifying)
+		{
+			s = PlayerScore_Add(e, SP_RACE_FASTEST, 0);
+			if(!s || t < s)
+				PlayerScore_Add(e, SP_RACE_FASTEST, t - s);
+		}
+		else
+		{
+			s = PlayerScore_Add(e, SP_RACE_TIME, 0);
+			snew = floor(0.5 + 10 * (time - restart_countdown));
+			PlayerScore_Add(e, SP_RACE_TIME, snew - s);
+			l = PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1);
+
+			if(cvar("fraglimit"))
+				if(l >= cvar("fraglimit"))
+					race_completing = 1;
+
+			if(race_completing)
+			{
+				e.race_completed = 1;
+				MAKE_INDEPENDENT_PLAYER(e);
+				bprint(e.netname, "^7 has finished the race.\n");
+				if(clienttype(e) == CLIENTTYPE_REAL)
+				{
+					msg_entity = e;
+					WriteByte(MSG_ONE, SVC_TEMPENTITY);
+					WriteByte(MSG_ONE, TE_CSQC_FORCESCOREBOARD);
+					// he can still move, but will see the scoreboard now
+				}
+			}
+		}
+	}
+
+	float recordtime;
+	string recordholder;
+
+	if(g_race_qualifying)
+	{
+		if(tvalid)
+		{
+			recordtime = race_checkpoint_records[cp];
+			recordholder = strcat1(race_checkpoint_recordholders[cp]); // make a tempstring copy, as we'll possibly strunzone it!
+			if(recordholder == e.netname)
+				recordholder = "";
+
+			if(t < recordtime || recordtime == 0)
+			{
+				race_checkpoint_records[cp] = t;
+				if(race_checkpoint_recordholders[cp])
+					strunzone(race_checkpoint_recordholders[cp]);
+				race_checkpoint_recordholders[cp] = strzone(e.netname);
+				if(cp == 0)
+				{
+					float grecordtime;
+					string grecordholder;
+					grecordtime = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/racerecord/time")));
+					grecordholder = db_get(ServerProgsDB, strcat(GetMapname(), "/racerecord/netname"));
+					if(grecordholder == e.netname)
+						grecordholder = "";
+					if(grecordtime == 0)
+					{
+						bprint(e.netname, "^7 set the all-time fastest lap record with ", mmsss(t), "\n");
+						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/time"), ftos(t));
+						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/netname"), e.netname);
+					}
+					else if(t < grecordtime)
+					{
+						if(grecordholder == "")
+							bprint(e.netname, "^7 broke his all-time fastest lap record with ", mmsss(t), "\n");
+						else
+							bprint(e.netname, "^7 broke ", grecordholder, "^7's all-time fastest lap record with ", mmsss(t), "\n");
+						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/time"), ftos(t));
+						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/netname"), e.netname);
+					}
+					else
+					{
+						if(grecordholder == "")
+							bprint(e.netname, "^7's new fastest lap could not break his all-time fastest lap record of ", mmsss(grecordtime), "\n");
+						else
+							bprint(e.netname, "^7's new fastest lap could not break ", grecordholder, "^7's all-time fastest lap record of ", mmsss(grecordtime), "\n");
+					}
+				}
+
+				if(g_race_qualifying)
+				{
+					entity p;
+					FOR_EACH_REALPLAYER(p)
+						if(p.race_checkpoint == cp)
+							race_SendNextCheckpoint(p);
+				}
+			}
+		}
+		else
+		{
+			// dummies
+			t = 0;
+			recordtime = 0;
+			recordholder = "";
+		}
+
+		if(clienttype(e) == CLIENTTYPE_REAL)
+		{
+			msg_entity = e;
+			if(g_race_qualifying)
+			{
+				WriteByte(MSG_ONE, SVC_TEMPENTITY);
+				WriteByte(MSG_ONE, TE_CSQC_RACE);
+				WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_QUALIFYING);
+				WriteByte(MSG_ONE, cp); // checkpoint the player now is at
+				WriteShort(MSG_ONE, t); // time to that intermediate
+				WriteShort(MSG_ONE, recordtime); // previously best time
+				WriteString(MSG_ONE, recordholder); // record holder
+			}
+		}
+	}
+	else // RACE! Not Qualifying
+	{
+		float lself, lother, othtime;
+		entity oth;
+		oth = race_checkpoint_lastplayers[cp];
+		if(oth)
+		{
+			lself = PlayerScore_Add(e, SP_RACE_LAPS, 0);
+			lother = race_checkpoint_lastlaps[cp];
+			othtime = race_checkpoint_lasttimes[cp];
+		}
+		else
+			lself = lother = othtime = 0;
+
+		if(clienttype(e) == CLIENTTYPE_REAL)
+		{
+			msg_entity = e;
+			WriteByte(MSG_ONE, SVC_TEMPENTITY);
+			WriteByte(MSG_ONE, TE_CSQC_RACE);
+			WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_RACE);
+			WriteByte(MSG_ONE, cp); // checkpoint the player now is at
+			if(e == oth)
+			{
+				WriteShort(MSG_ONE, 0);
+				WriteByte(MSG_ONE, 0);
+				WriteString(MSG_ONE, "");
+			}
+			else
+			{
+				WriteShort(MSG_ONE, floor(10 * (time - race_checkpoint_lasttimes[cp]) + 0.5));
+				WriteByte(MSG_ONE, lself - lother);
+				WriteString(MSG_ONE, oth.netname); // record holder
+			}
+		}
+
+		race_checkpoint_lastplayers[cp] = e;
+		race_checkpoint_lasttimes[cp] = time;
+		race_checkpoint_lastlaps[cp] = lself;
+
+		if(clienttype(oth) == CLIENTTYPE_REAL)
+		{
+			msg_entity = oth;
+			WriteByte(MSG_ONE, SVC_TEMPENTITY);
+			WriteByte(MSG_ONE, TE_CSQC_RACE);
+			WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_RACE_BY_OPPONENT);
+			WriteByte(MSG_ONE, cp); // checkpoint the player now is at
+			if(e == oth)
+			{
+				WriteShort(MSG_ONE, 0);
+				WriteByte(MSG_ONE, 0);
+				WriteString(MSG_ONE, "");
+			}
+			else
+			{
+				WriteShort(MSG_ONE, floor(10 * (time - othtime) + 0.5));
+				WriteByte(MSG_ONE, lother - lself);
+				WriteString(MSG_ONE, e.netname); // record holder
+			}
+		}
+	}
+}
+
+void race_ClearTime(entity e)
+{
+	e.race_checkpoint = -1;
+	e.race_laptime = 0;
+
+	if(clienttype(e) != CLIENTTYPE_REAL)
+		return;
+
+	msg_entity = e;
+	WriteByte(MSG_ONE, SVC_TEMPENTITY);
+	WriteByte(MSG_ONE, TE_CSQC_RACE);
+	WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_CLEAR); // next
+}
+
+void checkpoint_touch()
+{
+	if(other.classname != "player")
+		return;
+
+	if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint)
+	{
+		other.race_checkpoint = race_NextCheckpoint(self.race_checkpoint);
+
+		race_SendTime(other, self.race_checkpoint, time - other.race_laptime, !!other.race_laptime);
+
+		if(!self.race_checkpoint) // finish line
+			other.race_laptime = time;
+
+		if(g_race_qualifying)
+			race_SendNextCheckpoint(other);
+	}
+	else if(other.race_checkpoint == race_NextCheckpoint(self.race_checkpoint))
+	{
+		// ignored
+	}
+	else
+	{
+		if(self.spawnflags & 4)
+			Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+	}
+}
+
+void checkpoint_use()
+{
+	other = activator;
+	checkpoint_touch();
+}
+
+float race_waypointsprite_for_player(entity e)
+{
+	if(e.race_checkpoint == -1)
+		return self.modelindex;
+	else if(e.race_checkpoint == self.owner.race_checkpoint)
+		return self.modelindex;
+	else
+		return FALSE;
+}
+
+void spawnfunc_trigger_race_checkpoint()
+{
+	vector o;
+	if(!g_race)
+	{
+		remove(self);
+		return;
+	}
+	InitTrigger();
+	self.use = checkpoint_use;
+	if not(self.spawnflags & 1)
+		self.touch = checkpoint_touch;
+
+	o = (self.absmin + self.absmax) * 0.5;
+	tracebox(o, PL_MIN, PL_MAX, o - '0 0 1' * (o_z - self.absmin_z), MOVE_NORMAL, self);
+	self.nearestwaypoint = waypoint_spawn(trace_endpos, trace_endpos, WAYPOINTFLAG_GENERATED);
+	self.nearestwaypointtimeout = time + 1000000000;
+
+	if(!self.message)
+		self.message = "went backwards";
+	
+	self.race_checkpoint = self.cnt;
+
+	if(self.race_checkpoint > race_highest_checkpoint)
+		race_highest_checkpoint = self.race_checkpoint;
+
+	if(self.race_checkpoint)
+	{
+		precache_model("models/sprites/race-checkpoint.sp2");
+		WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+	}
+	else
+	{
+		precache_model("models/sprites/race-finish.sp2");
+		WaypointSprite_SpawnFixed("race-finish", o, self, sprite);
+	}
+	self.sprite.waypointsprite_for_player = race_waypointsprite_for_player;
+}
+
+void race_PreparePlayer()
+{
+	race_ClearTime(self);
+	self.race_place = 0;
+}
+
+void race_RetractPlayer()
+{
+	if(!g_race)
+		return;
+	self.race_checkpoint = race_PreviousCheckpoint(self.race_checkpoint);
+	if(self.race_checkpoint == 0)
+	{
+		race_ClearTime(self);
+		self.race_checkpoint = 0;
+	}
+}
+
+void race_PreSpawn()
+{
+	if(!g_race)
+		return;
+	if(self.killcount == -666 || g_race_qualifying)
+		race_PreparePlayer();
+
+	if(race_completing)
+	{
+		self.race_completed = 1;
+		MAKE_INDEPENDENT_PLAYER(self);
+		bprint(self.netname, "^7 has abandoned the race.\n");
+		if(clienttype(self) == CLIENTTYPE_REAL)
+		{
+			msg_entity = self;
+			WriteByte(MSG_ONE, SVC_TEMPENTITY);
+			WriteByte(MSG_ONE, TE_CSQC_FORCESCOREBOARD);
+			// he can still move, but will see the scoreboard now
+		}
+	}
+}
+
+void race_PostSpawn(entity spot)
+{
+	if(!g_race)
+		return;
+	if(self.killcount != -666 && !g_race_qualifying)
+	{
+		if(spot.target == "")
+			// let the player run without timing, if he did not spawn at a targetting spawnpoint
+			race_PreparePlayer();
+		else
+			race_RetractPlayer();
+	}
+
+	if(spot.target != "" && self.race_checkpoint == -1)
+		self.race_checkpoint = 0;
+
+	self.race_place = 0;
+}
+
+void race_PreSpawnObserver()
+{
+	if(!g_race)
+		return;
+	race_PreparePlayer();
+}
+
+void spawnfunc_info_player_race (void)
+{
+	if(!g_race)
+	{
+		remove(self);
+		return;
+	}
+	++race_spawns;
+	spawnfunc_info_player_deathmatch();
+
+	if(self.race_place > race_highest_place_spawn)
+		race_highest_place_spawn = self.race_place;
+}
+
+void race_ClearRecords()
+{
+	float i;
+	entity e;
+
+	for(i = 0; i < MAX_CHECKPOINTS; ++i)
+	{
+		race_checkpoint_records[i] = 0;
+		if(race_checkpoint_recordholders[i])
+			strunzone(race_checkpoint_recordholders[i]);
+		race_checkpoint_recordholders[i] = string_null;
+	}
+
+	FOR_EACH_CLIENT(e)
+		race_ClearTime(e);
+}
+
+void race_ReadyRestart()
+{
+	race_ClearRecords();
+
+	if(g_race_qualifying == 2)
+	{
+		g_race_qualifying = 0;
+		independent_players = 0;
+		cvar_set("fraglimit", ftos(race_fraglimit));
+		ScoreRules_race();
+	}
+
+	PlayerScore_Sort(race_place);
+}

Copied: branches/nexuiz-2.0/data/qcsrc/server/race.qh (from rev 4119, trunk/data/qcsrc/server/race.qh)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/race.qh	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/race.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -0,0 +1,13 @@
+void race_PreSpawnObserver();
+void race_PreSpawn();
+void race_PostSpawn(entity spot);
+void race_ReadyRestart();
+float race_teams;
+float race_spawns;
+float race_PreviousCheckpoint(float f);
+float race_NextCheckpoint(float f);
+float race_highest_place_spawn;
+float race_fraglimit;
+.float race_place;
+.float race_completed;
+float race_completing;

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -10,6 +10,8 @@
 float teamscores_entities_count;
 var .float scores_primary;
 var .float teamscores_primary;
+float scores_flags_primary;
+float teamscores_flags_primary;
 
 void Net_LinkEntity(entity e)
 {
@@ -29,6 +31,20 @@
 
 	previous_y = fieldflags & SFL_SORT_PRIO_MASK;
 
+	if(fieldflags & SFL_ZERO_IS_WORST)
+	{
+		if(t1.field == 0)
+		{
+			previous_x = -1;
+			return previous;
+		}
+		else if(t2.field == 0)
+		{
+			previous_x = +1;
+			return previous;
+		}
+	}
+
 	if(fieldflags & SFL_LOWER_IS_BETTER)
 		previous_x = (t2.field - t1.field);
 	else
@@ -110,7 +126,10 @@
 	scores_label[i] = label;
 	scores_flags[i] = scoreflags;
 	if(scoreflags & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
+	{
 		scores_primary = scores[i];
+		scores_flags_primary = scoreflags;
+	}
 }
 
 void ScoreInfo_SetLabel_TeamScore(float i, string label, float scoreflags)
@@ -118,7 +137,10 @@
 	teamscores_label[i] = label;
 	teamscores_flags[i] = scoreflags;
 	if(scoreflags & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
+	{
 		teamscores_primary = teamscores[i];
+		teamscores_flags_primary = scoreflags;
+	}
 }
 
 void ScoreInfo_Write(float targ)
@@ -143,7 +165,6 @@
 
 void ScoreInfo_Init(float teams)
 {
-	entity pl;
 	scores_initialized = 1;
 	if(teams >= 1)
 		TeamScore_Spawn(COLOR_TEAM1, "Red");
@@ -180,10 +201,9 @@
 
 	if(teamscores_entities_count)
 		return;
-	if(g_lms)
-		return;
-	if(g_arena)
-		return;
+	if(g_lms) return;
+	if(g_arena) return;
+	if(g_race) return;
 	//print("clear clear clear... HAHA\n");
 
 	sk = player.scorekeeper;
@@ -249,11 +269,13 @@
 	return (s.(scores[scorefield]) += score);
 }
 
-void PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score)
+float PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score)
 {
-	PlayerScore_Add(player, pscorefield, score);
+	float r;
+	r = PlayerScore_Add(player, pscorefield, score);
 	if(teamscores_entities_count) // only for teamplay
-		TeamScore_Add(player, tscorefield, score);
+		r = TeamScore_Add(player, tscorefield, score);
+	return r;
 }
 
 float PlayerScore_Compare(entity t1, entity t2)
@@ -274,10 +296,21 @@
 void WinningConditionHelper()
 {
 	float c;
+	string s;
+	entity p;
+	s = GetGametype();
+	s = strcat(s, ":", GetPlayerScoreString(world, 2)); // make this 1 once we can
+
 	if(teamscores_entities_count)
 	{
 		float t;
-		WinningConditionHelper_equality = 1;
+
+		s = strcat(s, ":", GetTeamScoreString(0, 1));
+		for(t = 0; t < 16; ++t)
+			if(teamscorekeepers[t])
+				s = strcat(s, ":", ftos(t+1), ":", GetTeamScoreString(t+1, 1));
+
+		WinningConditionHelper_equality = 0;
 		WinningConditionHelper_winnerteam = 0;
 		for(t = 1; t < 16; ++t)
 		{
@@ -295,6 +328,10 @@
 		}
 
 		WinningConditionHelper_topscore = teamscorekeepers[WinningConditionHelper_winnerteam].teamscores_primary;
+		WinningConditionHelper_lowerisbetter = (teamscores_flags_primary & SFL_LOWER_IS_BETTER);
+		WinningConditionHelper_zeroisworst = (teamscores_flags_primary & SFL_ZERO_IS_WORST);
+		if(teamscores_flags_primary & SFL_TIME)
+			WinningConditionHelper_topscore /= 10;
 
 		WinningConditionHelper_winner = world;
 		if(WinningConditionHelper_equality)
@@ -304,8 +341,7 @@
 	}
 	else
 	{
-		entity p;
-		WinningConditionHelper_equality = 1;
+		WinningConditionHelper_equality = 0;
 		WinningConditionHelper_winner = world;
 		FOR_EACH_PLAYER(p)
 		{
@@ -320,11 +356,49 @@
 		}
 
 		WinningConditionHelper_topscore = WinningConditionHelper_winner.scorekeeper.scores_primary;
+		WinningConditionHelper_lowerisbetter = (scores_flags_primary & SFL_LOWER_IS_BETTER);
+		if(scores_flags_primary & SFL_ZERO_IS_WORST)
+			if(WinningConditionHelper_topscore == 0)
+			{
+				if(WinningConditionHelper_lowerisbetter)
+					WinningConditionHelper_topscore = 999999999;
+				else
+					WinningConditionHelper_topscore = -999999999;
+			}
+		if(teamscores_flags_primary & SFL_TIME)
+			WinningConditionHelper_topscore /= 10;
 
 		if(WinningConditionHelper_equality)
 			WinningConditionHelper_winner = world;
 		WinningConditionHelper_winnerteam = -1;
 	}
+
+	if(worldstatus)
+		strunzone(worldstatus);
+	worldstatus = strzone(s);
+
+	FOR_EACH_CLIENT(p)
+	{
+		/* this breaks qstat :( find a way to make qstat parse this at least as an int first
+		s = GetPlayerScoreString(p, 1);
+		if(clienttype(p) == CLIENTTYPE_REAL)
+			s = strcat(s, ":human");
+		else
+			s = strcat(s, ":bot");
+		if(p.classname == "player" || g_arena || g_lms)
+			s = strcat(s, ":", ftos(p.team));
+		else
+			s = strcat(s, ":spectator");
+		*/
+		if(p.classname == "player" || g_arena || g_lms)
+			s = "-666";
+		else
+			s = GetPlayerScoreString(p, 2);
+
+		if(p.clientstatus)
+			strunzone(p.clientstatus);
+		p.clientstatus = strzone(s);
+	}
 }
 
 void Score_DebugPrint()
@@ -373,7 +447,7 @@
 	return label;
 }
 
-string GetPlayerScoreString(entity pl)
+string GetPlayerScoreString(entity pl, float shortString)
 {
 	string out;
 	entity sk;
@@ -391,6 +465,7 @@
 				l = scores_label[i];
 				out = strcat(out, GetScoreLogLabel(l, f), ",");
 			}
+		if(shortString < 2)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_SECONDARY)
 			{
@@ -398,6 +473,7 @@
 				l = scores_label[i];
 				out = strcat(out, GetScoreLogLabel(l, f), ",");
 			}
+		if(shortString < 1)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_PRIMARY)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_SECONDARY)
@@ -413,9 +489,11 @@
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
 				out = strcat(out, ftos(sk.(scores[i])), ",");
+		if(shortString < 2)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_SECONDARY)
 				out = strcat(out, ftos(sk.(scores[i])), ",");
+		if(shortString < 1)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_PRIMARY)
 			if(scores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_SECONDARY)
@@ -425,7 +503,7 @@
 	return out;
 }
 
-string GetTeamScoreString(float tm)
+string GetTeamScoreString(float tm, float shortString)
 {
 	string out;
 	entity sk;
@@ -443,6 +521,7 @@
 				l = teamscores_label[i];
 				out = strcat(out, GetScoreLogLabel(l, f), ",");
 			}
+		if(shortString < 2)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_SECONDARY)
 			{
@@ -450,6 +529,7 @@
 				l = teamscores_label[i];
 				out = strcat(out, GetScoreLogLabel(l, f), ",");
 			}
+		if(shortString < 1)
 		for(i = 0; i < MAX_SCORE; ++i)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_PRIMARY)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_SECONDARY)
@@ -465,9 +545,11 @@
 		for(i = 0; i < MAX_TEAMSCORE; ++i)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
 				out = strcat(out, ftos(sk.(teamscores[i])), ",");
+		if(shortString < 2)
 		for(i = 0; i < MAX_TEAMSCORE; ++i)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_SECONDARY)
 				out = strcat(out, ftos(sk.(teamscores[i])), ",");
+		if(shortString < 1)
 		for(i = 0; i < MAX_TEAMSCORE; ++i)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_PRIMARY)
 			if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_SECONDARY)
@@ -476,3 +558,61 @@
 	}
 	return out;
 }
+
+float PlayerTeamScore_Compare(entity p1, entity p2)
+{
+	if(teamscores_entities_count)
+		if(p1.team != p2.team)
+		{
+			entity t1, t2;
+			t1 = teamscorekeepers[p1.team];
+			t2 = teamscorekeepers[p2.team];
+			return TeamScore_Compare(t1, t2);
+		}
+	
+	return PlayerScore_Compare(p1.scorekeeper, p2.scorekeeper);
+}
+
+float PlayerScore_Sort(.float field)
+{
+	entity p, plist, pprev, pbest, pbestprev;
+	float i;
+	plist = world;
+
+	FOR_EACH_CLIENT(p)
+		p.field = 0;
+
+	FOR_EACH_PLAYER(p) if(p.scorekeeper)
+	{
+		p.chain = plist;
+		plist = p;
+	}
+	// Now plist points to the whole list.
+
+	i = 0;
+	while(plist)
+	{
+		pprev = pbestprev = world;
+		pbest = plist;
+		for(p = plist; (p = p.chain); )
+		{
+			if(PlayerTeamScore_Compare(p, pbest) > 0)
+			{
+				pbest = p;
+				pbestprev = pprev;
+			}
+			pprev = p;
+		}
+
+		// remove pbest out of the chain
+		if(pbestprev == world)
+			plist = pbest.chain;
+		else
+			pbestprev.chain = pbest.chain;
+		pbest.chain = world;
+
+		pbest.field = ++i;
+	}
+
+	return i;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores.qh	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores.qh	2008-08-12 12:20:43 UTC (rev 4120)
@@ -41,9 +41,10 @@
 float TeamScore_AddToTeam(float t, float scorefield, float score);
 
 /**
- * Adds a score to both the player and the team.
+ * Adds a score to both the player and the team. Returns the team score if
+ * possible, otherwise the player score.
  */
-void PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score);
+float PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score);
 
 /**
  * Adds to the generic score fields for both the player and the team.
@@ -90,6 +91,9 @@
 float WinningConditionHelper_equality;   ///< 1 if and only if the top two have equal scores
 float WinningConditionHelper_winnerteam; ///< the color of the winning team, or -1 if none
 entity WinningConditionHelper_winner;    ///< the winning player, or world if none
+float WinningConditionHelper_lowerisbetter; ///< lower is better, duh
+float WinningConditionHelper_zeroisworst;   ///< zero is worst, duh
+#define WINNINGCONDITIONHELPER_LOWERISBETTER_WORST 999999999
 
 /**
  * Returns score strings for eventlog etc.
@@ -100,6 +104,13 @@
  * Labels get an appended < if the scores are better if smaller (e.g. deaths).
  * High priorities always come first.
  * Example label string: score!!,kills,deaths<,suicides<
+ * If shortString is set, only the sort keys are returned.
  */
-string GetPlayerScoreString(entity pl);
-string GetTeamScoreString(float tm);
+string GetPlayerScoreString(entity pl, float shortString);
+string GetTeamScoreString(float tm, float shortString);
+
+/**
+ * Sorts the players and stores their place in the given field, starting with
+ * 1. Non-players get 0 written into that field.
+ */
+float PlayerScore_Sort(.float field);

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -119,3 +119,32 @@
 	ScoreInfo_SetLabel_PlayerScore(SP_KH_LOSSES,    "losses",    SFL_LOWER_IS_BETTER);
 	ScoreRules_basics_end();
 }
+
+// Race stuff
+#define ST_RACE_LAPS 1
+#define SP_RACE_LAPS 4
+#define SP_RACE_FASTEST 5
+#define SP_RACE_TIME 5
+void ScoreRules_race()
+{
+	ScoreRules_basics(race_teams, 0);
+	if(race_teams)
+	{
+		ScoreInfo_SetLabel_TeamScore(  ST_RACE_LAPS,    "laps",      SFL_SORT_PRIO_PRIMARY);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_LAPS,    "laps",      SFL_SORT_PRIO_PRIMARY);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_TIME,    "time",      SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER | SFL_TIME);
+	}
+	else if(g_race_qualifying)
+	{
+		ScoreInfo_SetLabel_TeamScore(  ST_RACE_LAPS,    "laps",      0);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_LAPS,    "laps",      0);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_FASTEST, "fastest",   SFL_SORT_PRIO_PRIMARY | SFL_LOWER_IS_BETTER | SFL_TIME);
+	}
+	else
+	{
+		ScoreInfo_SetLabel_TeamScore(  ST_RACE_LAPS,    "laps",      0);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_LAPS,    "laps",      SFL_SORT_PRIO_PRIMARY);
+		ScoreInfo_SetLabel_PlayerScore(SP_RACE_TIME,    "time",      SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER | SFL_TIME);
+	}
+	ScoreRules_basics_end();
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -13,19 +13,13 @@
 			{
 				if (!(self.flags & FL_INWATER))
 				{
-					//if (self.watertype == CONTENT_LAVA)
-					//	sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM);
-					//if (self.watertype == CONTENT_WATER)
-					//	sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM);
-					//if (self.watertype == CONTENT_SLIME)
-					//	sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM);
 					self.flags = self.flags + FL_INWATER;
 					self.dmgtime = 0;
 				}
 				if (self.waterlevel != 3)
 				{
 					if(self.air_finished < time + 9)
-						PlayerSound(playersound_gasp, CHAN_AUTO, 0);
+						PlayerSound(playersound_gasp, CHAN_PLAYER, 0);
 					self.air_finished = time + 12;
 					self.dmg = 2;
 				}
@@ -46,7 +40,7 @@
 						if (self.watersound_finished < time)
 						{
 							self.watersound_finished = time + 0.5;
-							sound (self, CHAN_BODY, "player/lava.wav", 1, ATTN_NORM);
+							sound (self, CHAN_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
 						}
 						Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
 					}
@@ -55,7 +49,7 @@
 						if (self.watersound_finished < time)
 						{
 							self.watersound_finished = time + 0.5;
-							sound (self, CHAN_BODY, "player/slime.wav", 1, ATTN_NORM);
+							sound (self, CHAN_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
 						}
 						Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
 					}
@@ -111,9 +105,9 @@
 					if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
 					{
 						if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-							GlobalSound(globalsound_metalstep, CHAN_AUTO, 0);
+							GlobalSound(globalsound_metalstep, CHAN_PLAYER, 0);
 						else
-							GlobalSound(globalsound_step, CHAN_AUTO, 0);
+							GlobalSound(globalsound_step, CHAN_PLAYER, 0);
 					}
 				}
 			}

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -5,7 +5,7 @@
 {
 	self.model = self.mdl;		// restore original model
 	self.solid = SOLID_TRIGGER;	// allow it to be touched again
-	sound (self, CHAN_VOICE, "misc/itemrespawn.wav", 1, ATTN_NORM);	// play respawn sound
+	sound (self, CHAN_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
 	setorigin (self, self.origin);
 
 	//pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
@@ -185,8 +185,7 @@
 	if (!pickedup)
 		return;
 
-	sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM);
-	sound (other, CHAN_AUTO, self.item_pickupsound, 1, ATTN_NORM);
+	sound (other, CHAN_AUTO, self.item_pickupsound, VOL_BASE, ATTN_NORM);
 
 	oldself = self;
 	self = other;
@@ -414,7 +413,6 @@
 	self.bot_pickupevalfunc = pickupevalfunc;
 	self.bot_pickupbasevalue = pickupbasevalue;
 	self.mdl = itemmodel;
-	//self.noise = pickupsound;
 	self.item_pickupsound = pickupsound;
 	// let mappers override respawntime
 	if (!self.respawntime)

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -4,6 +4,8 @@
 .float pushltime;
 .float height;
 
+void() SUB_UseTargets;
+
 float trigger_push_calculatevelocity_flighttime;
 
 /*
@@ -131,7 +133,7 @@
 		{
 			// flash when activated
 			pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1);
-			sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
+			sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
 			self.pushltime = time + 0.2;
 		}
 		if(clienttype(other) == CLIENTTYPE_REAL)
@@ -155,6 +157,16 @@
 			centerprint(other, self.message);
 	}
 
+	if(self.enemy.target)
+	{
+		entity oldself;
+		oldself = self;
+		activator = other;
+		self = self.enemy;
+		SUB_UseTargets();
+		self = oldself;
+	}
+
 	// reset tracking of who pushed you into a hazard (for kill credit)
 	other.pushltime = 0;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -49,7 +49,7 @@
 
 void plat_hit_top()
 {
-	sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	self.state = 1;
 	self.think = plat_go_down;
 	self.nextthink = self.ltime + 3;
@@ -57,20 +57,20 @@
 
 void plat_hit_bottom()
 {
-	sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	self.state = 2;
 };
 
 void plat_go_down()
 {
-	sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 	self.state = 3;
 	SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom);
 };
 
 void plat_go_up()
 {
-	sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 	self.state = 4;
 	SUB_CalcMove (self.pos1, self.speed, plat_hit_top);
 };
@@ -246,7 +246,7 @@
 	if (self.wait)
 	{
 		self.nextthink = self.ltime + self.wait;
-		sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 	}
 	else
 		self.nextthink = self.ltime + 0.1;
@@ -266,7 +266,7 @@
 		self.wait = targ.wait;
 	else
 		self.wait = 0;
-	sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait);
 };
 
@@ -413,7 +413,7 @@
 	if (self.noise)
 	{
 		precache_sound(self.noise);
-		ambientsound(self.origin, self.noise, 1, ATTN_IDLE);
+		ambientsound(self.origin, self.noise, VOL_BASE, ATTN_IDLE);
 	}
 	if (!self.speed)
 		self.speed = 100;
@@ -485,7 +485,7 @@
 	if (self.noise)
 	{
 		precache_sound(self.noise);
-		ambientsound(self.origin, self.noise, 1, ATTN_IDLE);
+		ambientsound(self.origin, self.noise, VOL_BASE, ATTN_IDLE);
 	}
 	if (!self.speed)
 		self.speed = 4;
@@ -577,7 +577,7 @@
 		return;
 
 	if (self.noise != "")
-		sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 
 	self.state = STATE_UP;
 	SUB_CalcMove (self.pos2, self.speed, button_wait);
@@ -754,7 +754,7 @@
 void door_hit_top()
 {
 	if (self.noise1 != "")
-		sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	self.state = STATE_TOP;
 	if (self.spawnflags & DOOR_TOGGLE)
 		return;		// don't come down automatically
@@ -765,14 +765,14 @@
 void door_hit_bottom()
 {
 	if (self.noise1 != "")
-		sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	self.state = STATE_BOTTOM;
 };
 
 void door_go_down()
 {
 	if (self.noise2 != "")
-		sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 	if (self.max_health)
 	{
 		self.takedamage = DAMAGE_YES;
@@ -795,7 +795,7 @@
 	}
 
 	if (self.noise2 != "")
-		sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 	self.state = STATE_UP;
 	SUB_CalcMove (self.pos2, self.speed, door_hit_top);
 
@@ -920,7 +920,7 @@
 	{
 		if (other.flags & FL_CLIENT)
 			centerprint (other, self.owner.message);
-		sound (other, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
+		play2(other, "misc/talk.wav");
 	}
 };
 
@@ -1201,7 +1201,7 @@
 	// Make a sound, wait a little...
 
 	if (self.noise1 != "")
-		sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
 	self.nextthink = self.ltime + 0.1;
 
 	temp = 1 - (self.spawnflags & SECRET_1ST_LEFT);	// 1 or -1
@@ -1226,7 +1226,7 @@
 	self.dest2 = self.dest1 + v_forward * self.t_length;
 	SUB_CalcMove(self.dest1, self.speed, fd_secret_move1);
 	if (self.noise2 != "")
-		sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 };
 
 // Wait after first movement...
@@ -1235,14 +1235,14 @@
 	self.nextthink = self.ltime + 1.0;
 	self.think = fd_secret_move2;
 	if (self.noise3 != "")
-		sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 // Start moving sideways w/sound...
 void fd_secret_move2()
 {
 	if (self.noise2 != "")
-		sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 	SUB_CalcMove(self.dest2, self.speed, fd_secret_move3);
 };
 
@@ -1250,7 +1250,7 @@
 void fd_secret_move3()
 {
 	if (self.noise3 != "")
-		sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
 	if (!(self.spawnflags & SECRET_OPEN_ONCE))
 	{
 		self.nextthink = self.ltime + self.wait;
@@ -1262,7 +1262,7 @@
 void fd_secret_move4()
 {
 	if (self.noise2 != "")
-		sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 	SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
 };
 
@@ -1272,13 +1272,13 @@
 	self.nextthink = self.ltime + 1.0;
 	self.think = fd_secret_move6;
 	if (self.noise3 != "")
-		sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 void fd_secret_move6()
 {
 	if (self.noise2 != "")
-		sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
 	SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done);
 };
 
@@ -1291,7 +1291,7 @@
 		//self.th_pain = fd_secret_use;
         }
 	if (self.noise3 != "")
-		sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 void secret_blocked()
@@ -1322,7 +1322,7 @@
 	{
 		if (other.flags & FL_CLIENT)
 			centerprint (other, self.message);
-		sound (other, CHAN_BODY, "misc/talk.wav", 1, ATTN_NORM);
+		play2(other, "misc/talk.wav");
 	}
 };
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -56,18 +56,25 @@
 void Teleport_Touch (void)
 {
 	entity head;
+	entity oldself;
 
 	if (other.health < 1)
 		return;
 	if (!other.flags & FL_CLIENT)	// FIXME: Make missiles firable through the teleport too
 		return;
 
+	sound (other, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
+	pointparticles(particleeffectnum("teleport"), other.origin, '0 0 0', 1);
+
+	/*
 	// Make teleport effect where the player left
-	sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM);
+	sound (self, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
 	pointparticles(particleeffectnum("teleport"), other.origin, '0 0 0', 1);
 
 	// Make teleport effect where the player arrived
-	sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM);
+	sound (self.enemy, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
+	*/
+
 	makevectors (self.enemy.mangle);
 	pointparticles(particleeffectnum("teleport"), self.enemy.origin + v_forward * 32, '0 0 0', 1);
 
@@ -114,12 +121,20 @@
 
 	// stop player name display
 	{
-		entity oldself;
 		oldself = self;
 		self = other;
 		ClearSelectedPlayer();
 		self = oldself;
 	}
+
+	if(self.enemy.target)
+	{
+		oldself = self;
+		activator = other;
+		self = self.enemy;
+		SUB_UseTargets();
+		self = oldself;
+	}
 }
 
 void spawnfunc_info_teleport_destination (void)
@@ -168,7 +183,14 @@
 	self.solid = SOLID_TRIGGER;
 	self.movetype = MOVETYPE_NONE;
 
-	setmodel (self, self.model); // no precision needed
+	if(self.model != "")
+		setmodel (self, self.model); // no precision needed
+	else
+	{
+		// force relinking
+		setorigin(self, self.origin);
+		setsize (self, self.mins, self.maxs);
+	}
 
 	self.model = "";
 	self.modelindex = 0;

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -97,6 +97,7 @@
 	cvar_set("g_keyhunt", "0");
 	cvar_set("g_assault", "0");
 	cvar_set("g_onslaught", "0");
+	cvar_set("g_race", "0");
 	cvar_set("teamplay", "0");
 }
 
@@ -263,6 +264,30 @@
 		gamemode_name = "Onslaught";
 		teams_matter = 1;
 	}
+	else if(game == GAME_RACE || cvar("g_race"))
+	{
+		ResetGameCvars();
+		game = GAME_RACE;
+		cvar_set("g_race", "1");
+		fraglimit_override = cvar("g_race_laps_limit");
+		gamemode_name = "Race";
+
+		if(cvar("g_race_teams"))
+		{
+			ActivateTeamplay();
+			teams_matter = 1;
+			race_teams = bound(2, cvar("g_race_teams"), 4);
+		}
+		else
+		{
+			race_teams = 0;
+			teams_matter = 0;
+			if(cvar("g_race_qualifying"))
+				independent_players = 1;
+		}
+
+		ScoreRules_race();
+	}
 	else
 	{
 		// we can only assume...
@@ -298,6 +323,7 @@
 	g_keyhunt = cvar("g_keyhunt");
 	g_onslaught = cvar("g_onslaught");
 	g_assault = cvar("g_assault");
+	g_race = cvar("g_race");
 	g_arena = cvar("g_arena");
 
 	cache_mutatormsg = strzone("");
@@ -318,6 +344,12 @@
 			cvar_set("timelimit", ftos(timelimit_override));
 	}
 
+	if(g_race_qualifying)
+	{
+		race_fraglimit = cvar("fraglimit");
+		cvar_set("fraglimit", "0");
+	}
+
 	if (game == GAME_DOMINATION)//cvar("g_domination"))
 		dom_init();
 	else if (game == GAME_CTF)//cvar("g_ctf"))
@@ -337,13 +369,10 @@
 	e.think = default_delayedinit;
 }
 
-string GetClientVersionMessage(float v) {
+string GetClientVersionMessage() {
 	local string versionmsg;
-	if (v == 1) {
-		versionmsg = "^1client is too old to get versioninfo.\n\n\n### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###\n\n\nUPDATE!!! (http://www.nexuiz.com)^8";
-		// either that or someone wants to be funny
-	} else if (v != cvar("gameversion")) {
-		if(v < cvar("gameversion")) {
+	if (self.version_mismatch) {
+		if(self.version < cvar("gameversion")) {
 			versionmsg = "^3Your client version is outdated.\n\n\n### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###\n\n\nPlease update!!!^8";
 		} else {
 			versionmsg = "^3This server is using an outdated Nexuiz version.\n\n\n ### THIS SERVER IS INCOMPATIBLE AND THUS YOU CANNOT JOIN ###.^8";
@@ -357,7 +386,7 @@
 
 void PrintWelcomeMessage(entity pl)
 {
-	string s, mutator, modifications, padding;
+	string s, mutator, modifications;
 	float p;
 
 	/*if(self.welcomemessage_time > time)
@@ -447,7 +476,7 @@
 	}
 
 	local string versionmessage;
-	versionmessage = GetClientVersionMessage(self.version);
+	versionmessage = GetClientVersionMessage();
 
 	s = strcat(s, NEWLINES, "This is Nexuiz ", cvar_string("g_nexuizversion"), "\n", versionmessage);
 	s = strcat(s, "^8\n\nmatch type is ^1", mutator, gamemode_name, "^8\n");
@@ -600,6 +629,8 @@
 		// cover anything else by treating it like tdm with no teams spawned
 		if(g_keyhunt)
 			dm = kh_teams;
+		else if(g_race)
+			dm = race_teams;
 		else
 			dm = cvar("g_tdm_teams");
 		if(dm < 2)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -15,7 +15,7 @@
 		pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 		RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), IT_ELECTRO);
 	}
-	sound (self, CHAN_BODY, "weapons/electro_impact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
 	remove (self);
 }
@@ -26,7 +26,7 @@
 	org2 = findbetterlocation (self.origin, 8);
 	pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
 
-	sound (self, CHAN_BODY, "weapons/electro_impact_combo.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), IT_ELECTRO);
@@ -38,7 +38,7 @@
 	entity o;
 	if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 		remove(self);
 		return;
 	}
@@ -50,7 +50,7 @@
 				if(IsFlying(other))
 					announce(o, "announcer/male/electrobitch.ogg");
 	} else {
-		sound (self, CHAN_IMPACT, "weapons/electro_bounce.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
 	}
 }
 
@@ -59,7 +59,7 @@
 	entity o;
 	if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 		remove(self);
 		return;
 	}
@@ -122,7 +122,7 @@
 	setsize(proj, '0 0 0', '0 0 0');
 
 	// LordHavoc: disabled because no one likes this sound and it sometimes never stops due to packet loss
-	//sound (proj, CHAN_BODY, "weapons/electro_fly.wav", 1, ATTN_NORM);
+	//sound (proj, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
 }
 
 void W_Electro_Attack2()
@@ -161,7 +161,7 @@
 	proj.flags = FL_PROJECTILE;
 
 	// LordHavoc: disabled because no one likes this sound and it sometimes never stops due to packet loss
-	//sound (proj, CHAN_BODY, "weapons/electro_fly.wav", 1, ATTN_NORM);
+	//sound (proj, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
 }
 
 .float bot_secondary_electromooth;

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -4,7 +4,7 @@
 	vector	org2;
 	org2 = findbetterlocation (self.origin, 12);
 	pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
-	sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), IT_GRENADE_LAUNCHER);
@@ -17,7 +17,7 @@
 	vector	org2;
 	org2 = findbetterlocation (self.origin, 12);
 	pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
-	sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), IT_GRENADE_LAUNCHER);
@@ -49,17 +49,17 @@
 		float r;
 		r = random() * 6;
 		if(r < 1)
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce1.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
 		else if(r < 2)
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce2.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
 		else if(r < 3)
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce3.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
 		else if(r < 4)
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce4.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
 		else if(r < 5)
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce5.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
 		else
-			sound (self, CHAN_IMPACT, "weapons/grenade_bounce6.wav", 1, ATTN_NORM);
+			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
 	}
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -6,11 +6,11 @@
 	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 	b = crandom();
 	if (b<-0.7)
-		sound (self, CHAN_BODY, "weapons/hagexp1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
 	else if (b<0.4)
-		sound (self, CHAN_BODY, "weapons/hagexp2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
 	else if (b<1)
-		sound (self, CHAN_BODY, "weapons/hagexp3.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), IT_HAGAR);
@@ -26,11 +26,11 @@
 	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 	b = crandom();
 	if (b<-0.7)
-		sound (self, CHAN_BODY, "weapons/hagexp1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
 	else if (b<0.4)
-		sound (self, CHAN_BODY, "weapons/hagexp2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
 	else if (b<1)
-		sound (self, CHAN_BODY, "weapons/hagexp3.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), IT_HAGAR);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -27,7 +27,7 @@
 		RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), IT_LASER);
 	else
 		RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), IT_LASER);
-	sound (self, CHAN_BODY, "weapons/laserimpact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
 
 	remove (self);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -29,7 +29,7 @@
 	if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
 		pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1);
 	// play a sound
-	PointSound (trace_endpos, "weapons/neximpact.wav", 1, ATTN_NORM);
+	soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
 
 	if (cvar("g_use_ammunition") && !g_instagib)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-08-12 12:20:43 UTC (rev 4120)
@@ -5,7 +5,7 @@
 void W_Rocket_Explode (void)
 {
 	vector	org2;
-	sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
 	org2 = findbetterlocation (self.origin, 16);
 
 	pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
@@ -190,7 +190,7 @@
 		self.owner.lastrocket = world;
 	if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 		remove(self);
 		return;
 	}
@@ -254,7 +254,7 @@
 	missile.nextthink = time;
 	missile.cnt = time + cvar("g_balance_rocketlauncher_lifetime");
 	missile.effects = EF_LOWPRECISION;
-	sound (missile, CHAN_BODY, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+	sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4 * VOL_BASE, ATTN_NORM);
 	missile.flags = FL_PROJECTILE;
 
 	// muzzle flash for 1st person view
@@ -392,7 +392,7 @@
 		if(time > self.rl_sound)
 		{
 			self.rl_sound = time + 1;
-			sound (self, CHAN_BODY, "weapons/rocket_det.wav", 0.5, ATTN_NORM);
+			sound (self, CHAN_WEAPON, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
 		}
 		if (self.BUTTON_ATCK2)
 		if(g_laserguided_missile)
@@ -400,7 +400,7 @@
 		{
 			self.exteriorweaponentity.attack_finished_single = time + 0.4;
 			self.laser_on = !self.laser_on;
-			sound (self, CHAN_AUTO, "weapons/tink1.wav", 1, ATTN_NORM);
+			sound (self, CHAN_WEAPON, "weapons/tink1.wav", VOL_BASE, ATTN_NORM);
 		}
 	}
 	else if (req == WR_PRECACHE)

Modified: branches/nexuiz-2.0/data/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def	2008-08-12 07:55:55 UTC (rev 4119)
+++ branches/nexuiz-2.0/data/scripts/entities.def	2008-08-12 12:20:43 UTC (rev 4120)
@@ -559,6 +559,7 @@
 Teleport destination location point for trigger_teleport entities. Do not let it touch the floor, but place it slightly higher (like, 16 units above) for better flow when jumping through it.
 -------- KEYS --------
 targetname: make the trigger_teleporter point to this.
+target: target to activate when a teleporter targeting this is used
 angle: direction in which player will look when teleported, OR use
 angles: pitch and yaw when coming out of the teleporter (also specifies the direction the player will aim when coming out)
 */
@@ -640,6 +641,7 @@
 Aiming target for entities like light and trigger_push.
 -------- KEYS --------
 targetname: the entity that requires an aiming direction points to this.
+target: target to activate when a jumppad targeting this is used
 */
 
 /*QUAKED target_speaker (0 .7 .7) (-8 -8 -8) (8 8 8) 
@@ -885,3 +887,23 @@
 _celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
 */
 
+/*QUAKED trigger_race_checkpoint (0 1 0) ? NOTOUCH - CRUSH
+A checkpoint, for the race game mode. Be sure to make them quite long, so they actually catch a player reliably!
+-------- KEYS --------
+cnt: Number of the checkpoint. 0 for finish line, and at least two other checkpoints have to exist. They MUST be touched in sequential order!
+message: Death message, when touching checkpoints in the wrong order.
+targetname: Name of the checkpoint. info_player_race can target this to assign a spawn to a checkpoint. Also used for triggering a checkpoint by an event.
+-------- SPAWNFLAGS --------
+NOTOUCH: the checkpoint will not become active when touched, it HAS to be targeted
+CRUSH: the checkpoint kills when used at the wrong time
+*/
+
+/*QUAKED info_player_race (1 0.5 0) (-16 -16 -24) (16 16 45) 
+Race spawn point.
+NOTE for race_place: when the race starts after the qualifying, the player with the fastest map ends up at the info_player_race with race_place 1, and so on. If there are too many players, or if someone comes in later, he will spawn at an info_player_race with race_place not set. So for each trigger_race_checkpoint, there must be at least one corresponding info_player_race with race_place NOT set.
+-------- KEYS --------
+target: this should point to a trigger_race_checkpoint to decide when this spawning point is active. The checkpoint has to be AFTER this spawn.
+cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+race_place: if target points to the trigger_race_checkpoint with cnt 0 (finish line), this sets which place the spawn corresponds to
+*/
+




More information about the nexuiz-commits mailing list