* -crlf
-
*.0 -diff -crlf
*.1 crlf=input
*.3 crlf=input
BSDmakefile crlf=input
bsp2ent crlf=input
*.bsp -diff -crlf
-*.cache -diff -crlf
+*.cache crlf=input
*.cbp -crlf
*.cbp -diff -crlf
*.c crlf=input
*.cpp crlf=input
create crlf=input
*.cron crlf=input
+crypto-keygen-standalone -diff -crlf
*.css crlf=input
*.cvswrappers crlf=input
+*.d0ir crlf=input
*.d0pk -diff -crlf
-*.db -diff -crlf
+*.db crlf=input
+*.db.* crlf=input
+*.def2ent crlf=input
*.default crlf=input
*.def crlf=input
*.dem -diff -crlf
*.dev -crlf
dir -diff -crlf
+*.directory crlf=input
djpeg -diff -crlf
*.dll -diff -crlf
DOCS -diff -crlf
*.dylib -diff -crlf
empty -diff -crlf
*.EncoderPlugin crlf=input
+*.ent crlf=input
+etc_svc_git-daemon_run crlf=input
*.flac -diff -crlf
+*.flp -diff -crlf
*.form crlf=input
*.framegroups crlf=input
+*.fteqccfail -diff -crlf
*.game crlf=input
*.gdb crlf=input
gendox crlf=input
git-update-octopus crlf=input
*.glp crlf=input
*.glsl crlf=input
+GPL-2 crlf=input
+GPL-3 crlf=input
GPL crlf=input
*.hardwired crlf=input
*.h crlf=input
*.hs crlf=input
+*.htaccess crlf=input
*.html crlf=input
*.html-part crlf=input
*.icns -diff -crlf
*.info-2 -diff -crlf
*.info -diff -crlf
*.inl crlf=input
-*.instantaction crlf=input
+*.iOS crlf=input
*.iqm -diff -crlf
*.java crlf=input
*.jhm crlf=input
*.mkdir -diff -crlf
*.mmpz -diff -crlf
*.modules crlf=input
+*.mp3 -diff -crlf
*.nib -crlf
*.obj -crlf
OFFSETS -diff -crlf
*.ogg -diff -crlf
*.options crlf=input
+*.otf -diff -crlf
pangorc crlf=input
+*.part crlf=input
*.patch crlf=input
*.patchsets crlf=input
+*.pbxproj crlf=input
*.pc crlf=input
-*.pcx -diff -crlf
*.pfb -diff -crlf
*.pfm -diff -crlf
+*.php crlf=input
*.pk3 -diff -crlf
PkgInfo crlf=input
*.pl crlf=input
*.plist crlf=input
*.pm crlf=input
*.png -diff -crlf
+*.po crlf=input
POSITIONS -diff -crlf
+*.pot crlf=input
*.proj -crlf
*.properties crlf=input
*.psd -diff -crlf
*.qc crlf=input
*.qdt crlf=input
*.qh crlf=input
+*.rar -diff -crlf
*.rb crlf=input
*.rc2 crlf=input
*.rc -crlf
rdjpgcom -diff -crlf
*.readme crlf=input
README crlf=input
-*.rtlights -diff -crlf
+*.rtlights crlf=input
SCHEMA crlf=input
*.scm crlf=input
sdl-config crlf=input
SDL -diff -crlf
+*.sfd -diff -crlf
*.shader crlf=input
*.sh crlf=input
*.skin crlf=input
TMAP -diff -crlf
todo crlf=input
TODO crlf=input
-tooltips.db diff crlf=input
*.ttf -diff -crlf
-*.TTF -diff -crlf
*.txt crlf=input
+*.txt.* crlf=input
update-shaderlists crlf=input
*.vbs -crlf
*.vcproj -crlf
+*.vcxproj crlf=input
versionbuilder crlf=input
+*.vhost crlf=input
*.wav -diff -crlf
-*.waypoints -diff -crlf
-w crlf=input
+*.waypoints crlf=input
*.width crlf=input
*.workspace -crlf
wrjpgcom -diff -crlf
xonotic-map-compiler-autobuild crlf=input
xonotic-map-compiler crlf=input
xonotic-map-screenshot crlf=input
-xonotic-osx-agl crlf=input
xonotic-osx-sdl crlf=input
*.xpm crlf=input
+*.xrns -diff -crlf
*.zip -diff -crlf
zipdiff crlf=input
*.zym -diff -crlf
SCM := $(shell if [ -d .svn ]; then echo svn; elif [ -d ../.git ]; then echo git; fi)
-FTEQCC ?= fteqcc
PERL ?= perl
ZIP ?= 7za a -tzip -mx=9
ZIPEXCLUDE ?= -x\!*.pk3 -xr\!\.svn -x\!qcsrc
DIFF ?= diff
-FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"$(shell git describe)"' -DCVAR_POPCON
-FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
-FTEQCCFLAGS_PROGS ?=
-FTEQCCFLAGS_MENU ?=
-
# NOTE: use -DUSE_FTE instead of -TFTE here!
# It will automagically add an engine check with -TID and then change back to -TFTE
FTEQCCFLAGS_CSPROGS ?=
.PHONY: qc
qc: update-cvarcount
- $(MAKE) qc-recursive
-
-.PHONY: qc-recursive
-qc-recursive: menu.dat progs.dat csprogs.dat
+ $(MAKE) -C qcsrc
.PHONY: skin
skin: gfx/menu/default/skinvalues.txt
.PHONY: clean
clean:
- rm -f progs.dat menu.dat csprogs.dat
-
-FILES_CSPROGS = $(shell find qcsrc/client qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
-csprogs.dat: $(FILES_CSPROGS)
- @echo make[1]: Entering directory \`$(PWD)/qcsrc/client\'
- cd qcsrc/client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
-
-FILES_PROGS = $(shell find qcsrc/server qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
-progs.dat: $(FILES_PROGS)
- @echo make[1]: Entering directory \`$(PWD)/qcsrc/server\'
- cd qcsrc/server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
-
-FILES_MENU = $(shell find qcsrc/menu qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
-menu.dat: $(FILES_MENU)
- @echo make[1]: Entering directory \`$(PWD)/qcsrc/menu\'
- cd qcsrc/menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
+ $(MAKE) -C qcsrc clean
gfx/menu/default/skinvalues.txt: qcsrc/menu/skin-customizables.inc
$(PERL) qcsrc/menu/skin-customizables.inc > gfx/menu/default/skinvalues.txt
-
-.PHONY: testcase
-testcase:
- cd qcsrc/testcase && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS) -DTESTCASE="$$TESTCASE"
seta hud_configure_grid_xsize "" "snap to X * vid_conwidth"
seta hud_configure_grid_ysize "" "snap to Y * vid_conheight"
-seta scr_centerpos "" "Y position of the centerprint"
-
seta hud_panel_weapons "" "enable/disable this panel"
seta hud_panel_weapons_pos "" "position of this panel"
seta hud_panel_weapons_size "" "size of this panel"
seta hud_panel_infomessages_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
seta hud_panel_infomessages_flip "" "1 = align the items to the right"
-seta hud_panel_physics "" "enable/disable this panel, 1 = show if not observing, 2 = show always"
+seta hud_panel_physics "" "enable/disable this panel, 1 = show if not observing, 2 = show always, 3 = show only in race/cts if not observing"
seta hud_panel_physics_pos "" "position of this base of the panel"
seta hud_panel_physics_size "" "size of this panel"
seta hud_panel_physics_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_physics_progressbar "" "enable progressbar in panel (2 = only for speed; 3 = only for acceleration)"
seta hud_panel_physics_acceleration_progressbar_mode "" "0 = progressbar increases from the center to the right if the acceleration is positive, to the left if it's negative; 1 = progressbar increases from the border in the same direction for both positive and negative accelerations"
seta hud_panel_physics_text "" "show text in panel (2 = only for speed; 3 = only for acceleration)"
+
+seta hud_panel_centerprint "" "enable/disable this panel"
+seta hud_panel_centerprint_pos "" "position of this base of the panel"
+seta hud_panel_centerprint_size "" "size of this panel"
+seta hud_panel_centerprint_bg "" "if set to something else than \"\" = override default background"
+seta hud_panel_centerprint_bg_color "" "if set to something else than \"\" = override default panel background color"
+seta hud_panel_centerprint_bg_color_team "" "override panel color with team color in team based games"
+seta hud_panel_centerprint_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
+seta hud_panel_centerprint_bg_border "" "if set to something else than \"\" = override default size of border around the background"
+seta hud_panel_centerprint_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+seta hud_panel_centerprint_align "" "text alignment: 0 left, 0.5 center, 1 right"
+seta hud_panel_centerprint_flip "" "invert messages order"
+seta hud_panel_centerprint_fontscale "" "scale the text font by this amount"
+seta hud_panel_centerprint_time "" "message duration (NOTE: certain messages have a fixed duration)"
+seta hud_panel_centerprint_fadetime "" "how long a message takes to fade out (this time is included in the message duration and can't be > 1)"
--- /dev/null
+// placeholder file, is replaced by autoexec.cfg in user home directory
--- /dev/null
+// not so empty now
set g_balance_grenadelauncher_secondary_speed_z 0
set g_balance_grenadelauncher_secondary_spread 0
set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 0
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
set g_balance_grenadelauncher_secondary_refire 0.7
set g_balance_grenadelauncher_secondary_animtime 0.3
set g_balance_grenadelauncher_secondary_ammo 2
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_load 0
set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
set g_balance_hagar_secondary_load_max 4
set g_balance_hagar_secondary_load_hold 0
set g_balance_hagar_secondary_load_releasedeath 1
set g_balance_tuba_edgedamage 0
set g_balance_tuba_radius 200
set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
// }}}
// {{{ fireball
set g_balance_fireball_primary_ammo 40
set g_balance_grenadelauncher_secondary_speed_z 0
set g_balance_grenadelauncher_secondary_spread 0
set g_balance_grenadelauncher_secondary_lifetime 3
-set g_balance_grenadelauncher_secondary_lifetime2 0.65
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
set g_balance_grenadelauncher_secondary_refire 0.8
set g_balance_grenadelauncher_secondary_animtime 0.3
set g_balance_grenadelauncher_secondary_ammo 2
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_load 0
set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
set g_balance_hagar_secondary_load_max 4
set g_balance_hagar_secondary_load_hold 0
set g_balance_hagar_secondary_load_releasedeath 1
set g_balance_tuba_edgedamage 0
set g_balance_tuba_radius 200
set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
// }}}
// {{{ fireball
set g_balance_fireball_primary_ammo 40
set g_balance_grenadelauncher_secondary_speed_z 0
set g_balance_grenadelauncher_secondary_spread 0
set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 1
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 1
set g_balance_grenadelauncher_secondary_refire 0.6
set g_balance_grenadelauncher_secondary_animtime 0.3
set g_balance_grenadelauncher_secondary_ammo 2
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_load 0
set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
set g_balance_hagar_secondary_load_max 4
set g_balance_hagar_secondary_load_hold 0
set g_balance_hagar_secondary_load_releasedeath 1
set g_balance_tuba_edgedamage 0
set g_balance_tuba_radius 200
set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
// }}}
// {{{ fireball
set g_balance_fireball_primary_ammo 5
// }}}
// {{{ misc
-set g_balance_selfdamagepercent 0.75
+set g_balance_selfdamagepercent 0.65
set g_balance_weaponswitchdelay 0.15
set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
set g_weaponratefactor 1 "weapon fire rate multiplier"
set g_balance_uzi_burst_ammo 3
set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 16
+set g_balance_uzi_first_damage 14
set g_balance_uzi_first_force 5
set g_balance_uzi_first_spread 0.03
-set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_refire 0.4
set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 14
+set g_balance_uzi_sustained_damage 12
set g_balance_uzi_sustained_force 5
set g_balance_uzi_sustained_spread 0.04
set g_balance_uzi_sustained_refire 0.1
set g_balance_grenadelauncher_secondary_speed_up 150
set g_balance_grenadelauncher_secondary_speed_z 0
set g_balance_grenadelauncher_secondary_spread 0.02
-set g_balance_grenadelauncher_secondary_lifetime 1
-set g_balance_grenadelauncher_secondary_lifetime2 0
+set g_balance_grenadelauncher_secondary_lifetime 5
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
set g_balance_grenadelauncher_secondary_refire 0.7
set g_balance_grenadelauncher_secondary_animtime 0.3
set g_balance_grenadelauncher_secondary_ammo 2
// {{{ nex
set g_balance_nex_primary_damage 90
set g_balance_nex_primary_force 400
-set g_balance_nex_primary_refire 1.25
-set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_refire 1.5
+set g_balance_nex_primary_animtime 0.4
set g_balance_nex_primary_ammo 6
set g_balance_nex_primary_damagefalloff_mindist 0 // 1000 For tZork ;3
set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
set g_balance_minstanex_reload_time 2
// }}}
// {{{ hagar
-set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 15
+set g_balance_hagar_primary_damage 25
+set g_balance_hagar_primary_edgedamage 12.5
set g_balance_hagar_primary_force 50
-set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.05
+set g_balance_hagar_primary_radius 60
+set g_balance_hagar_primary_spread 0.04
set g_balance_hagar_primary_speed 2000
set g_balance_hagar_primary_lifetime 5
set g_balance_hagar_primary_refire 0.15
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_load 1
set g_balance_hagar_secondary_load_speed 0.5
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
set g_balance_hagar_secondary_load_max 4
set g_balance_hagar_secondary_load_hold 2.5
set g_balance_hagar_secondary_load_releasedeath 0
set g_balance_hagar_secondary_edgedamage 20
set g_balance_hagar_secondary_force 50
set g_balance_hagar_secondary_radius 80
-set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_spread 0.06
set g_balance_hagar_secondary_speed 2000
set g_balance_hagar_secondary_lifetime_min 10
set g_balance_hagar_secondary_lifetime_rand 0
set g_balance_rocketlauncher_damage 80
set g_balance_rocketlauncher_edgedamage 40
set g_balance_rocketlauncher_force 400
-set g_balance_rocketlauncher_radius 100
+set g_balance_rocketlauncher_radius 110
set g_balance_rocketlauncher_speed 1500
set g_balance_rocketlauncher_speedaccel 1500
set g_balance_rocketlauncher_speedstart 800
set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
set g_balance_rocketlauncher_remote_damage 70
set g_balance_rocketlauncher_remote_edgedamage 35
-set g_balance_rocketlauncher_remote_radius 100
+set g_balance_rocketlauncher_remote_radius 110
set g_balance_rocketlauncher_remote_force 400
set g_balance_rocketlauncher_reload_ammo 0 //default: 25
set g_balance_rocketlauncher_reload_time 2
set g_balance_rifle_bursttime 0
set g_balance_rifle_primary_tracer 1
set g_balance_rifle_primary_shots 1
-set g_balance_rifle_primary_damage 30
-set g_balance_rifle_primary_headshotaddeddamage 30
+set g_balance_rifle_primary_damage 40
+set g_balance_rifle_primary_headshotaddeddamage 40
set g_balance_rifle_primary_spread 0
set g_balance_rifle_primary_force 100
set g_balance_rifle_primary_speed 40000
set g_balance_rifle_secondary_tracer 0
set g_balance_rifle_secondary_shots 4
set g_balance_rifle_secondary_damage 10
-set g_balance_rifle_secondary_headshotaddeddamage 10
-set g_balance_rifle_secondary_spread 0.02
+set g_balance_rifle_secondary_headshotaddeddamage 20
+set g_balance_rifle_secondary_spread 0.04
set g_balance_rifle_secondary_force 50
set g_balance_rifle_secondary_speed 20000
set g_balance_rifle_secondary_lifetime 5
set g_balance_tuba_edgedamage 0
set g_balance_tuba_radius 200
set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
// }}}
// {{{ fireball // this is a superweapon -- lets make it behave as one.
set g_balance_fireball_primary_ammo 20
set g_balance_grenadelauncher_secondary_speed_z 0
set g_balance_grenadelauncher_secondary_spread 0
set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 0
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
set g_balance_grenadelauncher_secondary_refire 0.7
set g_balance_grenadelauncher_secondary_animtime 0.3
set g_balance_grenadelauncher_secondary_ammo 2
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_load 0
set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
set g_balance_hagar_secondary_load_max 4
set g_balance_hagar_secondary_load_hold 0
set g_balance_hagar_secondary_load_releasedeath 1
set g_balance_tuba_edgedamage 0
set g_balance_tuba_radius 200
set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
// }}}
// {{{ fireball
set g_balance_fireball_primary_ammo 40
#!/bin/sh
+case "$1" in
+ pot)
+ mode=pot
+ mail=true
+ ;;
+ po)
+ mode=po
+ mail=true
+ language=
+ ;;
+ '')
+ echo "Sorry, you are not supposed to use this script."
+ echo "This script is solely for use by the Xonotic Core Team."
+ echo "Unauthorized use of it can cause HIGHLY annoying merge"
+ echo "conflicts."
+ exit 1
+ ;;
+ *)
+ mode=po
+ mail=false
+ language=$1
+ ;;
+esac
+
for VM in menu csprogs; do
case "$VM" in
csprogs)
VMD=$VM
;;
esac
- {
- find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
- find qcsrc/common -type f -not -name \*.po -not -name \*.txt
- find qcsrc/server -type f -name w_\*.qc
- } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
- for X in "$VM".dat.*.po; do
- [ -f "$X" ] || continue
- for Y in ~/check-translations/"$X".*; do
- [ -f "$Y" ] || continue
- msgcat -F --use-first "$Y" "$X" > "$X".new
- mv "$X".new "$X"
- done
- msgmerge -F -U "$X" "$VM".dat.pot >&2
- msgattrib --untranslated "$X" | grep . > "$X".untranslated || rm -f "$X".untranslated
- msgattrib --fuzzy "$X" | grep . > "$X".fuzzy || rm -f "$X".fuzzy
- nu=$((`grep -c ^#: "$X".untranslated` + 0))
- nf=$((`grep -c ^#: "$X".fuzzy` + 0))
- n=$(($nu + $nf))
- if [ $n -gt 0 ]; then
- echo "TODO for translation $X:"
- echo "Untranslated: $nu"
- echo "Fuzzy: $nf"
- ltr=`grep '^"Last-Translator: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
- ltm=`grep '^"Language-Team: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
- echo "Translators: $ltr, $ltm"
- case "$ltr" in
- '')
- to=$ltm
- cc=
- ;;
- *)
- to=$ltr
- if [ x"$ltr" = x"$ltm" ]; then
- cc=
- else
- cc=$ltm
- fi
- ;;
- esac
- if [ -n "$to" ]; then
- echo "To: $to"
- fi
- if [ -n "$cc" ]; then
- echo "Cc: $cc"
+
+ if [ x"$mode" = x"pot" ]; then
+ {
+ find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
+ find qcsrc/common -type f -not -name \*.po -not -name \*.txt
+ find qcsrc/server -type f -name w_\*.qc
+ } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
+ fi
+
+ if [ x"$mode" = x"po" ]; then
+ for X in "$VM".dat.*.po; do
+ [ -f "$X" ] || continue
+ if [ -n "$language" ]; then
+ if [ x"${X#*.dat.}" != x"$language.po" ]; then
+ continue
+ fi
fi
- if [ -n "$to" ]; then
- while :; do
- echo "Send mail? [y/n]"
- read -r yesno
- case "$yesno" in
- y)
- attach=
- if [ $nu -gt 0 ]; then
- attach="$attach $X.untranslated"
- fi
- if [ $nf -gt 0 ]; then
- attach="$attach $X.fuzzy"
- fi
- {
- cat <<EOF
+ for Y in ~/check-translations/"$X".*; do
+ [ -f "$Y" ] || continue
+ msgcat -F --use-first "$Y" "$X" > "$X".new
+ mv "$X".new "$X"
+ done
+ msgmerge -F -U "$X" "$VM".dat.pot >&2
+ msgattrib --untranslated "$X" | grep . > "$X".untranslated || rm -f "$X".untranslated
+ msgattrib --fuzzy "$X" | grep . > "$X".fuzzy || rm -f "$X".fuzzy
+ nu=$((`grep -c ^#: "$X".untranslated` + 0))
+ nf=$((`grep -c ^#: "$X".fuzzy` + 0))
+ n=$(($nu + $nf))
+ if [ $n -gt 0 ]; then
+ echo "TODO for translation $X:"
+ echo "Untranslated: $nu"
+ echo "Fuzzy: $nf"
+ ltr=`grep '^"Last-Translator: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
+ ltm=`grep '^"Language-Team: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
+ echo "Translators: $ltr, $ltm"
+ case "$ltr" in
+ '')
+ to=$ltm
+ cc=
+ ;;
+ *)
+ to=$ltr
+ if [ x"$ltr" = x"$ltm" ]; then
+ cc=
+ else
+ cc=$ltm
+ fi
+ ;;
+ esac
+ if [ -n "$to" ]; then
+ echo "To: $to"
+ fi
+ if [ -n "$cc" ]; then
+ echo "Cc: $cc"
+ fi
+ if [ -n "$to" ]; then
+ while $mail; do
+ echo "Send mail? [y/n]"
+ read -r yesno
+ case "$yesno" in
+ y)
+ attach=
+ if [ $nu -gt 0 ]; then
+ attach="$attach $X.untranslated"
+ fi
+ if [ $nf -gt 0 ]; then
+ attach="$attach $X.fuzzy"
+ fi
+ {
+ cat <<EOF
Hi,
as you provided us with translations in the past, we kindly ask you
please tell us in a reply to this message.
EOF
- if [ $nu -gt 0 ]; then
- cat <<EOF
+ if [ $nu -gt 0 ]; then
+ cat <<EOF
Attached to this message is a file
$X.untranslated
with $nu yet to be translated messages. Please translate them and reply
with the file containing the translations in the "msgstr" fields.
EOF
- fi
- if [ $nf -gt 0 ]; then
- cat <<EOF
+ fi
+ if [ $nf -gt 0 ]; then
+ cat <<EOF
Attached to this message is a file
$X.fuzzy
with $nf automatically generated translations. Please verify and/or fix
them and reply with the file having been verified by you.
EOF
- fi
- cat <<EOF
+ fi
+ cat <<EOF
Thanks in advance,
Team Xonotic
EOF
- } | mutt \
- -e "set from=\"divVerent@xonotic.org\"" \
- -e "set use_from=yes" \
- -e "set use_envelope_from=yes" \
- -s "Need update for translations: $X" \
- -c "$cc" \
- -b "divVerent@xonotic.org" \
- -a $attach -- \
- "$to"
- break
- ;;
- n)
- break
- ;;
- esac
- done
+ } | mutt \
+ -e "set from=\"divVerent@xonotic.org\"" \
+ -e "set use_from=yes" \
+ -e "set use_envelope_from=yes" \
+ -s "Need update for translations: $X" \
+ -c "$cc" \
+ -b "divVerent@xonotic.org" \
+ -a $attach -- \
+ "$to"
+ break
+ ;;
+ n)
+ break
+ ;;
+ esac
+ done
+ fi
fi
- fi
- done
- for X in "$VM".dat.*.po.disabled; do
- [ -f "$X" ] || continue
- msgmerge -F -U "$X" "$VM".dat.pot >/dev/null 2>&1
- done
+ done
+
+ for X in "$VM".dat.*.po.disabled; do
+ [ -f "$X" ] || continue
+ if [ -n "$language" ]; then
+ if [ x"${X#*.dat.}" != x"$language.po" ]; then
+ continue
+ fi
+ fi
+ msgmerge -F -U "$X" "$VM".dat.pot >/dev/null 2>&1
+ done
+ fi
done
-// load engine's idea of vid_con*
-seta menu_vid_conwidth $vid_conwidth
-seta menu_vid_conheight $vid_conheight
+// updates for Nexuiz $OLD to 2.4 (also run on first startup, so be careful with what you put in here)
+alias _update_configversion_0 "_update_configversion_1"
-// fix cvar settings of the engine that Xonotic is not compatible with
-alias _update_generic_r_dynamic_0 "r_dynamic 1; r_shadow_realtime_dlight 1"
-alias _update_generic_r_dynamic_1 ""
-alias _update_generic "_update_generic_r_dynamic_$r_dynamic"
+// Updates for Nexuiz 2.4.1 to 2.4.2
+alias _update_configversion_1 "_update_configversion_2"
-// updates for ... to 2.4 (also run on first startup, so be careful with what you put in here)
-alias _update_configversion_0 ""
+// Updates for Nexuiz to Xonotic
+alias _update_configversion_2 "volume 1; cl_gunalign 1; _update_configversion_3"
-// Updates for 2.4.1 to 2.4.2
-alias _update_configversion_1 ""
+// Updates for gunalign fix
+alias _update_configversion_3 "cl_gunalign 3; menu_cl_gunalign 3; _update_configversion_4"
-// Updates for 2.5 to ...
-alias _update_configversion_2 ""
+// place to put further updates
+alias _update_configversion_4 "snd_entchannel0volume 1; snd_entchannel1volume 1; snd_entchannel2volume 1; snd_entchannel3volume 1; snd_entchannel4volume 1; snd_entchannel5volume 1; snd_entchannel6volume 1; snd_entchannel7volume 1; snd_playerchannel0volume 1; snd_playerchannel1volume 1; snd_playerchannel2volume 1; snd_playerchannel3volume 1; snd_playerchannel4volume 1; snd_playerchannel5volume 1; snd_playerchannel6volume 1; snd_playerchannel7volume 1; snd_worldchannel0volume 1; snd_worldchannel1volume 1; snd_worldchannel2volume 1; snd_worldchannel3volume 1; snd_worldchannel4volume 1; snd_worldchannel5volume 1; snd_worldchannel6volume 1; snd_worldchannel7volume 1; snd_csqcchannel0volume 1; snd_csqcchannel1volume 1; snd_csqcchannel2volume 1; snd_csqcchannel3volume 1; snd_csqcchannel4volume 1; snd_csqcchannel5volume 1; snd_csqcchannel6volume 1; snd_csqcchannel7volume 1; _update_configversion_5"
-_update_configversion_$g_configversion
-_update_generic
+// fix for common broken config for unknown reason
+alias _update_configversion_5 "r_shadow_realtime_world_lightmaps 1; _update_configversion_6"
+
+// some people have freetype issues, weird
+alias _update_configversion_6 "r_font_disable_freetype 0; utf8_enable 1; _update_configversion_7"
-set g_configversion 2
+// place to put further updates
+alias _update_configversion_7 ""
+
+_update_configversion_$g_configversion
-// we now use mastervolume
-volume 1
+set g_configversion 7
msgstr ""
"Project-Id-Version: 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:06+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
"PO-Revision-Date: 2011-04-20 10:46+0200\n"
"Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
"Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
msgid "^4CSQC Build information: ^1%s\n"
msgstr "^4CSQC Build-Information: ^1%s (deutsch)\n"
-#: qcsrc/client/Main.qc:232 qcsrc/client/Main.qc:248
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
#, c-format
msgid "trying to switch to unsupported team %d\n"
msgstr "es wurde versucht, in das nicht unterstützte Team %d zu wechseln"
-#: qcsrc/client/Main.qc:364 qcsrc/client/scoreboard.qc:241
+#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
msgid "Usage:\n"
msgstr "Syntax:\n"
-#: qcsrc/client/Main.qc:365
+#: qcsrc/client/Main.qc:370
msgid "hud_save configname (saves to hud_skinname_configname.cfg)\n"
msgstr "hud_save configname (speichert als hud_skinname_configname.cfg)\n"
-#: qcsrc/client/Main.qc:512
+#: qcsrc/client/Main.qc:494
msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
msgstr "Syntax: cl_cmd BEFEHL..., wobei mögliche Befehle sind:\n"
-#: qcsrc/client/Main.qc:513
+#: qcsrc/client/Main.qc:495
msgid " settemp cvar value\n"
msgstr " settemp Cvar Wert\n"
-#: qcsrc/client/Main.qc:514
+#: qcsrc/client/Main.qc:496
msgid " scoreboard_columns_set ...\n"
msgstr " scoreboard_columns_set ...\n"
-#: qcsrc/client/Main.qc:515
+#: qcsrc/client/Main.qc:497
msgid " scoreboard_columns_help\n"
msgstr " scoreboard_columns_help\n"
-#: qcsrc/client/Main.qc:720
-msgid "A CSQC entity changed its owner!\n"
-msgstr "Ein CSQC-Entity hat seinen Besitzer gewechselt!\n"
+#: qcsrc/client/Main.qc:726
+#, c-format
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Besitzer gewechselt! (edict: %d, classname: %s)\n"
-#: qcsrc/client/Main.qc:934
-msgid "A CSQC entity changed its type!\n"
-msgstr "Ein CSQC-Entity hat seinen Typ gewechselt!\n"
+#: qcsrc/client/Main.qc:964
+#, c-format
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Typ gewechselt! (edict: %d, classname: %s)\n"
-#: qcsrc/client/Main.qc:972
+#: qcsrc/client/Main.qc:1005
#, c-format
-msgid "unknown entity type in CSQC_Ent_Update: %d\n"
-msgstr "unbekannter Entity-Typ in CSQC_Ent_Update: %d\n"
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
+msgstr ""
+"Unbekannter Entity-Typ in CSQC_Ent_Update (enttype: %d, edict: %d, "
+"classname: %s)\n"
-#: qcsrc/client/Main.qc:1444
+#: qcsrc/client/Main.qc:1451
#, c-format
msgid "%s (not bound)"
msgstr "%s (nicht zugewiesen)"
-#: qcsrc/client/Main.qc:1449 qcsrc/client/hud.qc:407
+#: qcsrc/client/Main.qc:1456 qcsrc/client/hud.qc:230
#, c-format
msgid "%s (%s)"
msgstr "%s (%s)"
msgid "Awaiting orders..."
msgstr "Warten auf Auftrag..."
-#: qcsrc/client/hud.qc:337
+#: qcsrc/client/hud.qc:160
msgid "1st"
msgstr "1."
-#: qcsrc/client/hud.qc:339
+#: qcsrc/client/hud.qc:162
msgid "2nd"
msgstr "2."
-#: qcsrc/client/hud.qc:341
+#: qcsrc/client/hud.qc:164
msgid "3rd"
msgstr "3."
-#: qcsrc/client/hud.qc:343
+#: qcsrc/client/hud.qc:166
#, c-format
msgid "%dth"
msgstr "%d."
-#: qcsrc/client/hud.qc:375
+#: qcsrc/client/hud.qc:198
#, c-format
msgid " (-%dL)"
msgstr " (-%dR)"
-#: qcsrc/client/hud.qc:380
+#: qcsrc/client/hud.qc:203
#, c-format
msgid " (+%dL)"
msgstr " (+%dR)"
-#: qcsrc/client/hud.qc:396
+#: qcsrc/client/hud.qc:219
msgid "Start line"
msgstr "Start"
-#: qcsrc/client/hud.qc:398 qcsrc/client/hud.qc:402
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
msgid "Finish line"
msgstr "Ziel"
-#: qcsrc/client/hud.qc:400
+#: qcsrc/client/hud.qc:223
#, c-format
msgid "Intermediate %d"
msgstr "Zwischenzeit %d"
-#: qcsrc/client/hud.qc:409
+#: qcsrc/client/hud.qc:232
#, c-format
msgid "%s (%s %s)"
msgstr "%s (%s %s)"
-#: qcsrc/client/hud.qc:553
-#, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
-msgstr ""
-"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
-"abgelegt)\n"
-
-#: qcsrc/client/hud.qc:557
-#, c-format
-msgid "^1Couldn't write to %s\n"
-msgstr "^1Konnte nicht nach %s schreiben\n"
-
-#: qcsrc/client/hud.qc:1837
+#: qcsrc/client/hud.qc:772
msgid "Out of ammo"
msgstr "Keine Munition mehr."
-#: qcsrc/client/hud.qc:1841
+#: qcsrc/client/hud.qc:776
msgid "Don't have"
msgstr "nicht vorhanden"
-#: qcsrc/client/hud.qc:1845
+#: qcsrc/client/hud.qc:780
msgid "Unavailable"
msgstr "nicht verfügbar"
-#: qcsrc/client/hud.qc:2696
+#: qcsrc/client/hud.qc:1520
#, c-format
msgid "^1%s^1 couldn't take it anymore\n"
msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
-#: qcsrc/client/hud.qc:2700 qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
#, c-format
msgid "^1%s^1 died\n"
msgstr "^1%s^1 ist gestorben\n"
-#: qcsrc/client/hud.qc:2704
+#: qcsrc/client/hud.qc:1528
#, c-format
msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
-#: qcsrc/client/hud.qc:2708
+#: qcsrc/client/hud.qc:1532
#, c-format
msgid "^1%s^1 thought they found a nice camping ground\n"
msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
-#: qcsrc/client/hud.qc:2712
+#: qcsrc/client/hud.qc:1536
#, c-format
msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
-#: qcsrc/client/hud.qc:2716
+#: qcsrc/client/hud.qc:1540
#, c-format
msgid "^1%s^1 unfairly eliminated themself\n"
msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
-#: qcsrc/client/hud.qc:2720
+#: qcsrc/client/hud.qc:1544
#, c-format
msgid "^1%s^1 burned to death\n"
msgstr "^1%s^1 brannte zu Tode\n"
-#: qcsrc/client/hud.qc:2724
+#: qcsrc/client/hud.qc:1548
#, c-format
msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
msgstr ""
"^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
-#: qcsrc/client/hud.qc:2728
+#: qcsrc/client/hud.qc:1552
#, c-format
msgid "^1%s^1 ended it all after a %d kill spree\n"
msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
-#: qcsrc/client/hud.qc:2745
+#: qcsrc/client/hud.qc:1569
#, c-format
msgid "^1%s^1 took action against a team mate\n"
msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
-#: qcsrc/client/hud.qc:2747
+#: qcsrc/client/hud.qc:1571
#, c-format
msgid "^1%s^1 mows down a team mate\n"
msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
-#: qcsrc/client/hud.qc:2752
+#: qcsrc/client/hud.qc:1576
#, c-format
msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
msgstr ""
"^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem "
"Mitspieler aus\n"
-#: qcsrc/client/hud.qc:2754
+#: qcsrc/client/hud.qc:1578
#, c-format
msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
-#: qcsrc/client/hud.qc:2758
+#: qcsrc/client/hud.qc:1582
#, c-format
msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
msgstr ""
"^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
-#: qcsrc/client/hud.qc:2760
+#: qcsrc/client/hud.qc:1584
#, c-format
msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
-#: qcsrc/client/hud.qc:2764
+#: qcsrc/client/hud.qc:1588
#, c-format
msgid "^1%s^1 drew first blood\n"
msgstr "^1%s^1 war der Erste\n"
-#: qcsrc/client/hud.qc:2768
+#: qcsrc/client/hud.qc:1592
#, c-format
msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
-#: qcsrc/client/hud.qc:2770
+#: qcsrc/client/hud.qc:1594
#, c-format
msgid "^1%s^1 was telefragged by %s\n"
msgstr "^1%s^1 wurde von %s^1 telefragged\n"
-#: qcsrc/client/hud.qc:2775
+#: qcsrc/client/hud.qc:1599
#, c-format
msgid "^1%s^1 was drowned by %s\n"
msgstr "^1%s^1 wurde von %s^1 etränkt\n"
-#: qcsrc/client/hud.qc:2780
+#: qcsrc/client/hud.qc:1604
#, c-format
msgid "^1%s^1 was slimed by %s\n"
msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
-#: qcsrc/client/hud.qc:2785
+#: qcsrc/client/hud.qc:1609
#, c-format
msgid "^1%s^1 was cooked by %s\n"
msgstr "^1%s^1 wurde von %s^1 gebraten\n"
-#: qcsrc/client/hud.qc:2790
+#: qcsrc/client/hud.qc:1614
#, c-format
msgid "^1%s^1 was grounded by %s\n"
msgstr "^1%s^1 wurde von %s^1 geerdet\n"
-#: qcsrc/client/hud.qc:2795
+#: qcsrc/client/hud.qc:1619
#, c-format
msgid "^1%s^1 was shot into space by %s\n"
msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
-#: qcsrc/client/hud.qc:2800
+#: qcsrc/client/hud.qc:1624
#, c-format
msgid "^1%s^1 was conserved by %s\n"
msgstr "^1%s^1 wurde von %s^1 konserviert\n"
-#: qcsrc/client/hud.qc:2806
+#: qcsrc/client/hud.qc:1630
#, c-format
msgid "^1%s^1 was thrown into a world of hurt by %s\n"
msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
-#: qcsrc/client/hud.qc:2810
+#: qcsrc/client/hud.qc:1634
#, c-format
msgid "^1%s^1 was crushed by %s\n"
msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
-#: qcsrc/client/hud.qc:2814
+#: qcsrc/client/hud.qc:1638
#, c-format
msgid "^1%s^1 got shredded by %s\n"
msgstr "^1%s^1 wurde von %s^1 zerstückelt\n"
-#: qcsrc/client/hud.qc:2818
+#: qcsrc/client/hud.qc:1642
#, c-format
msgid "^1%s^1 was blasted to bits by %s\n"
msgstr "^1%s^1 wurde von %s^1 in die Luft gejagt\n"
-#: qcsrc/client/hud.qc:2822
+#: qcsrc/client/hud.qc:1646
#, c-format
msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
msgstr "^1%s^1 wurde von der Explosion von %s^1s Fahrzeug erwischt\n"
-#: qcsrc/client/hud.qc:2826
+#: qcsrc/client/hud.qc:1650
#, c-format
msgid "^1%s^1 was bolted down by %s\n"
msgstr "^1%s^1 wurde von %s^1 niedergeschmettert\n"
-#: qcsrc/client/hud.qc:2830
+#: qcsrc/client/hud.qc:1654
#, c-format
msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
msgstr "^1%s^1 fand keine Deckung vor %s^1s Raketen\n"
-#: qcsrc/client/hud.qc:2834
+#: qcsrc/client/hud.qc:1658
#, c-format
msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
msgstr "^1%s^1 starb zusammen mit %s^1's Wakizashi.\n"
-#: qcsrc/client/hud.qc:2838
+#: qcsrc/client/hud.qc:1662
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
+msgstr "^1%s^1 wurde von %s^1 in die Hölle geschossen\n"
+
+#: qcsrc/client/hud.qc:1666
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
+msgstr "^1%s^1 wurde von %s^1 total zerstört\n"
+
+#: qcsrc/client/hud.qc:1670
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgstr "^1%s^1 starb zusammen mit %s^1's Raptor.\n"
+
+#: qcsrc/client/hud.qc:1674
#, c-format
msgid "^1%s^1 was pushed into the line of fire by %s\n"
msgstr "^1%s^1 wurde von %s^1 ins offene Feuer geschubst\n"
-#: qcsrc/client/hud.qc:2842
+#: qcsrc/client/hud.qc:1678
#, c-format
msgid "^1%s^1 was pushed into an accident by %s\n"
msgstr "^1%s^1 wurde von %s^1 in einen unglücklichen Unfall geschubst\n"
-#: qcsrc/client/hud.qc:2846
+#: qcsrc/client/hud.qc:1682
#, c-format
msgid "^1%s^1 was unfairly eliminated by %s\n"
msgstr "^1%s^1 wurde von %s auf unfaire Weise erledigt\n"
-#: qcsrc/client/hud.qc:2850
+#: qcsrc/client/hud.qc:1686
#, c-format
msgid "^1%s^1 was burnt to death by %s\n"
msgstr "^1%s^1 wurde von %s verbrannt\n"
-#: qcsrc/client/hud.qc:2862
+#: qcsrc/client/hud.qc:1698
#, c-format
msgid "^1%s^1 was fragged by %s\n"
msgstr "^1%s^1 wurde von %s^1 gefraggt\n"
-#: qcsrc/client/hud.qc:2867
+#: qcsrc/client/hud.qc:1703
#, c-format
msgid "^1%s^1's %s scoring spree was ended by %s\n"
msgstr "^1%s^1's Punkte-Folge wurde von %s^1 beendet\n"
-#: qcsrc/client/hud.qc:2869
+#: qcsrc/client/hud.qc:1705
#, c-format
msgid "^1%s^1's %s kill spree was ended by %s\n"
msgstr "^1%s^1's Kill-Spree wurde von %s^1 beendet\n"
-#: qcsrc/client/hud.qc:2872
+#: qcsrc/client/hud.qc:1708
#, c-format
msgid "^1%s^1 made %s scores in a row\n"
msgstr "^1%s^1 machte %s Punkte hintereinander\n"
-#: qcsrc/client/hud.qc:2874
+#: qcsrc/client/hud.qc:1710
#, c-format
msgid "^1%s^1 has %s frags in a row\n"
msgstr "^1%s^1 hat %s Frags hintereinander\n"
-#: qcsrc/client/hud.qc:2877
+#: qcsrc/client/hud.qc:1713
#, c-format
msgid "%s^7 made a ^1TRIPLE SCORE\n"
msgstr "%s^7 hat einen ^1TRIPLE SCORE\n"
-#: qcsrc/client/hud.qc:2879
+#: qcsrc/client/hud.qc:1715
#, c-format
msgid "%s^7 made a ^1TRIPLE FRAG\n"
msgstr "%s^7 hat einen ^1TRIPLE FRAG\n"
-#: qcsrc/client/hud.qc:2882
+#: qcsrc/client/hud.qc:1718
#, c-format
msgid "%s^7 unleashes ^1SCORING RAGE\n"
msgstr "%s^7 hat ^1PUNKTE-RASEN\n"
-#: qcsrc/client/hud.qc:2884
+#: qcsrc/client/hud.qc:1720
#, c-format
msgid "%s^7 unleashes ^1RAGE\n"
msgstr "%s^7 ^1RAST VOR ZORN\n"
-#: qcsrc/client/hud.qc:2887
+#: qcsrc/client/hud.qc:1723
#, c-format
msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
msgstr "%s^7 hat ^1ZEHN PUNKTE HINTEREINANDER!\n"
-#: qcsrc/client/hud.qc:2889
+#: qcsrc/client/hud.qc:1725
#, c-format
msgid "%s^7 starts the ^1MASSACRE!\n"
msgstr "%s^7 beginnt das ^1MASSAKER!\n"
-#: qcsrc/client/hud.qc:2892
+#: qcsrc/client/hud.qc:1728
#, c-format
msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
msgstr "%s^7 hat ^1FÜNFZEHN PUNKTE HINTEREINANDER\n"
-#: qcsrc/client/hud.qc:2894
+#: qcsrc/client/hud.qc:1730
#, c-format
msgid "%s^7 executes ^1MAYHEM!\n"
msgstr "%s^7 erzeugt das ^1CHAOS!\n"
-#: qcsrc/client/hud.qc:2897
+#: qcsrc/client/hud.qc:1733
#, c-format
msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
msgstr "%s^7 hat ^1ZWANZIG PUNKTE HINTEREINANDER\n"
-#: qcsrc/client/hud.qc:2899
+#: qcsrc/client/hud.qc:1735
#, c-format
msgid "%s^7 is a ^1BERSERKER!\n"
msgstr "%s^7 ist ein ^1BERSERKER!\n"
-#: qcsrc/client/hud.qc:2902
+#: qcsrc/client/hud.qc:1738
#, c-format
msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
msgstr "%s^7 hat ^1FÜNFUNDZWANZIG PUNKTE HINTEREINANDER!\n"
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:1740
#, c-format
msgid "%s^7 inflicts ^1CARNAGE!\n"
msgstr "%s^7 hält ein ^1BLUTBAD!\n"
-#: qcsrc/client/hud.qc:2907
+#: qcsrc/client/hud.qc:1743
#, c-format
msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
msgstr "%s^7 hat ^1DREISSIG PUNKTE HINTEREINANDER\n"
-#: qcsrc/client/hud.qc:2909
+#: qcsrc/client/hud.qc:1745
#, c-format
msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
msgstr "%s^7 lässt die ^1APOKALYPSE^7 los!\n"
-#: qcsrc/client/hud.qc:2917
+#: qcsrc/client/hud.qc:1753
#, c-format
msgid "^1%s^1 was in the water for too long\n"
msgstr "^1%s^1 war zu lange im Wasser\n"
-#: qcsrc/client/hud.qc:2919
+#: qcsrc/client/hud.qc:1755
#, c-format
msgid "^1%s^1 drowned\n"
msgstr "^1%s^1 ertrank\n"
-#: qcsrc/client/hud.qc:2924
+#: qcsrc/client/hud.qc:1760
#, c-format
msgid "^1%s^1 was slimed\n"
msgstr "^1%s^1 wurde im Schleim versenkt\n"
-#: qcsrc/client/hud.qc:2930
+#: qcsrc/client/hud.qc:1766
#, c-format
msgid "^1%s^1 found a hot place\n"
msgstr "^1%s^1 fand einen heißen Ort\n"
-#: qcsrc/client/hud.qc:2932
+#: qcsrc/client/hud.qc:1768
#, c-format
msgid "^1%s^1 turned into hot slag\n"
msgstr "^1%s^1 verwandelte sich in heiße Schlacke\n"
-#: qcsrc/client/hud.qc:2939
+#: qcsrc/client/hud.qc:1775
#, c-format
msgid "^1%s^1 tested gravity (and it worked)\n"
msgstr "^1%s^1 probierte die Gravitation aus (und sie funktionierte)\n"
-#: qcsrc/client/hud.qc:2941
+#: qcsrc/client/hud.qc:1777
#, c-format
msgid "^1%s^1 hit the ground with a crunch\n"
msgstr "^1%s^1 landete mit einem Knall auf dem Boden\n"
-#: qcsrc/client/hud.qc:2946
+#: qcsrc/client/hud.qc:1782
#, c-format
msgid "^1%s^1 became a shooting star\n"
msgstr "^1%s^1 wurde zu einer Sternschnuppe\n"
-#: qcsrc/client/hud.qc:2952
+#: qcsrc/client/hud.qc:1788
#, c-format
msgid "^1%s^1 discovered a swamp\n"
msgstr "^1%s^1 entdeckte einen Sumpf\n"
-#: qcsrc/client/hud.qc:2954
+#: qcsrc/client/hud.qc:1790
#, c-format
msgid "^1%s^1 is now conserved for centuries to come\n"
msgstr "^1%s^1 ist jetzt für Jahrhunderte konserviert\n"
-#: qcsrc/client/hud.qc:2959
+#: qcsrc/client/hud.qc:1795
#, c-format
msgid "^1%s^1 was mowed down by a turret \n"
msgstr "^1%s^1 wurde von einem Turret niedergemäht\n"
-#: qcsrc/client/hud.qc:2971
+#: qcsrc/client/hud.qc:1807
#, c-format
msgid "^1%s^1 died in an accident\n"
msgstr "^1%s^1 starb an einem Unfall\n"
-#: qcsrc/client/hud.qc:2975
+#: qcsrc/client/hud.qc:1811
#, c-format
msgid "^1%s^1 was unfairly eliminated\n"
msgstr "^1%s^1 wurde auf unfaire Weise eliminiert\n"
-#: qcsrc/client/hud.qc:2981
+#: qcsrc/client/hud.qc:1817
#, c-format
msgid "^1%s^1 felt a little hot\n"
msgstr "^1%s^1 fand es ein wenig zu warm\n"
-#: qcsrc/client/hud.qc:2983
+#: qcsrc/client/hud.qc:1819
#, c-format
msgid "^1%s^1 burnt to death\n"
msgstr "^1%s^1 verbrannte\n"
-#: qcsrc/client/hud.qc:2990
+#: qcsrc/client/hud.qc:1826
#, c-format
msgid "^1%s^1 needs a restart\n"
msgstr "^1%s^1 braucht einen Neustart\n"
-#: qcsrc/client/hud.qc:2997
+#: qcsrc/client/hud.qc:1833
#, c-format
msgid "^1%s^1 needs a restart after a %d scoring spree\n"
msgstr "^1%s^1 braucht einen Neustart nach %d Punkten in Folge\n"
-#: qcsrc/client/hud.qc:2999
+#: qcsrc/client/hud.qc:1835
#, c-format
msgid "^1%s^1 died with a %d kill spree\n"
msgstr "^1%s^1 starb mit einer %d-Kill-Spree\n"
-#: qcsrc/client/hud.qc:3003
+#: qcsrc/client/hud.qc:1839
#, c-format
msgid "%s^7 got the %s\n"
msgstr "%s^7 bekam die %s\n"
-#: qcsrc/client/hud.qc:3006
+#: qcsrc/client/hud.qc:1842
#, c-format
msgid "%s^7 lost the %s\n"
msgstr "%s^7 verlor die %s\n"
-#: qcsrc/client/hud.qc:3009
+#: qcsrc/client/hud.qc:1845
#, c-format
msgid "%s^7 picked up the %s\n"
msgstr "%s^7 nahm sich die %s\n"
-#: qcsrc/client/hud.qc:3012
+#: qcsrc/client/hud.qc:1848
#, c-format
msgid "%s^7 returned the %s\n"
msgstr "%s^7 brachte die %s^7 zurück\n"
-#: qcsrc/client/hud.qc:3015
+#: qcsrc/client/hud.qc:1851
#, c-format
msgid "%s^7 captured the %s%s\n"
msgstr "%s^7 eroberte die %s%s\n"
-#: qcsrc/client/hud.qc:3034
+#: qcsrc/client/hud.qc:1870
#, c-format
msgid "%s^7 has picked up the ball!\n"
msgstr "%s^7 hat den Ball genommen!\n"
-#: qcsrc/client/hud.qc:3039
+#: qcsrc/client/hud.qc:1875
#, c-format
msgid "%s^7 has dropped the ball!\n"
msgstr "%s^7 hat den Ball verloren!\n"
-#: qcsrc/client/hud.qc:3052
+#: qcsrc/client/hud.qc:1886
#, c-format
msgid "You are now on: %s"
msgstr "Du bist jetzt im: %s"
-#: qcsrc/client/hud.qc:3054
+#: qcsrc/client/hud.qc:1888
#, c-format
msgid ""
"You have been moved into a different team to improve team balance\n"
"Du wurdest in ein anderes Team verschoben, um Team-Balance zu verbessern.\n"
"Du bist jetzt im: %s"
-#: qcsrc/client/hud.qc:3057
+#: qcsrc/client/hud.qc:1891
msgid "^1Reconsider your tactics, camper!"
msgstr "^1Ändere dein Verhalten, Camper!"
-#: qcsrc/client/hud.qc:3059
+#: qcsrc/client/hud.qc:1893
msgid "^1Die camper!"
msgstr "^1Stirb, Camper!"
-#: qcsrc/client/hud.qc:3062
+#: qcsrc/client/hud.qc:1896
msgid "^1You are reinserted into the game for running out of ammo..."
msgstr ""
"^1Du wurdest ins Spiel neu eingesetzt, weil dir die Munition ausging..."
-#: qcsrc/client/hud.qc:3064
+#: qcsrc/client/hud.qc:1898
msgid "^1You were killed for running out of ammo..."
msgstr "^1Du wurdest getötet, da dir die Munition ausging..."
-#: qcsrc/client/hud.qc:3067
+#: qcsrc/client/hud.qc:1901
msgid "^1You need to preserve your health"
msgstr "^1Du solltest deine Gesundheit erhalten"
-#: qcsrc/client/hud.qc:3069
+#: qcsrc/client/hud.qc:1903
msgid "^1You grew too old without taking your medicine"
msgstr "^1Du wurdest zu alt, und hast nicht deine Medizin genommen"
-#: qcsrc/client/hud.qc:3072
+#: qcsrc/client/hud.qc:1906
msgid "^1Don't go against team mates!"
msgstr "^1Ärgere deine Teamkollegen nicht!"
-#: qcsrc/client/hud.qc:3074
+#: qcsrc/client/hud.qc:1908
msgid "^1Don't shoot your team mates!"
msgstr "^1Schieße nicht auf deine Teamkollegen!"
-#: qcsrc/client/hud.qc:3079
+#: qcsrc/client/hud.qc:1913
msgid "^1You need to be more careful!"
msgstr "^1Sei vorsichtiger!"
-#: qcsrc/client/hud.qc:3081
+#: qcsrc/client/hud.qc:1915
msgid "^1You killed your own dumb self!"
msgstr "^1Du hast dich selbst umgebracht. Wie blöd."
-#: qcsrc/client/hud.qc:3086
+#: qcsrc/client/hud.qc:1920
#, c-format
-msgid "^1Moron! You went against %s, a team mate!"
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
-#: qcsrc/client/hud.qc:3088
+#: qcsrc/client/hud.qc:1922
#, c-format
-msgid "^1Moron! You fragged %s, a team mate!"
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
-#: qcsrc/client/hud.qc:3092
+#: qcsrc/client/hud.qc:1926
msgid "^1First score"
msgstr "^1Erster Punkt"
-#: qcsrc/client/hud.qc:3094
+#: qcsrc/client/hud.qc:1928
msgid "^1First blood"
msgstr "^1Erstes Blut"
-#: qcsrc/client/hud.qc:3098
+#: qcsrc/client/hud.qc:1932
msgid "^1First casualty"
msgstr "^1Erster Kollateralschaden"
-#: qcsrc/client/hud.qc:3100
+#: qcsrc/client/hud.qc:1934
msgid "^1First victim"
msgstr "^1Erstes Opfer"
-#: qcsrc/client/hud.qc:3104
+#: qcsrc/client/hud.qc:1938
#, c-format
msgid "^1You scored against ^7%s^1 who was typing!"
msgstr "^1Du hast gegen ^7%s^1 gepunktet, während er am Tippen war!"
-#: qcsrc/client/hud.qc:3106
+#: qcsrc/client/hud.qc:1940
#, c-format
msgid "^1You typefragged ^7%s"
msgstr "^1Du hast ^7%s^1 beim Tippen erschossen"
-#: qcsrc/client/hud.qc:3110
+#: qcsrc/client/hud.qc:1944
#, c-format
msgid "^1You were scored against by ^7%s^1 while you were typing!"
msgstr "^1Gegen dich hat ^7%s^1 gepunktet, während du am Tippen warst!"
-#: qcsrc/client/hud.qc:3112
+#: qcsrc/client/hud.qc:1946
#, c-format
msgid "^1You were typefragged by ^7%s"
msgstr "^1Du wurdest von ^7%s^1 erschossen, während du am Tippen warst"
-#: qcsrc/client/hud.qc:3116
+#: qcsrc/client/hud.qc:1950
#, c-format
msgid "^4You scored against ^7%s"
msgstr "^4Du hast gegen ^7%s^4 gepunktet"
-#: qcsrc/client/hud.qc:3118
+#: qcsrc/client/hud.qc:1952
#, c-format
msgid "^4You fragged ^7%s"
msgstr "^4Du hast ^7%s^4 getötet"
-#: qcsrc/client/hud.qc:3122
+#: qcsrc/client/hud.qc:1956
#, c-format
msgid "^1You were scored against by ^7%s"
msgstr "^1Gegen dich hat ^7%s^1 gepunktet"
-#: qcsrc/client/hud.qc:3124
+#: qcsrc/client/hud.qc:1958
#, c-format
msgid "^1You were fragged by ^7%s"
msgstr "^1Du wurdest von ^7%s^1 getötet"
-#: qcsrc/client/hud.qc:3129
+#: qcsrc/client/hud.qc:1963
msgid "^1Watch your step!"
msgstr "^1Achte, wo du hintrittst!"
-#: qcsrc/client/hud.qc:3194 qcsrc/client/hud.qc:3195
+#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
#, c-format
msgid "Player %d"
msgstr "Spieler %d"
-#: qcsrc/client/hud.qc:3791
+#: qcsrc/client/hud.qc:2823
msgid "^1Intermediate 1 (+15.42)"
msgstr "^1Intermediate 1 (+15.42)"
-#: qcsrc/client/hud.qc:3793 qcsrc/client/hud.qc:3835 qcsrc/client/hud.qc:3876
+#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
#, c-format
msgid "^1PENALTY: %.1f (%s)"
msgstr "^1STRAFE: %.1f (%s)"
-#: qcsrc/client/hud.qc:3878
+#: qcsrc/client/hud.qc:2910
#, c-format
msgid "^2PENALTY: %.1f (%s)"
msgstr "^2STRAFE: %.1f (%s)"
-#: qcsrc/client/hud.qc:3903
+#: qcsrc/client/hud.qc:2938
+msgid "^1You must answer before entering hud configure mode\n"
+msgstr "^1Du musst antworten, bevore das HUD konfiguriert werden kann\n"
+
+#: qcsrc/client/hud.qc:2941
msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
msgstr "^2Name^7 statt \"^1Unregistered player^7\" in den Statistiken"
-#: qcsrc/client/hud.qc:3985
+#: qcsrc/client/hud.qc:3023
msgid "A vote has been called for:"
msgstr "Eine Abstimmung wurde initiiert für:"
-#: qcsrc/client/hud.qc:3987
+#: qcsrc/client/hud.qc:3025
msgid "Allow servers to store and display your name?"
msgstr "Erlaube Servern, deinen Namen zu speichern und später zu zeigen?"
-#: qcsrc/client/hud.qc:3991
+#: qcsrc/client/hud.qc:3029
msgid "^1Configure the HUD"
msgstr "^1Das HUD konfigurieren"
-#: qcsrc/client/hud.qc:3995
+#: qcsrc/client/hud.qc:3033
#, c-format
msgid "Yes (%s): %d"
msgstr "Ja (%s): %d"
-#: qcsrc/client/hud.qc:3997
+#: qcsrc/client/hud.qc:3035
#, c-format
msgid "No (%s): %d"
msgstr "Nein (%s): %d"
-#: qcsrc/client/hud.qc:4510 qcsrc/client/hud.qc:4513 qcsrc/client/hud.qc:4515
+#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
msgid "Personal best"
msgstr "Persönliche Bestzeit"
-#: qcsrc/client/hud.qc:4528 qcsrc/client/hud.qc:4531 qcsrc/client/hud.qc:4533
+#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
msgid "Server best"
msgstr "Server-Bestzeit"
-#: qcsrc/client/hud.qc:4765
+#: qcsrc/client/hud.qc:3905
msgid "^3Player^7: This is the chat area."
msgstr "^3Player^7: Das ist der Chat-Bereich."
-#: qcsrc/client/hud.qc:4828
+#: qcsrc/client/hud.qc:3973
#, c-format
msgid "FPS: %.*f"
msgstr "FPS: %.*f"
-#: qcsrc/client/hud.qc:4893
+#: qcsrc/client/hud.qc:4040
msgid "^1Observing"
msgstr "^1Beobachten"
-#: qcsrc/client/hud.qc:4895
+#: qcsrc/client/hud.qc:4042
#, c-format
msgid "^1Spectating: ^7%s"
msgstr "^1Zuschauen bei: ^7%s"
-#: qcsrc/client/hud.qc:4899
+#: qcsrc/client/hud.qc:4046
#, c-format
msgid "^1Press ^3%s^1 to spectate"
msgstr "^1Drücke ^3%s^1, um bei jemandem zuzuschauen"
-#: qcsrc/client/hud.qc:4901
+#: qcsrc/client/hud.qc:4048
#, c-format
msgid "^1Press ^3%s^1 for another player"
msgstr "^1Drücke ^3%s^1 für einen anderen Spieler"
-#: qcsrc/client/hud.qc:4905
+#: qcsrc/client/hud.qc:4052
#, c-format
msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
msgstr "^1Benutze ^3%s^1 oder ^3%s^1 zum Ändern der Geschwindigkeit"
-#: qcsrc/client/hud.qc:4907
+#: qcsrc/client/hud.qc:4054
#, c-format
msgid "^1Press ^3%s^1 to observe"
msgstr "^1Drücke ^3%s^1 zum Beobachten"
-#: qcsrc/client/hud.qc:4910
+#: qcsrc/client/hud.qc:4057
#, c-format
msgid "^1Press ^3%s^1 for gamemode info"
msgstr "^1Drücke ^3%s^1 für Spielmodus-Info"
-#: qcsrc/client/hud.qc:4914
+#: qcsrc/client/hud.qc:4061
msgid "^1Wait for your turn to join"
msgstr "^1Warte, bis du dran bist"
-#: qcsrc/client/hud.qc:4920
+#: qcsrc/client/hud.qc:4067
msgid "^1Match has already begun"
msgstr "^1Das Match hat bereits begonnen"
-#: qcsrc/client/hud.qc:4922
+#: qcsrc/client/hud.qc:4069
msgid "^1You have no more lives left"
msgstr "^1Du hast keine Leben mehr übrig"
-#: qcsrc/client/hud.qc:4924 qcsrc/client/hud.qc:4927
+#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
#, c-format
msgid "^1Press ^3%s^1 to join"
-msgstr "^1Drücke ^3%s^1 zum Eintreten"
+msgstr "^1Drücke ^3%s^1 zum Mitspielen"
-#: qcsrc/client/hud.qc:4935
+#: qcsrc/client/hud.qc:4082
#, c-format
msgid "^1Game starts in ^3%d^1 seconds"
msgstr "^1Das Spiel beginnt in ^3%d^1 Sekunden"
-#: qcsrc/client/hud.qc:4942
+#: qcsrc/client/hud.qc:4089
msgid "^2Currently in ^1warmup^2 stage!"
msgstr "^2Momentan in der ^1Aufwärmphase!"
-#: qcsrc/client/hud.qc:4957
+#: qcsrc/client/hud.qc:4104
#, c-format
msgid "%sPress ^3%s%s to end warmup"
msgstr "%sDrücke ^3%s%s um die Aufwärmphase zu beenden"
-#: qcsrc/client/hud.qc:4959
+#: qcsrc/client/hud.qc:4106
#, c-format
msgid "%sPress ^3%s%s once you are ready"
msgstr "%sDrücke ^3%s%s sobald du soweit bist"
-#: qcsrc/client/hud.qc:4964
+#: qcsrc/client/hud.qc:4111
msgid "^2Waiting for others to ready up to end warmup..."
msgstr "^2Warte, bis andere bereit sind, um die Aufwärmphase zu beenden"
-#: qcsrc/client/hud.qc:4966
+#: qcsrc/client/hud.qc:4113
msgid "^2Waiting for others to ready up..."
msgstr "^2Warte, bis andere bereit sind..."
-#: qcsrc/client/hud.qc:4972
+#: qcsrc/client/hud.qc:4119
#, c-format
msgid "^2Press ^3%s^2 to end warmup"
msgstr "^2Drücke ^3%s^2 um die Aufwärmphase zu beenden"
-#: qcsrc/client/hud.qc:4993
+#: qcsrc/client/hud.qc:4140
msgid "Teamnumbers are unbalanced!"
msgstr "Die Teams sind unbalanciert!"
-#: qcsrc/client/hud.qc:4998
+#: qcsrc/client/hud.qc:4145
#, c-format
msgid " Press ^3%s%s to adjust"
msgstr "Drücke ^3%s%s um dies zu korrigieren"
-#: qcsrc/client/hud.qc:5006
+#: qcsrc/client/hud.qc:4153
msgid "^7Press ^3ESC ^7to show HUD options."
msgstr "^7Drücke ^3ESC^7 um die HUD-Optionen zu zeigen"
-#: qcsrc/client/hud.qc:5008
+#: qcsrc/client/hud.qc:4155
msgid "^3Doubleclick ^7a panel for panel-specific options."
msgstr "^3Doppelklick^7 auf ein Panel für Panel-spezifische Optionen."
-#: qcsrc/client/hud.qc:5010
+#: qcsrc/client/hud.qc:4157
msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
msgstr "^3CTRL^7 um Kollisionstests zu deaktivieren, ^3SHIFT^7 und"
-#: qcsrc/client/hud.qc:5012
+#: qcsrc/client/hud.qc:4159
msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
msgstr "^3ALT^7 + ^3PFEILTASTEN^7 für Feinjustierungen"
-#: qcsrc/client/hud.qc:5037
+#: qcsrc/client/hud.qc:4197
msgid " qu/s"
msgstr "qu/s"
-#: qcsrc/client/hud.qc:5041
+#: qcsrc/client/hud.qc:4201
msgid " m/s"
msgstr "m/s"
-#: qcsrc/client/hud.qc:5045
+#: qcsrc/client/hud.qc:4205
msgid " km/h"
msgstr "km/h"
-#: qcsrc/client/hud.qc:5049
+#: qcsrc/client/hud.qc:4209
msgid " mph"
msgstr "mph"
-#: qcsrc/client/hud.qc:5053
+#: qcsrc/client/hud.qc:4213
msgid " knots"
msgstr "Knoten"
+#: qcsrc/client/hud.qc:4860
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+msgstr "Falsche Panel-Nummern in _hud_panelorder wurden automatisch behoben"
+
+#: qcsrc/client/hud_config.qc:136
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr ""
+"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
+"abgelegt)\n"
+
+#: qcsrc/client/hud_config.qc:140
+#, c-format
+msgid "^1Couldn't write to %s\n"
+msgstr "^1Konnte nicht nach %s schreiben\n"
+
#: qcsrc/client/mapvoting.qc:28
msgid " (1 vote)"
msgstr "(1 Stimme)"
msgid "Vote for a map"
msgstr "Wähle eine Map"
-#: qcsrc/client/mapvoting.qc:199
+#: qcsrc/client/mapvoting.qc:200
#, c-format
msgid "%d seconds left"
msgstr "%d Sekunden übrig"
msgid "Trying to remove a team which is not in the teamlist!"
msgstr "Versuchte, ein Team zu löschen, das nicht in der Teamliste ist!"
+#: qcsrc/client/movetypes.qc:163
+#, c-format
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Kann ein Objekt nicht befreien (edict: %d, classname: %s, origin: %s)\n"
+
+#: qcsrc/client/movetypes.qc:166
+#, c-format
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Ein Objekt wurde erfolgreich befreit (edict: %d, classname: %s, origin: %s)\n"
+
#: qcsrc/client/scoreboard.qc:19
msgid "SCO^bckills"
msgstr "BC getötet"
#: qcsrc/client/scoreboard.qc:46
msgid "SCO^revivals"
-msgstr "wiederbelebt"
+msgstr "Wiederbelebt"
#: qcsrc/client/scoreboard.qc:47
msgid "SCO^score"
msgstr "^2scoreboard_columns_set default\n"
#: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
-msgstr "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
+msgstr "^2scoreboard_columns_set ^7field1 field2 ...\n"
#: qcsrc/client/scoreboard.qc:244
msgid "The following field names are recognized (case insensitive):\n"
msgid "N/A"
msgstr "-"
-#: qcsrc/client/scoreboard.qc:951
+#: qcsrc/client/scoreboard.qc:950
#, c-format
msgid "Accuracy stats (average %d%%)"
msgstr "Genauigkeit (Durchschn.: %d%%)"
-#: qcsrc/client/scoreboard.qc:1016
+#: qcsrc/client/scoreboard.qc:1015
#, c-format
msgid "%d%%"
msgstr "%d%%"
-#: qcsrc/client/scoreboard.qc:1076
+#: qcsrc/client/scoreboard.qc:1075
msgid "Rankings"
msgstr "Platzierungen"
-#: qcsrc/client/scoreboard.qc:1167 qcsrc/client/scoreboard.qc:1169
+#: qcsrc/client/scoreboard.qc:1170
msgid "Scoreboard"
msgstr "Tabelle"
-#: qcsrc/client/scoreboard.qc:1210
+#: qcsrc/client/scoreboard.qc:1215
#, c-format
msgid "Speed award: %d ^7(%s^7)"
msgstr "Höchstgeschwindigkeit: %d ^7(%s^7)"
-#: qcsrc/client/scoreboard.qc:1214
+#: qcsrc/client/scoreboard.qc:1219
#, c-format
msgid "All-time fastest: %d ^7(%s^7)"
msgstr "Rekord: %d ^7(%s^7)"
-#: qcsrc/client/scoreboard.qc:1241 qcsrc/client/teamplay.qc:55
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
msgid "Spectators"
msgstr "Zuschauer"
-#: qcsrc/client/scoreboard.qc:1248
+#: qcsrc/client/scoreboard.qc:1252
#, c-format
msgid "playing on ^2%s^7"
msgstr "es wird auf ^2%s^7 gespielt"
-#: qcsrc/client/scoreboard.qc:1255 qcsrc/client/scoreboard.qc:1260
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
#, c-format
msgid " for up to ^1%1.0f minutes^7"
msgstr " für bis zu ^1%.1f Minuten^7"
-#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1283
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
msgid " or"
msgstr " oder"
-#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
#, c-format
msgid " until ^3%s %s^7"
msgstr " bis ^3%s %s^7"
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1275
-#: qcsrc/client/scoreboard.qc:1287 qcsrc/client/scoreboard.qc:1294
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
msgid "SCO^points"
msgstr "Punkte"
-#: qcsrc/client/scoreboard.qc:1269 qcsrc/client/scoreboard.qc:1276
-#: qcsrc/client/scoreboard.qc:1288 qcsrc/client/scoreboard.qc:1295
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
msgid "SCO^is beaten"
msgstr "geschlagen wird"
-#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
#, c-format
msgid " until a lead of ^3%s %s^7"
msgstr " bis zu einem Vorsprung von ^3%s %s^7"
msgid "Cannot initialize sound %s\n"
msgstr "Kann Sound %s nicht initialisieren\n"
-#: qcsrc/client/teamplay.qc:56
+#: qcsrc/client/teamplay.qc:64
msgid "Red Team"
msgstr "Rotes Team"
-#: qcsrc/client/teamplay.qc:57
+#: qcsrc/client/teamplay.qc:65
msgid "Blue Team"
msgstr "Blaues Team"
-#: qcsrc/client/teamplay.qc:58
+#: qcsrc/client/teamplay.qc:66
msgid "Yellow Team"
msgstr "Gelbes Team"
-#: qcsrc/client/teamplay.qc:59
+#: qcsrc/client/teamplay.qc:67
msgid "Pink Team"
msgstr "Pinkes Team"
-#: qcsrc/server/w_crylink.qc:2
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
+msgstr "Drücken"
+
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
+msgstr "Zerstören"
+
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
+msgstr "Verteidigen"
+
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
+msgstr "Blaue Basis"
+
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
+msgstr "GEFAHR"
+
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
+msgstr "Flaggenträger"
+
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
+msgstr "Flagge"
+
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
+msgstr "Hilfe!"
+
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
+msgstr "Hier"
+
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
+msgstr "Schlüssel"
+
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
+msgstr "Schlüsselträger"
+
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
+msgstr "Hier her!"
+
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
+msgstr "Rote Basis"
+
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
+msgstr "Wegpunkt"
+
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
+msgstr "Generator"
+
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
+msgstr "Kontrollpunkt"
+
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
+msgstr "Checkpoint"
+
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
+msgstr "Ziel"
+
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
+msgstr "Start"
+
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
+msgstr "Ball"
+
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
+msgstr "Ballbesitzer"
+
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
+msgstr "MinstaNex"
+
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
+msgstr "Enterhaken"
+
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
+msgstr "HLAC"
+
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
+msgstr "Unsichtbarkeit"
+
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
+msgstr "Extraleben"
+
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
+msgstr "Geschwindigkeit"
+
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
+msgstr "Stärke"
+
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
+msgstr "Schutzschild"
+
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
+msgstr "Treibstoff-Regeneration"
+
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
+msgstr "Jetpack"
+
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
+msgstr "Eingefroren!"
+
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
+msgstr "Getaggt!"
+
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
+msgstr "Fahrzeug"
+
+#: qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
+msgstr "Frühstücksfleisch"
+
+#: qcsrc/client/waypointsprites.qc:594
+#, c-format
+msgid "%s needing help!"
+msgstr "%s braucht Hilfe!"
+
+#: qcsrc/common/mapinfo.qc:1092
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s zerstörte sich selbst erfolgreich mit der Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s konnte sich nicht vor %ss Crylink verstecken"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s trat %ss Crylink zu nahe"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s schaute sich %ss Crylink sehr genau an"
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr "Electro"
-
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s vergaß, wo er das Plasma hingetan hatte"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s spielte mit Plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s hat gerade %ss blaue Kugel bemerkt"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s kam mit %ss blauer Kugel in Kontakt"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s kam zu nah an %ss blauen Strahl"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s wurde von %ss blauen Strahl erwischt"
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
-msgstr "Fireball"
-
#: qcsrc/server/w_fireball.qc:417
#, c-format
msgid "%s forgot about some firemine"
msgid "%s tasted %s's fireball"
msgstr "%s hat von %ss Feuerball probiert"
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
-
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s wollte wissen, ob seine Granate funktioniert"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s verfing sich in der eigenen Detonation"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s hat %ss Granate nicht gesehen"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s ist fast %ss Granate ausgewichen"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s nahm %ss Granate in den Mund"
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
-
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s hat mit kleinen Raketen gespielt"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "^1%s^1 wurde von %s^1 erwischt"
#: qcsrc/server/w_hook.qc:2
msgid "Grappling Hook"
-msgstr "Grappling Hook"
+msgstr "Enterhaken"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s hat das Unmögliche geschafft"
msgid "%s has run into %s's gravity bomb"
msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
-
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s hat sich in die Hölle gelasert"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s ist von %ss Gauntlet halbiert worden"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
-
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s ist explodiert"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s ist %ss Mine zu nahe getreten"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s ist fast %ss Mine ausgewichen"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s ist auf %ss Mine gelatscht"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s kann jetzt mit Portalen denken"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "^1%s^1 wurde von %s^1 vernichtet"
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
-
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
-
#: qcsrc/server/w_porto.qc:298
#, c-format
msgid "%s felt %s doing the impossible to him"
msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s ist %ss Rakete zu nahe getreten"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s ist fast %ss Rakete ausgewichen"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s hat %ss Rakete in den Mund genommen"
msgid "%s was tagged by %s"
msgstr "^1%s^1 wurde von %s^1 getagged"
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "^1%s^1 wurde von %s^1 erschossen"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
"%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
"%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
"%%'n Tuba stammten, gestorben"
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
-
#: qcsrc/server/w_uzi.qc:323
#, c-format
msgid "%s was riddled full of holes by %s"
--- /dev/null
+# Xonotic CSQC
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the Xonotic package.
+# Felice Sallustio <fel.sallustio@gmail.com>, 2011.
+# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"PO-Revision-Date: 2011-09-04 01:40+0100\n"
+"Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
+"Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Italian\n"
+
+#: qcsrc/client/Main.qc:30
+msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
+msgstr "ERRORE - IL MENU E' VISIBILE MA NESSUN MENU E' STATO DEFINITO!"
+
+#: qcsrc/client/Main.qc:56
+msgid ""
+"^3Your engine build is outdated\n"
+"^3This Server uses a newer QC VM. Please update!\n"
+msgstr ""
+"^3La tua versione del motore logico è vecchia\n"
+"^3Questo server usa un nuovo QC VM. Per favore aggiornalo!\n"
+
+#: qcsrc/client/Main.qc:66
+#, c-format
+msgid "^4CSQC Build information: ^1%s\n"
+msgstr "^4Informazioni sulla build CSQC: ^1%s\n"
+
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
+#, c-format
+msgid "trying to switch to unsupported team %d\n"
+msgstr "tentando di passare al team non supportato %d\n"
+
+#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: qcsrc/client/Main.qc:370
+msgid "hud_save configname (saves to hud_skinname_configname.cfg)\n"
+msgstr "hud_save configname (salva in hud_skinname_configname.cfg)\n"
+
+#: qcsrc/client/Main.qc:494
+msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
+msgstr "Uso: cl_cmd COMANDO..., dove i possibili comandi sono:\n"
+
+#: qcsrc/client/Main.qc:495
+msgid " settemp cvar value\n"
+msgstr " settemp cvar value\n"
+
+#: qcsrc/client/Main.qc:496
+msgid " scoreboard_columns_set ...\n"
+msgstr " scoreboard_columns_set ...\n"
+
+#: qcsrc/client/Main.qc:497
+msgid " scoreboard_columns_help\n"
+msgstr " scoreboard_columns_help\n"
+
+#: qcsrc/client/Main.qc:726
+#, c-format
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
+msgstr ""
+"Un'entity CSQC ha cambiato il suo proprietario! (edict: %d, classname: %s)\n"
+
+#: qcsrc/client/Main.qc:964
+#, c-format
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+msgstr "Un'entity CSQC ha cambiato il suo tipo! (edict: %d, classname: %s)\n"
+
+#: qcsrc/client/Main.qc:1005
+#, c-format
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
+msgstr ""
+"Tipo di entity sconosciuta in CSQC_Ent_Update (enttype: %d, edict: %d, "
+"classname: %s)\n"
+
+#: qcsrc/client/Main.qc:1451
+#, c-format
+msgid "%s (not bound)"
+msgstr "%s (nessun tasto)"
+
+#: qcsrc/client/Main.qc:1456 qcsrc/client/hud.qc:230
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: qcsrc/client/ctf.qc:35
+msgid "----- Order Menu -----"
+msgstr "----- Menu degli ordini -----"
+
+#: qcsrc/client/ctf.qc:36
+#, c-format
+msgid "Order: %s"
+msgstr "Ordine: %s"
+
+#: qcsrc/client/ctf.qc:37
+msgid "1) ^3previous page"
+msgstr "1) ^3pagina precedente"
+
+#: qcsrc/client/ctf.qc:38
+msgid "2) ^3next page"
+msgstr "2) ^3pagina successiva"
+
+#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
+msgid "ESC) Exit Menu"
+msgstr "ESC) Esci dal menu"
+
+#: qcsrc/client/ctf.qc:126
+#, c-format
+msgid "Couldn't find player %d\n"
+msgstr "Impossibile trovare il giocatore %d\n"
+
+#: qcsrc/client/ctf.qc:154
+msgid "----- Command Menu -----"
+msgstr "----- Menu dei comandi -----"
+
+#: qcsrc/client/ctf.qc:155
+msgid "Issue orders:"
+msgstr "Impartisci ordini:"
+
+#: qcsrc/client/ctf.qc:156
+msgid " 1) Attack"
+msgstr " 1) Attacca"
+
+#: qcsrc/client/ctf.qc:158
+msgid " 2) Defend"
+msgstr " 2) Difendi"
+
+#: qcsrc/client/ctf.qc:160
+msgid "3) Resign from command."
+msgstr "3) Dimettiti dal commando."
+
+#: qcsrc/client/ctf.qc:212
+msgid "You're commander!"
+msgstr "Sei il comandante!"
+
+#: qcsrc/client/ctf.qc:215
+msgid "Awaiting orders..."
+msgstr "Attendendo ordini..."
+
+#: qcsrc/client/hud.qc:160
+msgid "1st"
+msgstr "1°"
+
+#: qcsrc/client/hud.qc:162
+msgid "2nd"
+msgstr "2°"
+
+#: qcsrc/client/hud.qc:164
+msgid "3rd"
+msgstr "3°"
+
+#: qcsrc/client/hud.qc:166
+#, c-format
+msgid "%dth"
+msgstr "%d°"
+
+#: qcsrc/client/hud.qc:198
+#, c-format
+msgid " (-%dL)"
+msgstr " (-%dG)"
+
+#: qcsrc/client/hud.qc:203
+#, c-format
+msgid " (+%dL)"
+msgstr " (+%dG)"
+
+#: qcsrc/client/hud.qc:219
+msgid "Start line"
+msgstr "Linea di partenza"
+
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
+msgid "Finish line"
+msgstr "Linea d'arrivo"
+
+#: qcsrc/client/hud.qc:223
+#, c-format
+msgid "Intermediate %d"
+msgstr "Intermedio %d"
+
+#: qcsrc/client/hud.qc:232
+#, c-format
+msgid "%s (%s %s)"
+msgstr "%s (%s %s)"
+
+#: qcsrc/client/hud.qc:735
+msgid "Out of ammo"
+msgstr "Scarica"
+
+#: qcsrc/client/hud.qc:739
+msgid "Don't have"
+msgstr "Mancante"
+
+#: qcsrc/client/hud.qc:743
+msgid "Unavailable"
+msgstr "Non disponibile"
+
+#: qcsrc/client/hud.qc:1483
+#, c-format
+msgid "^1%s^1 couldn't take it anymore\n"
+msgstr "^1%s^1 non ne poteva più\n"
+
+#: qcsrc/client/hud.qc:1487 qcsrc/client/hud.qc:1791
+#, c-format
+msgid "^1%s^1 died\n"
+msgstr "^1%s^1 è morto\n"
+
+#: qcsrc/client/hud.qc:1491
+#, c-format
+msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
+msgstr ""
+"^7%s^7 ha commesso suicidio. Qual'è il motivo di vivere senza munizioni?\n"
+
+#: qcsrc/client/hud.qc:1495
+#, c-format
+msgid "^1%s^1 thought they found a nice camping ground\n"
+msgstr "^1%s^1 pensava di trovare un bel campeggio\n"
+
+#: qcsrc/client/hud.qc:1499
+#, c-format
+msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
+msgstr "^1%s^1 non è diventato amico del Signore del Teamplay\n"
+
+#: qcsrc/client/hud.qc:1503
+#, c-format
+msgid "^1%s^1 unfairly eliminated themself\n"
+msgstr "^1%s^1 si è eliminato ingiustamente\n"
+
+#: qcsrc/client/hud.qc:1507
+#, c-format
+msgid "^1%s^1 burned to death\n"
+msgstr "^1%s^1 è morto bruciato\n"
+
+#: qcsrc/client/hud.qc:1511
+#, c-format
+msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
+msgstr "^1%s^1 non ha resistito allo stimolo di autodistruggersi\n"
+
+#: qcsrc/client/hud.qc:1515
+#, c-format
+msgid "^1%s^1 ended it all after a %d kill spree\n"
+msgstr "^1%s^1 l'ha fatta finita con una serie di %d uccisioni\n"
+
+#: qcsrc/client/hud.qc:1532
+#, c-format
+msgid "^1%s^1 took action against a team mate\n"
+msgstr "^1%s^1 ha agito contro un compagno di squadra\n"
+
+#: qcsrc/client/hud.qc:1534
+#, c-format
+msgid "^1%s^1 mows down a team mate\n"
+msgstr "^1%s^1 ha falciato un compagno di squadra\n"
+
+#: qcsrc/client/hud.qc:1539
+#, c-format
+msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
+msgstr ""
+"^1%s^1 ha concluso una serie di %d punti per esser andato contro un compagno "
+"di squadra\n"
+
+#: qcsrc/client/hud.qc:1541
+#, c-format
+msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
+msgstr ""
+"^1%s^1 ha concluso una serie di %d uccisioni per aver ammazzato un compagno "
+"di squadra\n"
+
+#: qcsrc/client/hud.qc:1545
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
+msgstr ""
+"^1La serie di ^1%s^1 di ^1%s^1 punti è stata conclusa da un compagno di "
+"squadra!\n"
+
+#: qcsrc/client/hud.qc:1547
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
+msgstr ""
+"^1La serie di ^1%s ^1di ^1%s ^1uccisioni è stata conclusa da un compagno di "
+"squadra!\n"
+
+#: qcsrc/client/hud.qc:1551
+#, c-format
+msgid "^1%s^1 drew first blood\n"
+msgstr "^1%s^1 ha tratto la prima uccisione\n"
+
+#: qcsrc/client/hud.qc:1555
+#, c-format
+msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
+msgstr ""
+"^1%s^1 ha provato a occupare lo spazio di destinazione della teleporta di "
+"%s\n"
+
+#: qcsrc/client/hud.qc:1557
+#, c-format
+msgid "^1%s^1 was telefragged by %s\n"
+msgstr "^1%s^1 è stato telefraggato da %s\n"
+
+#: qcsrc/client/hud.qc:1562
+#, c-format
+msgid "^1%s^1 was drowned by %s\n"
+msgstr "^1%s^1 è stato annegato da %s\n"
+
+#: qcsrc/client/hud.qc:1567
+#, c-format
+msgid "^1%s^1 was slimed by %s\n"
+msgstr "^1%s^1 è stato coperto di melma da %s\n"
+
+#: qcsrc/client/hud.qc:1572
+#, c-format
+msgid "^1%s^1 was cooked by %s\n"
+msgstr "^1%s^1 è stato cucinato da %s\n"
+
+#: qcsrc/client/hud.qc:1577
+#, c-format
+msgid "^1%s^1 was grounded by %s\n"
+msgstr "^1%s^1 è stato messo a terra da %s\n"
+
+#: qcsrc/client/hud.qc:1582
+#, c-format
+msgid "^1%s^1 was shot into space by %s\n"
+msgstr "^1%s^1 è stato buttato nello spazio da %s\n"
+
+#: qcsrc/client/hud.qc:1587
+#, c-format
+msgid "^1%s^1 was conserved by %s\n"
+msgstr "^1%s^1 è stato conservato da %s\n"
+
+#: qcsrc/client/hud.qc:1593
+#, c-format
+msgid "^1%s^1 was thrown into a world of hurt by %s\n"
+msgstr "^1%s^1 è stato lanciato in un mondo di dolore da %s\n"
+
+#: qcsrc/client/hud.qc:1597
+#, c-format
+msgid "^1%s^1 was crushed by %s\n"
+msgstr "^1%s^1 è stato schiacciato da %s\n"
+
+#: qcsrc/client/hud.qc:1601
+#, c-format
+msgid "^1%s^1 got shredded by %s\n"
+msgstr "^1%s^1 è stato triturato da %s\n"
+
+#: qcsrc/client/hud.qc:1605
+#, c-format
+msgid "^1%s^1 was blasted to bits by %s\n"
+msgstr "^1%s^1 è stato disintegrato da %s\n"
+
+#: qcsrc/client/hud.qc:1609
+#, c-format
+msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
+msgstr "^1%s^1 è caduto nella distruzione del veicolo di %s\n"
+
+#: qcsrc/client/hud.qc:1613
+#, c-format
+msgid "^1%s^1 was bolted down by %s\n"
+msgstr "^1%s^1 è stato imbullonato da %s\n"
+
+#: qcsrc/client/hud.qc:1617
+#, c-format
+msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
+msgstr "^1%s^1 non ha trovato riparo dai razzi di %s\n"
+
+#: qcsrc/client/hud.qc:1621
+#, c-format
+msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
+msgstr "^1%s^1 muore mentre il wakizashi di %s^1 muore.\n"
+
+#: qcsrc/client/hud.qc:1625
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
+msgstr "^1%s^1 è stato inchiodato all'inferno da %s\n"
+
+#: qcsrc/client/hud.qc:1629
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
+msgstr "^1L'ammasso di ^1%s^1 è stato schiacciato da %s\n"
+
+#: qcsrc/client/hud.qc:1633
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgstr "^1%s^1 muore mentre il raptor di %s^1 muore.\n"
+
+#: qcsrc/client/hud.qc:1637
+#, c-format
+msgid "^1%s^1 was pushed into the line of fire by %s\n"
+msgstr "^1%s^1 è stato spinto nella linea di fuoco da %s\n"
+
+#: qcsrc/client/hud.qc:1641
+#, c-format
+msgid "^1%s^1 was pushed into an accident by %s\n"
+msgstr "^1%s^1 è stato spinto in un incidente da %s\n"
+
+#: qcsrc/client/hud.qc:1645
+#, c-format
+msgid "^1%s^1 was unfairly eliminated by %s\n"
+msgstr "^1%s^1 è stato ingiustamente eliminato da %s\n"
+
+#: qcsrc/client/hud.qc:1649
+#, c-format
+msgid "^1%s^1 was burnt to death by %s\n"
+msgstr "^1%s^1 è stato bruciato a morte da %s\n"
+
+#: qcsrc/client/hud.qc:1661
+#, c-format
+msgid "^1%s^1 was fragged by %s\n"
+msgstr "^1%s^1 è stato fraggato da %s\n"
+
+#: qcsrc/client/hud.qc:1666
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by %s\n"
+msgstr "^1La serie di ^1%s ^1di ^1%s^1 punti è stata conclusa da %s\n"
+
+#: qcsrc/client/hud.qc:1668
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by %s\n"
+msgstr "^1La serie di %s^1 di ^1%s^1 uccisioni è stata conclusa da %s\n"
+
+#: qcsrc/client/hud.qc:1671
+#, c-format
+msgid "^1%s^1 made %s scores in a row\n"
+msgstr "^1%s^1 ha fatto %s punti di fila\n"
+
+#: qcsrc/client/hud.qc:1673
+#, c-format
+msgid "^1%s^1 has %s frags in a row\n"
+msgstr "^1%s^1 ha %s frag di fila\n"
+
+#: qcsrc/client/hud.qc:1676
+#, c-format
+msgid "%s^7 made a ^1TRIPLE SCORE\n"
+msgstr "%s^7 ha realizzato un ^1TRIPLO PUNTO\n"
+
+#: qcsrc/client/hud.qc:1678
+#, c-format
+msgid "%s^7 made a ^1TRIPLE FRAG\n"
+msgstr "%s^7 ha realizzato un ^1FRAG TRIPLO\n"
+
+#: qcsrc/client/hud.qc:1681
+#, c-format
+msgid "%s^7 unleashes ^1SCORING RAGE\n"
+msgstr "%s^7 scatena una ^1FURIA DI PUNTI\n"
+
+#: qcsrc/client/hud.qc:1683
+#, c-format
+msgid "%s^7 unleashes ^1RAGE\n"
+msgstr "%s^7 scatena la propria ^1FURIA\n"
+
+#: qcsrc/client/hud.qc:1686
+#, c-format
+msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
+msgstr "%s^7 ha realizzato ^1DIECI PUNTI DI FILA!\n"
+
+#: qcsrc/client/hud.qc:1688
+#, c-format
+msgid "%s^7 starts the ^1MASSACRE!\n"
+msgstr "%s^7 ha iniziato il ^1MASSACRO!\n"
+
+#: qcsrc/client/hud.qc:1691
+#, c-format
+msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
+msgstr "%s^7 ha realizzato ^QUINDICI PUNTI DI FILA!\n"
+
+#: qcsrc/client/hud.qc:1693
+#, c-format
+msgid "%s^7 executes ^1MAYHEM!\n"
+msgstr "%s^7 ha eseguito un ^1MAYHEM!\n"
+
+#: qcsrc/client/hud.qc:1696
+#, c-format
+msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
+msgstr "%s^7 ha realizzato ^1VENTI PUNTI DI FILA!\n"
+
+#: qcsrc/client/hud.qc:1698
+#, c-format
+msgid "%s^7 is a ^1BERSERKER!\n"
+msgstr "%s^7 è un ^1FEROCE GUERRIERO!\n"
+
+#: qcsrc/client/hud.qc:1701
+#, c-format
+msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
+msgstr "%s^7 ha realizzato ^1VENTICINQUE PUNTI DI FILA!\n"
+
+#: qcsrc/client/hud.qc:1703
+#, c-format
+msgid "%s^7 inflicts ^1CARNAGE!\n"
+msgstr "%s^7 ha fatto una ^1CARNEFICINA!\n"
+
+#: qcsrc/client/hud.qc:1706
+#, c-format
+msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
+msgstr "%s^7 ha realizzato ^1TRENTA PUNTI DI FILA!\n"
+
+#: qcsrc/client/hud.qc:1708
+#, c-format
+msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
+msgstr "%s^7 scatena un ^1ARMAGEDDON!\n"
+
+#: qcsrc/client/hud.qc:1716
+#, c-format
+msgid "^1%s^1 was in the water for too long\n"
+msgstr "^1%s^1 è stato in acqua per troppo tempo\n"
+
+#: qcsrc/client/hud.qc:1718
+#, c-format
+msgid "^1%s^1 drowned\n"
+msgstr "^1%s^1 è annegato\n"
+
+#: qcsrc/client/hud.qc:1723
+#, c-format
+msgid "^1%s^1 was slimed\n"
+msgstr "^1%s^1 è stato coperto di melma\n"
+
+#: qcsrc/client/hud.qc:1729
+#, c-format
+msgid "^1%s^1 found a hot place\n"
+msgstr "^1%s^1 ha trovato un posto caldo\n"
+
+#: qcsrc/client/hud.qc:1731
+#, c-format
+msgid "^1%s^1 turned into hot slag\n"
+msgstr "^1%s^1 è finito dentro la lava bollente\n"
+
+#: qcsrc/client/hud.qc:1738
+#, c-format
+msgid "^1%s^1 tested gravity (and it worked)\n"
+msgstr "^1%s^1 ha testato la gravità (e ha funzionato)\n"
+
+#: qcsrc/client/hud.qc:1740
+#, c-format
+msgid "^1%s^1 hit the ground with a crunch\n"
+msgstr "^1%s^1 ha fatto scricchiolare il terreno\n"
+
+#: qcsrc/client/hud.qc:1745
+#, c-format
+msgid "^1%s^1 became a shooting star\n"
+msgstr "^1%s^1 è diventato una stella cadente\n"
+
+#: qcsrc/client/hud.qc:1751
+#, c-format
+msgid "^1%s^1 discovered a swamp\n"
+msgstr "^1%s^1 ha scoperto una palude\n"
+
+#: qcsrc/client/hud.qc:1753
+#, c-format
+msgid "^1%s^1 is now conserved for centuries to come\n"
+msgstr "^1%s^1 è ora conservato per i secoli a venire\n"
+
+#: qcsrc/client/hud.qc:1758
+#, c-format
+msgid "^1%s^1 was mowed down by a turret \n"
+msgstr "^1%s^1 è stato falciato da una torretta \n"
+
+#: qcsrc/client/hud.qc:1770
+#, c-format
+msgid "^1%s^1 died in an accident\n"
+msgstr "^1%s^1 è morto in un incidente\n"
+
+#: qcsrc/client/hud.qc:1774
+#, c-format
+msgid "^1%s^1 was unfairly eliminated\n"
+msgstr "^1%s^1 è stato ingiustamente eliminato\n"
+
+#: qcsrc/client/hud.qc:1780
+#, c-format
+msgid "^1%s^1 felt a little hot\n"
+msgstr "^1%s^1 ha sentito un pò di caldo\n"
+
+#: qcsrc/client/hud.qc:1782
+#, c-format
+msgid "^1%s^1 burnt to death\n"
+msgstr "^1%s^1 è morto bruciato\n"
+
+#: qcsrc/client/hud.qc:1789
+#, c-format
+msgid "^1%s^1 needs a restart\n"
+msgstr "^1%s^1 ha bisogno di una ripresa\n"
+
+#: qcsrc/client/hud.qc:1796
+#, c-format
+msgid "^1%s^1 needs a restart after a %d scoring spree\n"
+msgstr "^1%s^1 ha bisogno di una ripresa dopo una serie di %d punti\n"
+
+#: qcsrc/client/hud.qc:1798
+#, c-format
+msgid "^1%s^1 died with a %d kill spree\n"
+msgstr "^1%s^1 è morto dopo una serie di %d uccisioni\n"
+
+#: qcsrc/client/hud.qc:1802
+#, c-format
+msgid "%s^7 got the %s\n"
+msgstr "%s^7 ha preso la %s\n"
+
+#: qcsrc/client/hud.qc:1805
+#, c-format
+msgid "%s^7 lost the %s\n"
+msgstr "%s^7 ha perso la %s\n"
+
+#: qcsrc/client/hud.qc:1808
+#, c-format
+msgid "%s^7 picked up the %s\n"
+msgstr "%s^7 ha raccolto la %s\n"
+
+#: qcsrc/client/hud.qc:1811
+#, c-format
+msgid "%s^7 returned the %s\n"
+msgstr "%s^7 ha fatto ritornare la %s\n"
+
+#: qcsrc/client/hud.qc:1814
+#, c-format
+msgid "%s^7 captured the %s%s\n"
+msgstr "%s^7 ha catturato la %s%s\n"
+
+#: qcsrc/client/hud.qc:1833
+#, c-format
+msgid "%s^7 has picked up the ball!\n"
+msgstr "%s^7 ha raccolto la palla!\n"
+
+#: qcsrc/client/hud.qc:1838
+#, c-format
+msgid "%s^7 has dropped the ball!\n"
+msgstr "%s^7 ha rilasciato la palla!\n"
+
+#: qcsrc/client/hud.qc:1849
+#, c-format
+msgid "You are now on: %s"
+msgstr "Sei ora in: %s"
+
+#: qcsrc/client/hud.qc:1851
+#, c-format
+msgid ""
+"You have been moved into a different team to improve team balance\n"
+"You are now on: %s"
+msgstr ""
+"Sei stato spostato in una squadra differente per migliorare il bilanciamento "
+"delle squadre\n"
+"Sei ora in: %s"
+
+#: qcsrc/client/hud.qc:1854
+msgid "^1Reconsider your tactics, camper!"
+msgstr "^1Riconsidera le tue tattiche, camper!"
+
+#: qcsrc/client/hud.qc:1856
+msgid "^1Die camper!"
+msgstr "^1Muori camper!"
+
+#: qcsrc/client/hud.qc:1859
+msgid "^1You are reinserted into the game for running out of ammo..."
+msgstr "^1Sei reinserito nel gioco per mancanza di munizioni..."
+
+#: qcsrc/client/hud.qc:1861
+msgid "^1You were killed for running out of ammo..."
+msgstr "^1Sei stato ucciso per mancanza di munizioni..."
+
+#: qcsrc/client/hud.qc:1864
+msgid "^1You need to preserve your health"
+msgstr "^1Hai bisogno di preservare la tua vita"
+
+#: qcsrc/client/hud.qc:1866
+msgid "^1You grew too old without taking your medicine"
+msgstr "^1Sei diventato troppo vecchio senza prendere le tue medicine"
+
+#: qcsrc/client/hud.qc:1869
+msgid "^1Don't go against team mates!"
+msgstr "^1Non andare contro i tuoi compagni di squadra!"
+
+#: qcsrc/client/hud.qc:1871
+msgid "^1Don't shoot your team mates!"
+msgstr "^1Non sparare ai tuoi compagni di squadra!"
+
+#: qcsrc/client/hud.qc:1876
+msgid "^1You need to be more careful!"
+msgstr "^1Hai bisogno di essere più prudente!"
+
+#: qcsrc/client/hud.qc:1878
+msgid "^1You killed your own dumb self!"
+msgstr "^1Ti sei ammazzato da solo, stupido!"
+
+#: qcsrc/client/hud.qc:1883
+#, c-format
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
+msgstr "^1Idiota! Sei andato contro ^7%s^1, un compagno di squadra!"
+
+#: qcsrc/client/hud.qc:1885
+#, c-format
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
+msgstr "^1Idiota! Hai fraggato ^7%s^1, un compagno di squadra!"
+
+#: qcsrc/client/hud.qc:1889
+msgid "^1First score"
+msgstr "^1Primo punto"
+
+#: qcsrc/client/hud.qc:1891
+msgid "^1First blood"
+msgstr "^1Primo sangue"
+
+#: qcsrc/client/hud.qc:1895
+msgid "^1First casualty"
+msgstr "^1Primo incidente"
+
+#: qcsrc/client/hud.qc:1897
+msgid "^1First victim"
+msgstr "^1Prima vittima"
+
+#: qcsrc/client/hud.qc:1901
+#, c-format
+msgid "^1You scored against ^7%s^1 who was typing!"
+msgstr "^1Hai segnato contro ^7%s^1 che stava scrivendo!"
+
+#: qcsrc/client/hud.qc:1903
+#, c-format
+msgid "^1You typefragged ^7%s"
+msgstr "^1Hai \"typefraggato\" ^7%s"
+
+#: qcsrc/client/hud.qc:1907
+#, c-format
+msgid "^1You were scored against by ^7%s^1 while you were typing!"
+msgstr "^1Sei stato segnato da ^7%s^1 mentre stavi scrivendo!"
+
+#: qcsrc/client/hud.qc:1909
+#, c-format
+msgid "^1You were typefragged by ^7%s"
+msgstr "^1Sei stato \"typefraggato\" da ^7%s"
+
+#: qcsrc/client/hud.qc:1913
+#, c-format
+msgid "^4You scored against ^7%s"
+msgstr "^4Hai segnato contro ^7%s"
+
+#: qcsrc/client/hud.qc:1915
+#, c-format
+msgid "^4You fragged ^7%s"
+msgstr "^4Hai fraggato ^7%s"
+
+#: qcsrc/client/hud.qc:1919
+#, c-format
+msgid "^1You were scored against by ^7%s"
+msgstr "^1Sei stato segnato da ^7%s"
+
+#: qcsrc/client/hud.qc:1921
+#, c-format
+msgid "^1You were fragged by ^7%s"
+msgstr "^1Sei stato fraggato da ^7%s"
+
+#: qcsrc/client/hud.qc:1926
+msgid "^1Watch your step!"
+msgstr "^1Attento a dove metti i piedi!"
+
+#: qcsrc/client/hud.qc:1995 qcsrc/client/hud.qc:1996 qcsrc/client/hud.qc:2481
+#, c-format
+msgid "Player %d"
+msgstr "Giocatore %d"
+
+#: qcsrc/client/hud.qc:2786
+msgid "^1Intermediate 1 (+15.42)"
+msgstr "^1Intermedio 1 (+15.42)"
+
+#: qcsrc/client/hud.qc:2788 qcsrc/client/hud.qc:2830 qcsrc/client/hud.qc:2871
+#, c-format
+msgid "^1PENALTY: %.1f (%s)"
+msgstr "^1PENALITÀ: %.1f (%s)"
+
+#: qcsrc/client/hud.qc:2873
+#, c-format
+msgid "^2PENALTY: %.1f (%s)"
+msgstr "^2PENALITÀ: %.1f (%s)"
+
+#: qcsrc/client/hud.qc:2901
+msgid "^1You must answer before entering hud configure mode\n"
+msgstr ""
+"^1Devi rispondere prima di entrare nella modalità di configurazione "
+"dell'HUD\n"
+
+#: qcsrc/client/hud.qc:2904
+msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
+msgstr "^2Nome ^7invece di \"^1Giocatore non registrato^7\" nelle statistiche"
+
+#: qcsrc/client/hud.qc:2986
+msgid "A vote has been called for:"
+msgstr "Un voto è stato chiamato per:"
+
+#: qcsrc/client/hud.qc:2988
+msgid "Allow servers to store and display your name?"
+msgstr "Permetti ai server di salvare e visualizzare il tuo nome?"
+
+#: qcsrc/client/hud.qc:2992
+msgid "^1Configure the HUD"
+msgstr "^1Configura l'HUD"
+
+#: qcsrc/client/hud.qc:2996
+#, c-format
+msgid "Yes (%s): %d"
+msgstr "Sì (%s): %d"
+
+#: qcsrc/client/hud.qc:2998
+#, c-format
+msgid "No (%s): %d"
+msgstr "No (%s): %d"
+
+#: qcsrc/client/hud.qc:3501 qcsrc/client/hud.qc:3504 qcsrc/client/hud.qc:3506
+msgid "Personal best"
+msgstr "Miglior personale"
+
+#: qcsrc/client/hud.qc:3519 qcsrc/client/hud.qc:3522 qcsrc/client/hud.qc:3524
+msgid "Server best"
+msgstr "Migliori del server"
+
+#: qcsrc/client/hud.qc:3868
+msgid "^3Player^7: This is the chat area."
+msgstr "^3Giocatore^7: Questa è l'area della chat."
+
+#: qcsrc/client/hud.qc:3936
+#, c-format
+msgid "FPS: %.*f"
+msgstr "FPS: %.*f"
+
+#: qcsrc/client/hud.qc:4003
+msgid "^1Observing"
+msgstr "^1Osservando"
+
+#: qcsrc/client/hud.qc:4005
+#, c-format
+msgid "^1Spectating: ^7%s"
+msgstr "^1Assistendo: ^7%s"
+
+#: qcsrc/client/hud.qc:4009
+#, c-format
+msgid "^1Press ^3%s^1 to spectate"
+msgstr "^1Premi ^3%s^1 per assistere"
+
+#: qcsrc/client/hud.qc:4011
+#, c-format
+msgid "^1Press ^3%s^1 for another player"
+msgstr "^1Premi ^3%s^1 per un altro giocatore"
+
+#: qcsrc/client/hud.qc:4015
+#, c-format
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgstr "^1Usa ^3%s^1 o ^3%s^1 per cambiare velocità"
+
+#: qcsrc/client/hud.qc:4017
+#, c-format
+msgid "^1Press ^3%s^1 to observe"
+msgstr "^1Premi ^3%s^1 per osservare"
+
+#: qcsrc/client/hud.qc:4020
+#, c-format
+msgid "^1Press ^3%s^1 for gamemode info"
+msgstr "^1Premi ^3%s^1 per informazioni sulla modalità di gioco"
+
+#: qcsrc/client/hud.qc:4024
+msgid "^1Wait for your turn to join"
+msgstr "^1Attendi il tuo turno per entrare"
+
+#: qcsrc/client/hud.qc:4030
+msgid "^1Match has already begun"
+msgstr "^1La partita è già iniziata"
+
+#: qcsrc/client/hud.qc:4032
+msgid "^1You have no more lives left"
+msgstr "^1Non hai più vite a disposizione"
+
+#: qcsrc/client/hud.qc:4034 qcsrc/client/hud.qc:4037
+#, c-format
+msgid "^1Press ^3%s^1 to join"
+msgstr "^1Premi ^3%s^1 per entrare"
+
+#: qcsrc/client/hud.qc:4045
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
+msgstr "^1La partita inizia tra ^3%d^1 secondi"
+
+#: qcsrc/client/hud.qc:4052
+msgid "^2Currently in ^1warmup^2 stage!"
+msgstr "^2Attualmente in ^1warmup^2!"
+
+#: qcsrc/client/hud.qc:4067
+#, c-format
+msgid "%sPress ^3%s%s to end warmup"
+msgstr "%sPremi ^3%s%s per terminare il warmup"
+
+#: qcsrc/client/hud.qc:4069
+#, c-format
+msgid "%sPress ^3%s%s once you are ready"
+msgstr "%sPremi ^3%s%s una volta che sei pronto"
+
+#: qcsrc/client/hud.qc:4074
+msgid "^2Waiting for others to ready up to end warmup..."
+msgstr "^2Attendendo che gli altri siano pronti per terminare il warmup..."
+
+#: qcsrc/client/hud.qc:4076
+msgid "^2Waiting for others to ready up..."
+msgstr "^2Attendendo che gli altri siano pronti..."
+
+#: qcsrc/client/hud.qc:4082
+#, c-format
+msgid "^2Press ^3%s^2 to end warmup"
+msgstr "^2Premi ^3%s^2 per terminare il warmup"
+
+#: qcsrc/client/hud.qc:4103
+msgid "Teamnumbers are unbalanced!"
+msgstr "Numero di giocatori per squadra sbilanciato!"
+
+#: qcsrc/client/hud.qc:4108
+#, c-format
+msgid " Press ^3%s%s to adjust"
+msgstr " Premi ^3%s%s per aggiustare"
+
+#: qcsrc/client/hud.qc:4116
+msgid "^7Press ^3ESC ^7to show HUD options."
+msgstr "^7Premi ^3ESC ^7per mostrare le opzioni dell'HUD."
+
+#: qcsrc/client/hud.qc:4118
+msgid "^3Doubleclick ^7a panel for panel-specific options."
+msgstr "^3Doppio-click ^7su un pannello per le sue specifiche opzioni."
+
+#: qcsrc/client/hud.qc:4120
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+msgstr "^3CTRL ^7per disabilitare il test di collisione, ^3SHIFT ^7e"
+
+#: qcsrc/client/hud.qc:4122
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+msgstr "^3ALT ^7+ ^3ARROW KEYS ^7per fini aggiustamenti"
+
+#: qcsrc/client/hud.qc:4160
+msgid " qu/s"
+msgstr " qu/s"
+
+#: qcsrc/client/hud.qc:4164
+msgid " m/s"
+msgstr " m/s"
+
+#: qcsrc/client/hud.qc:4168
+msgid " km/h"
+msgstr " km/h"
+
+#: qcsrc/client/hud.qc:4172
+msgid " mph"
+msgstr " mph"
+
+#: qcsrc/client/hud.qc:4176
+msgid " knots"
+msgstr " nodi"
+
+#: qcsrc/client/hud.qc:4823
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+msgstr ""
+"Corretti automaticamente numeri di pannello sbagliati/mancanti in "
+"_hud_panelorder\n"
+
+#: qcsrc/client/hud_config.qc:136
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr "^2Esportato con successo in %s! (nota: E' salvato in data/data/)\n"
+
+#: qcsrc/client/hud_config.qc:140
+#, c-format
+msgid "^1Couldn't write to %s\n"
+msgstr "^1Impossibile scrivere in %s\n"
+
+#: qcsrc/client/mapvoting.qc:28
+msgid " (1 vote)"
+msgstr " (1 voto)"
+
+#: qcsrc/client/mapvoting.qc:30
+#, c-format
+msgid " (%d votes)"
+msgstr " (%d voti)"
+
+#: qcsrc/client/mapvoting.qc:113
+msgid "Don't care"
+msgstr "Non importa"
+
+#: qcsrc/client/mapvoting.qc:194
+msgid "Vote for a map"
+msgstr "Vota per una mappa"
+
+#: qcsrc/client/mapvoting.qc:200
+#, c-format
+msgid "%d seconds left"
+msgstr "%d secondi rimanenti"
+
+#: qcsrc/client/mapvoting.qc:263
+msgid ""
+"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
+msgstr "mv_mapdownload: ^3Non avrai creduto di poter usare questo comando!\n"
+
+#: qcsrc/client/mapvoting.qc:273
+msgid "^1Error:^7 Couldn't find pak index.\n"
+msgstr "^1Errore:^7 Impossibile trovare il pak index.\n"
+
+#: qcsrc/client/mapvoting.qc:282
+msgid "Requesting preview...\n"
+msgstr "Richiedendo l'anteprima...\n"
+
+#: qcsrc/client/miscfunctions.qc:23
+msgid "^1Begin!"
+msgstr "^1Inizia!"
+
+#: qcsrc/client/miscfunctions.qc:34
+#, c-format
+msgid "^1Game starts in %d seconds"
+msgstr "^1Il gioco inizia tra %d secondi"
+
+#: qcsrc/client/miscfunctions.qc:113
+msgid "^1RED^7 flag"
+msgstr "^7Bandiera ^1ROSSA"
+
+#: qcsrc/client/miscfunctions.qc:118
+msgid "^4BLUE^7 flag"
+msgstr "^7Bandiera ^4BLU"
+
+#: qcsrc/client/miscfunctions.qc:126
+#, c-format
+msgid "You picked up the %s!"
+msgstr "Hai raccolto la %s!"
+
+#: qcsrc/client/miscfunctions.qc:130
+#, c-format
+msgid "You got the %s!"
+msgstr "Hai preso la %s!"
+
+#: qcsrc/client/miscfunctions.qc:283
+msgid "Trying to remove a team which is not in the teamlist!"
+msgstr "Tentando di rimuovere una squadra che non è nella lista delle squadre!"
+
+#: qcsrc/client/movetypes.qc:163
+#, c-format
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+
+#: qcsrc/client/movetypes.qc:166
+#, c-format
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+
+#: qcsrc/client/scoreboard.qc:19
+msgid "SCO^bckills"
+msgstr "uccisioni pp"
+
+#: qcsrc/client/scoreboard.qc:20
+msgid "SCO^bctime"
+msgstr "tempo pp"
+
+#: qcsrc/client/scoreboard.qc:21
+msgid "SCO^caps"
+msgstr "SCO^catture"
+
+#: qcsrc/client/scoreboard.qc:22
+msgid "SCO^deaths"
+msgstr "SCO^morti"
+
+#: qcsrc/client/scoreboard.qc:23
+msgid "SCO^destroyed"
+msgstr "SCO^distrutte"
+
+#: qcsrc/client/scoreboard.qc:24
+msgid "SCO^drops"
+msgstr "SCO^cadute"
+
+#: qcsrc/client/scoreboard.qc:25
+msgid "SCO^faults"
+msgstr "SCO^falli"
+
+#: qcsrc/client/scoreboard.qc:26
+msgid "SCO^fckills"
+msgstr "uccisioni pb"
+
+#: qcsrc/client/scoreboard.qc:27
+msgid "SCO^goals"
+msgstr "SCO^gol"
+
+#: qcsrc/client/scoreboard.qc:28
+msgid "SCO^kckills"
+msgstr "uccisioni pc"
+
+#: qcsrc/client/scoreboard.qc:29
+msgid "SCO^kdratio"
+msgstr "rapporto u/m"
+
+#: qcsrc/client/scoreboard.qc:30
+msgid "SCO^k/d"
+msgstr "u/m"
+
+#: qcsrc/client/scoreboard.qc:31
+msgid "SCO^kd"
+msgstr "um"
+
+#: qcsrc/client/scoreboard.qc:32
+msgid "SCO^kdr"
+msgstr "rum"
+
+#: qcsrc/client/scoreboard.qc:33
+msgid "SCO^kills"
+msgstr "SCO^uccisioni"
+
+#: qcsrc/client/scoreboard.qc:34
+msgid "SCO^laps"
+msgstr "SCO^giri"
+
+#: qcsrc/client/scoreboard.qc:35
+msgid "SCO^lives"
+msgstr "SCO^vite"
+
+#: qcsrc/client/scoreboard.qc:36
+msgid "SCO^losses"
+msgstr "SCO^perdute"
+
+#: qcsrc/client/scoreboard.qc:37
+msgid "SCO^name"
+msgstr "SCO^nome"
+
+#: qcsrc/client/scoreboard.qc:38
+msgid "SCO^nick"
+msgstr "SCO^nick"
+
+#: qcsrc/client/scoreboard.qc:39
+msgid "SCO^objectives"
+msgstr "obiettivi"
+
+#: qcsrc/client/scoreboard.qc:40
+msgid "SCO^pickups"
+msgstr "SCO^raccolte"
+
+#: qcsrc/client/scoreboard.qc:41
+msgid "SCO^ping"
+msgstr "SCO^ping"
+
+#: qcsrc/client/scoreboard.qc:42
+msgid "SCO^pl"
+msgstr "SCO^pl"
+
+#: qcsrc/client/scoreboard.qc:43
+msgid "SCO^pushes"
+msgstr "SCO^spinte"
+
+#: qcsrc/client/scoreboard.qc:44
+msgid "SCO^rank"
+msgstr "SCO^posizione"
+
+#: qcsrc/client/scoreboard.qc:45
+msgid "SCO^returns"
+msgstr "SCO^ritorni"
+
+#: qcsrc/client/scoreboard.qc:46
+msgid "SCO^revivals"
+msgstr "ravvivamenti"
+
+#: qcsrc/client/scoreboard.qc:47
+msgid "SCO^score"
+msgstr "SCO^punti"
+
+#: qcsrc/client/scoreboard.qc:48
+msgid "SCO^suicides"
+msgstr "SCO^suicidi"
+
+#: qcsrc/client/scoreboard.qc:49
+msgid "SCO^takes"
+msgstr "SCO^presi"
+
+#: qcsrc/client/scoreboard.qc:50
+msgid "SCO^ticks"
+msgstr "SCO^tick"
+
+#: qcsrc/client/scoreboard.qc:239
+msgid ""
+"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
+msgstr ""
+"Puoi modificare lo scoreboard usando il comando ^2scoreboard_columns_set.\n"
+
+#: qcsrc/client/scoreboard.qc:240
+msgid "^3|---------------------------------------------------------------|\n"
+msgstr "^3|---------------------------------------------------------------|\n"
+
+#: qcsrc/client/scoreboard.qc:242
+msgid "^2scoreboard_columns_set default\n"
+msgstr "^2scoreboard_columns_set default\n"
+
+#: qcsrc/client/scoreboard.qc:243
+msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgstr "^2scoreboard_columns_set ^7campo1 campo2 ...\n"
+
+#: qcsrc/client/scoreboard.qc:244
+msgid "The following field names are recognized (case insensitive):\n"
+msgstr "I seguenti nomi dei campi sono riconosciuti (non case-sensitive):\n"
+
+#: qcsrc/client/scoreboard.qc:245
+msgid ""
+"You can use a ^3|^7 to start the right-aligned fields.\n"
+"\n"
+msgstr ""
+"Puoi usare un ^3|^7 per iniziare i campi allineati a destra.\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:247
+msgid "^3name^7 or ^3nick^7 Name of a player\n"
+msgstr "^3name^7 o ^3nick^7 Nome di un giocatore\n"
+
+#: qcsrc/client/scoreboard.qc:248
+msgid "^3ping^7 Ping time\n"
+msgstr "^3ping^7 Tempo di ping\n"
+
+#: qcsrc/client/scoreboard.qc:249
+msgid "^3pl^7 Packet loss\n"
+msgstr "^3pl^7 Pacchetti persi\n"
+
+#: qcsrc/client/scoreboard.qc:250
+msgid "^3kills^7 Number of kills\n"
+msgstr "^3kills^7 Numero di uccisioni\n"
+
+#: qcsrc/client/scoreboard.qc:251
+msgid "^3deaths^7 Number of deaths\n"
+msgstr "^3deaths^7 Numero di morti\n"
+
+#: qcsrc/client/scoreboard.qc:252
+msgid "^3suicides^7 Number of suicides\n"
+msgstr "^3suicides^7 Numero di suicidi\n"
+
+#: qcsrc/client/scoreboard.qc:253
+msgid "^3frags^7 kills - suicides\n"
+msgstr "^3frags^7 uccisioni - suicidi\n"
+
+#: qcsrc/client/scoreboard.qc:254
+msgid "^3kd^7 The kill-death ratio\n"
+msgstr "^3kd^7 Rapporto uccisioni-morti\n"
+
+#: qcsrc/client/scoreboard.qc:255
+msgid ""
+"^3caps^7 How often a flag (CTF) or a key (KeyHunt) was "
+"captured\n"
+msgstr ""
+"^3caps^7 Per quante volte una bandiera (CTF) o una "
+"chiave (KeyHunt) è stata catturata\n"
+
+#: qcsrc/client/scoreboard.qc:256
+msgid ""
+"^3pickups^7 How often a flag (CTF) or a key (KeyHunt) or a "
+"ball (Keepaway) was picked up\n"
+msgstr ""
+"^3pickups^7 Per quante volte una bandiera (CTF) o una "
+"chiave (KeyHunt) o una palla (Keepaway) viene raccolta\n"
+
+#: qcsrc/client/scoreboard.qc:257
+msgid "^3fckills^7 Number of flag carrier kills\n"
+msgstr ""
+"^3fckills^7 Numero di uccisioni dei portatori di bandiera\n"
+
+#: qcsrc/client/scoreboard.qc:258
+msgid "^3returns^7 Number of flag returns\n"
+msgstr "^3returns^7 Numbero di ritorni della bandiera\n"
+
+#: qcsrc/client/scoreboard.qc:259
+msgid "^3drops^7 Number of flag drops\n"
+msgstr "^3drops^7 Numero di bandiere cadute\n"
+
+#: qcsrc/client/scoreboard.qc:260
+msgid "^3lives^7 Number of lives (LMS)\n"
+msgstr "^3lives^7 Numero di vite (LMS)\n"
+
+#: qcsrc/client/scoreboard.qc:261
+msgid "^3rank^7 Player rank\n"
+msgstr "^3rank^7 Posizione del giocatore\n"
+
+#: qcsrc/client/scoreboard.qc:262
+msgid "^3pushes^7 Number of players pushed into void\n"
+msgstr "^3pushes^7 Numero di giocatori spinti nel vuoto\n"
+
+#: qcsrc/client/scoreboard.qc:263
+msgid ""
+"^3destroyed^7 Number of keys destroyed by pushing them into "
+"void\n"
+msgstr ""
+"^3destroyed^7 Numero di chiavi distrutte spingendole nel "
+"vuoto\n"
+
+#: qcsrc/client/scoreboard.qc:264
+msgid "^3kckills^7 Number of keys carrier kills\n"
+msgstr ""
+"^3kckills^7 Numero di uccisioni di portatori di chiavi\n"
+
+#: qcsrc/client/scoreboard.qc:265
+msgid "^3losses^7 Number of times a key was lost\n"
+msgstr ""
+"^3losses^7 Numero di volte che una chiave s'è persa\n"
+
+#: qcsrc/client/scoreboard.qc:266
+msgid "^3laps^7 Number of laps finished (race/cts)\n"
+msgstr "^3laps^7 Numero di giri completati (corsa/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:267
+msgid "^3time^7 Total time raced (race/cts)\n"
+msgstr "^3time^7 Tempo totale (corsa/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:268
+msgid "^3fastest^7 Time of fastest lap (race/cts)\n"
+msgstr "^3fastest^7 Tempo del giro più veloce (corsa/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:269
+msgid "^3ticks^7 Number of ticks (DOM)\n"
+msgstr "^3ticks^7 Numero di tick (DOM)\n"
+
+#: qcsrc/client/scoreboard.qc:270
+msgid "^3takes^7 Number of domination points taken (DOM)\n"
+msgstr "^3takes^7 Numero di punti di dominio presi (DOM)\n"
+
+#: qcsrc/client/scoreboard.qc:271
+msgid "^3bckills^7 Number of ball carrier kills\n"
+msgstr ""
+"^3bckills^7 Numbero di uccisioni di portatori di palla\n"
+
+#: qcsrc/client/scoreboard.qc:272
+msgid ""
+"^3bctime^7 Total amount of time holding the ball in "
+"Keepaway\n"
+msgstr ""
+"^3bctime^7 Tempo totale di possesso della palla in "
+"Keepaway\n"
+
+#: qcsrc/client/scoreboard.qc:273
+msgid ""
+"^3score^7 Total score\n"
+"\n"
+msgstr ""
+"^3score^7 Punteggio totale\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:275
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"or in all but these game types. You can also specify 'all' as a\n"
+"field to show all fields available for the current game mode.\n"
+"\n"
+msgstr ""
+"Prima di un campo puoi mettere il segno + o -, seguito da una lista di tipi "
+"di gioco\n"
+"separati da virgole, seguita dal segno /, per mostrare il campo solo in "
+"questi\n"
+"o in tutti tranne questi tipi di gioco. Puoi anche specificare "
+"'all' (tutti)\n"
+"come campo per mostrare tutti i campi disponibili per l'attuale mdo di "
+"gioco.\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:280
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes.\n"
+"\n"
+msgstr ""
+"I nomi speciali per il tipo di gioco 'teams' e 'noteams' possono essere "
+"usati\n"
+"per includere/escludere TUTTE le modalità con team/senza team.\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:283
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+msgstr ""
+"Esempio: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+
+#: qcsrc/client/scoreboard.qc:284
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right.\n"
+msgstr ""
+"farà visualizzare nome, ping e pl allineati a sinistra, e i campi\n"
+"a destra della barra verticale allineati a destra.\n"
+
+#: qcsrc/client/scoreboard.qc:286
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM.\n"
+msgstr ""
+"'field3' sarà mostrato solo in CTF, e 'field4' sarà mostrato in tutte\n"
+"le altre modalità di gioco eccetto DM.\n"
+
+#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447
+#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466
+#: qcsrc/client/scoreboard.qc:475
+#, c-format
+msgid "fixed missing field '%s'\n"
+msgstr "riparato campo mancante '%s'\n"
+
+#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
+msgid "N/A"
+msgstr "N/D"
+
+#: qcsrc/client/scoreboard.qc:950
+#, c-format
+msgid "Accuracy stats (average %d%%)"
+msgstr "Statistiche precisione (media %d%%)"
+
+#: qcsrc/client/scoreboard.qc:1015
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: qcsrc/client/scoreboard.qc:1075
+msgid "Rankings"
+msgstr "Classifica"
+
+#: qcsrc/client/scoreboard.qc:1170
+msgid "Scoreboard"
+msgstr "Tabella dei punteggi"
+
+#: qcsrc/client/scoreboard.qc:1215
+#, c-format
+msgid "Speed award: %d ^7(%s^7)"
+msgstr "Velocità migliore: %d ^7(%s^7)"
+
+#: qcsrc/client/scoreboard.qc:1219
+#, c-format
+msgid "All-time fastest: %d ^7(%s^7)"
+msgstr "Tempo più veloce in assoluto: %d ^7(%s^7)"
+
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
+msgid "Spectators"
+msgstr "Spettatori"
+
+#: qcsrc/client/scoreboard.qc:1252
+#, c-format
+msgid "playing on ^2%s^7"
+msgstr "giocando in ^2%s^7"
+
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
+#, c-format
+msgid " for up to ^1%1.0f minutes^7"
+msgstr " fino a ^1%1.0f minuti^7"
+
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
+msgid " or"
+msgstr " o"
+
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
+#, c-format
+msgid " until ^3%s %s^7"
+msgstr " fino a ^3%s %s^7"
+
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
+msgid "SCO^points"
+msgstr "SCO^punti"
+
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
+msgid "SCO^is beaten"
+msgstr "SCO^è battuto"
+
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
+#, c-format
+msgid " until a lead of ^3%s %s^7"
+msgstr " fino a che si vince di ^3%s %s^7"
+
+#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
+#, c-format
+msgid "Cannot initialize sound %s\n"
+msgstr "Impossibile inizializzare il suono %s\n"
+
+#: qcsrc/client/teamplay.qc:64
+msgid "Red Team"
+msgstr "Team Rosso"
+
+#: qcsrc/client/teamplay.qc:65
+msgid "Blue Team"
+msgstr "Team Blu"
+
+#: qcsrc/client/teamplay.qc:66
+msgid "Yellow Team"
+msgstr "Team Giallo"
+
+#: qcsrc/client/teamplay.qc:67
+msgid "Pink Team"
+msgstr "Team Rosa"
+
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
+msgstr "Spingi"
+
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
+msgstr "Distruggi"
+
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
+msgstr "Difendi"
+
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
+msgstr "Base Blu"
+
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
+msgstr "PERICOLO"
+
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
+msgstr "Portatore bandiera"
+
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
+msgstr "Bandiera rilasciata"
+
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
+msgstr "Aiuto!"
+
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
+msgstr "Qui"
+
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
+msgstr "Chiave rilasciata"
+
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
+msgstr "Portatore chiave"
+
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
+msgstr "Corri qui"
+
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
+msgstr "Base Rossa"
+
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
+msgstr "Waypoint"
+
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
+msgstr "Generatore"
+
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
+msgstr "Punto di controllo"
+
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
+msgstr "Checkpoint"
+
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
+msgstr "Arrivo"
+
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
+msgstr "Partenza"
+
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
+msgstr "Palla"
+
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
+msgstr "Portatore palla"
+
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
+msgstr "Minstanex"
+
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
+msgstr "Hook"
+
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
+msgstr "HLAC"
+
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Fucile"
+
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
+msgstr "Invisibilità"
+
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
+msgstr "Vita extra"
+
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
+msgstr "Velocità"
+
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
+msgstr "Forza"
+
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
+msgstr "Scudo"
+
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
+msgstr "Rigeneratore di carburante"
+
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
+msgstr "Jet Pack"
+
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
+msgstr "Congelato!"
+
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
+msgstr "Contrassegnato"
+
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
+msgstr "Veicolo"
+
+#: qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
+msgstr "Spam"
+
+#: qcsrc/client/waypointsprites.qc:594
+#, c-format
+msgid "%s needing help!"
+msgstr "%s sta chiedendo aiuto!"
+
+#: qcsrc/common/mapinfo.qc:1092
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/server/w_crylink.qc:666
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr "%s è riuscito ad autodistruggersi col Crylink"
+
+#: qcsrc/server/w_crylink.qc:671
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr "%s non s'è potuto nascondere dal Crylink di %s"
+
+#: qcsrc/server/w_crylink.qc:673
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr "%s era troppo vicino al Crylink di %s"
+
+#: qcsrc/server/w_crylink.qc:675
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr "%s ha visto da vicino il Crylink di %s"
+
+#: qcsrc/server/w_electro.qc:574
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr "%s non s'è ricordato dove aveva messo il plasma"
+
+#: qcsrc/server/w_electro.qc:576
+#, c-format
+msgid "%s played with plasma"
+msgstr "%s ha giocato col plasma"
+
+#: qcsrc/server/w_electro.qc:583
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr "%s ha appena notato la palla blu di %s"
+
+#: qcsrc/server/w_electro.qc:585
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr "%s è entrato in contatto con la palla blu di %s"
+
+#: qcsrc/server/w_electro.qc:590
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr "%s ha sentito l'aria elettrificata della combo di %s"
+
+#: qcsrc/server/w_electro.qc:592
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr "%s s'è avvicinato troppo al raggio blu di %s"
+
+#: qcsrc/server/w_electro.qc:594
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr "%s è stato fatto saltare in aria dal raggio blu di %s"
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr "%s s'è dimenticato di alcune mine infuocate"
+
+#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr "%s avrebbe dovuto usare un'arma più piccola"
+
+#: qcsrc/server/w_fireball.qc:426
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr "%s ha provato a catturare la mina infuocata di %s"
+
+#: qcsrc/server/w_fireball.qc:428
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr "%s ha fatalmente ignorato la mina infuocata di %s"
+
+#: qcsrc/server/w_fireball.qc:435
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr "%s non è riuscito a nascondersi dalla fireball di %s"
+
+#: qcsrc/server/w_fireball.qc:437
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr "%s ha visto le belle luci della fireball di %s"
+
+#: qcsrc/server/w_fireball.qc:440
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr "%s s'è avvicinato troppo alla fireball di %s"
+
+#: qcsrc/server/w_fireball.qc:442
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr "%s ha assaggiato la fireball di %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:383
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr "%s ha provato da solo la propria granata"
+
+#: qcsrc/server/w_grenadelauncher.qc:385
+#, c-format
+msgid "%s detonated"
+msgstr "%s è detonato"
+
+#: qcsrc/server/w_grenadelauncher.qc:391
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr "%s non ha visto la granata di %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:393
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr "%s ha quasi schivato la granata di %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:395
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr "%s ha mangiato la granata di %s"
+
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr "%s ha giocato con piccoli razzi"
+
+#: qcsrc/server/w_hagar.qc:399
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr "%s ha sperato che il missile di %s non rimbalzasse"
+
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr "%s è stato preso a pugni da %s"
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:242
+#, c-format
+msgid "%s was cut down by %s"
+msgstr "%s è stato abbattuto da %s"
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
+#, c-format
+msgid "%s did the impossible"
+msgstr "%s ha fatto l'impossibile"
+
+#: qcsrc/server/w_hook.qc:268
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr "%s è corso nella bomba di gravità di %s"
+
+#: qcsrc/server/w_laser.qc:311
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr "%s si è \"laserato\" all'inferno"
+
+#: qcsrc/server/w_laser.qc:315
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr "%s è stato tagliato a metà dal guanto di %s"
+
+#: qcsrc/server/w_laser.qc:317
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr "%s è stato \"laserato\" alla morte da %s"
+
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
+#, c-format
+msgid "%s exploded"
+msgstr "%s è esploso"
+
+#: qcsrc/server/w_minelayer.qc:527
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr "%s s'è avvicinato troppo alla mina di %s"
+
+#: qcsrc/server/w_minelayer.qc:529
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr "%s ha quasi schivato la mina di %s"
+
+#: qcsrc/server/w_minelayer.qc:531
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr "%s è passato sopra la mina di %s"
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s sta ora pensando con i portali"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr "%s è stato vaporizzato da %s"
+
+#: qcsrc/server/w_porto.qc:298
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr "%s ha sentito %s fargli l'impossibile"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s si è sparato da solo automaticamente"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s si è fucilato da solo in qualche modo"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s è morto nella raffica di proiettili di %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s non è riuscito a nascondersi dal fucile di %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s ha preso un colpo in testa da %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s è stato fucilato da %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr "%s s'è avvicinato troppo al razzo di %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:507
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr "%s ha quasi schivato il razzo di %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:509
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr "%s ha mangiato il razzo di %s"
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:659
+#, c-format
+msgid "%s was tagged by %s"
+msgstr "%s è stato contrassegnato da %s"
+
+#: qcsrc/server/w_shotgun.qc:219
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr "%2$s ^7ha schiaffeggiato %1$s ^7un pò con un grosso ^2shotgun"
+
+#: qcsrc/server/w_shotgun.qc:221
+#, c-format
+msgid "%s was gunned by %s"
+msgstr "%s è stato sparato da %s"
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:252
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr "%s s'è fatto male alle orecchie con la @!#%%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:256
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Tuba"
+
+#: qcsrc/server/w_uzi.qc:323
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr "%s è stato riempito di buchi da %s"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "Vote for a map"
msgstr ""
-#: qcsrc/client/mapvoting.qc:199
+#: qcsrc/client/mapvoting.qc:200
#, c-format
msgid "%d seconds left"
msgstr ""
msgid "^4CSQC Build information: ^1%s\n"
msgstr ""
-#: qcsrc/client/Main.qc:232 qcsrc/client/Main.qc:248
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
#, c-format
msgid "trying to switch to unsupported team %d\n"
msgstr ""
-#: qcsrc/client/Main.qc:364 qcsrc/client/scoreboard.qc:241
+#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
msgid "Usage:\n"
msgstr ""
-#: qcsrc/client/Main.qc:365
+#: qcsrc/client/Main.qc:370
msgid "hud_save configname (saves to hud_skinname_configname.cfg)\n"
msgstr ""
-#: qcsrc/client/Main.qc:512
+#: qcsrc/client/Main.qc:494
msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
msgstr ""
-#: qcsrc/client/Main.qc:513
+#: qcsrc/client/Main.qc:495
msgid " settemp cvar value\n"
msgstr ""
-#: qcsrc/client/Main.qc:514
+#: qcsrc/client/Main.qc:496
msgid " scoreboard_columns_set ...\n"
msgstr ""
-#: qcsrc/client/Main.qc:515
+#: qcsrc/client/Main.qc:497
msgid " scoreboard_columns_help\n"
msgstr ""
-#: qcsrc/client/Main.qc:720
-msgid "A CSQC entity changed its owner!\n"
+#: qcsrc/client/Main.qc:726
+#, c-format
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
msgstr ""
-#: qcsrc/client/Main.qc:934
-msgid "A CSQC entity changed its type!\n"
+#: qcsrc/client/Main.qc:964
+#, c-format
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
msgstr ""
-#: qcsrc/client/Main.qc:972
+#: qcsrc/client/Main.qc:1005
#, c-format
-msgid "unknown entity type in CSQC_Ent_Update: %d\n"
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
msgstr ""
-#: qcsrc/client/Main.qc:1444
+#: qcsrc/client/Main.qc:1451
#, c-format
msgid "%s (not bound)"
msgstr ""
-#: qcsrc/client/Main.qc:1449 qcsrc/client/hud.qc:407
+#: qcsrc/client/Main.qc:1456 qcsrc/client/hud.qc:230
#, c-format
msgid "%s (%s)"
msgstr ""
msgid "Cannot initialize sound %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:337
+#: qcsrc/client/hud.qc:160
msgid "1st"
msgstr ""
-#: qcsrc/client/hud.qc:339
+#: qcsrc/client/hud.qc:162
msgid "2nd"
msgstr ""
-#: qcsrc/client/hud.qc:341
+#: qcsrc/client/hud.qc:164
msgid "3rd"
msgstr ""
-#: qcsrc/client/hud.qc:343
+#: qcsrc/client/hud.qc:166
#, c-format
msgid "%dth"
msgstr ""
-#: qcsrc/client/hud.qc:375
+#: qcsrc/client/hud.qc:198
#, c-format
msgid " (-%dL)"
msgstr ""
-#: qcsrc/client/hud.qc:380
+#: qcsrc/client/hud.qc:203
#, c-format
msgid " (+%dL)"
msgstr ""
-#: qcsrc/client/hud.qc:396
+#: qcsrc/client/hud.qc:219
msgid "Start line"
msgstr ""
-#: qcsrc/client/hud.qc:398 qcsrc/client/hud.qc:402
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
msgid "Finish line"
msgstr ""
-#: qcsrc/client/hud.qc:400
+#: qcsrc/client/hud.qc:223
#, c-format
msgid "Intermediate %d"
msgstr ""
-#: qcsrc/client/hud.qc:409
+#: qcsrc/client/hud.qc:232
#, c-format
msgid "%s (%s %s)"
msgstr ""
-#: qcsrc/client/hud.qc:553
-#, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
-msgstr ""
-
-#: qcsrc/client/hud.qc:557
-#, c-format
-msgid "^1Couldn't write to %s\n"
-msgstr ""
-
-#: qcsrc/client/hud.qc:1837
+#: qcsrc/client/hud.qc:772
msgid "Out of ammo"
msgstr ""
-#: qcsrc/client/hud.qc:1841
+#: qcsrc/client/hud.qc:776
msgid "Don't have"
msgstr ""
-#: qcsrc/client/hud.qc:1845
+#: qcsrc/client/hud.qc:780
msgid "Unavailable"
msgstr ""
-#: qcsrc/client/hud.qc:2696
+#: qcsrc/client/hud.qc:1520
#, c-format
msgid "^1%s^1 couldn't take it anymore\n"
msgstr ""
-#: qcsrc/client/hud.qc:2700 qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
#, c-format
msgid "^1%s^1 died\n"
msgstr ""
-#: qcsrc/client/hud.qc:2704
+#: qcsrc/client/hud.qc:1528
#, c-format
msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
msgstr ""
-#: qcsrc/client/hud.qc:2708
+#: qcsrc/client/hud.qc:1532
#, c-format
msgid "^1%s^1 thought they found a nice camping ground\n"
msgstr ""
-#: qcsrc/client/hud.qc:2712
+#: qcsrc/client/hud.qc:1536
#, c-format
msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
msgstr ""
-#: qcsrc/client/hud.qc:2716
+#: qcsrc/client/hud.qc:1540
#, c-format
msgid "^1%s^1 unfairly eliminated themself\n"
msgstr ""
-#: qcsrc/client/hud.qc:2720
+#: qcsrc/client/hud.qc:1544
#, c-format
msgid "^1%s^1 burned to death\n"
msgstr ""
-#: qcsrc/client/hud.qc:2724
+#: qcsrc/client/hud.qc:1548
#, c-format
msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
msgstr ""
-#: qcsrc/client/hud.qc:2728
+#: qcsrc/client/hud.qc:1552
#, c-format
msgid "^1%s^1 ended it all after a %d kill spree\n"
msgstr ""
-#: qcsrc/client/hud.qc:2745
+#: qcsrc/client/hud.qc:1569
#, c-format
msgid "^1%s^1 took action against a team mate\n"
msgstr ""
-#: qcsrc/client/hud.qc:2747
+#: qcsrc/client/hud.qc:1571
#, c-format
msgid "^1%s^1 mows down a team mate\n"
msgstr ""
-#: qcsrc/client/hud.qc:2752
+#: qcsrc/client/hud.qc:1576
#, c-format
msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
msgstr ""
-#: qcsrc/client/hud.qc:2754
+#: qcsrc/client/hud.qc:1578
#, c-format
msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
msgstr ""
-#: qcsrc/client/hud.qc:2758
+#: qcsrc/client/hud.qc:1582
#, c-format
msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2760
+#: qcsrc/client/hud.qc:1584
#, c-format
msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2764
+#: qcsrc/client/hud.qc:1588
#, c-format
msgid "^1%s^1 drew first blood\n"
msgstr ""
-#: qcsrc/client/hud.qc:2768
+#: qcsrc/client/hud.qc:1592
#, c-format
msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
msgstr ""
-#: qcsrc/client/hud.qc:2770
+#: qcsrc/client/hud.qc:1594
#, c-format
msgid "^1%s^1 was telefragged by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2775
+#: qcsrc/client/hud.qc:1599
#, c-format
msgid "^1%s^1 was drowned by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2780
+#: qcsrc/client/hud.qc:1604
#, c-format
msgid "^1%s^1 was slimed by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2785
+#: qcsrc/client/hud.qc:1609
#, c-format
msgid "^1%s^1 was cooked by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2790
+#: qcsrc/client/hud.qc:1614
#, c-format
msgid "^1%s^1 was grounded by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2795
+#: qcsrc/client/hud.qc:1619
#, c-format
msgid "^1%s^1 was shot into space by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2800
+#: qcsrc/client/hud.qc:1624
#, c-format
msgid "^1%s^1 was conserved by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2806
+#: qcsrc/client/hud.qc:1630
#, c-format
msgid "^1%s^1 was thrown into a world of hurt by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2810
+#: qcsrc/client/hud.qc:1634
#, c-format
msgid "^1%s^1 was crushed by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2814
+#: qcsrc/client/hud.qc:1638
#, c-format
msgid "^1%s^1 got shredded by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2818
+#: qcsrc/client/hud.qc:1642
#, c-format
msgid "^1%s^1 was blasted to bits by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2822
+#: qcsrc/client/hud.qc:1646
#, c-format
msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
msgstr ""
-#: qcsrc/client/hud.qc:2826
+#: qcsrc/client/hud.qc:1650
#, c-format
msgid "^1%s^1 was bolted down by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2830
+#: qcsrc/client/hud.qc:1654
#, c-format
msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
msgstr ""
-#: qcsrc/client/hud.qc:2834
+#: qcsrc/client/hud.qc:1658
#, c-format
msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
msgstr ""
-#: qcsrc/client/hud.qc:2838
+#: qcsrc/client/hud.qc:1662
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:1666
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:1670
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:1674
#, c-format
msgid "^1%s^1 was pushed into the line of fire by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2842
+#: qcsrc/client/hud.qc:1678
#, c-format
msgid "^1%s^1 was pushed into an accident by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2846
+#: qcsrc/client/hud.qc:1682
#, c-format
msgid "^1%s^1 was unfairly eliminated by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2850
+#: qcsrc/client/hud.qc:1686
#, c-format
msgid "^1%s^1 was burnt to death by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2862
+#: qcsrc/client/hud.qc:1698
#, c-format
msgid "^1%s^1 was fragged by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2867
+#: qcsrc/client/hud.qc:1703
#, c-format
msgid "^1%s^1's %s scoring spree was ended by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2869
+#: qcsrc/client/hud.qc:1705
#, c-format
msgid "^1%s^1's %s kill spree was ended by %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:2872
+#: qcsrc/client/hud.qc:1708
#, c-format
msgid "^1%s^1 made %s scores in a row\n"
msgstr ""
-#: qcsrc/client/hud.qc:2874
+#: qcsrc/client/hud.qc:1710
#, c-format
msgid "^1%s^1 has %s frags in a row\n"
msgstr ""
-#: qcsrc/client/hud.qc:2877
+#: qcsrc/client/hud.qc:1713
#, c-format
msgid "%s^7 made a ^1TRIPLE SCORE\n"
msgstr ""
-#: qcsrc/client/hud.qc:2879
+#: qcsrc/client/hud.qc:1715
#, c-format
msgid "%s^7 made a ^1TRIPLE FRAG\n"
msgstr ""
-#: qcsrc/client/hud.qc:2882
+#: qcsrc/client/hud.qc:1718
#, c-format
msgid "%s^7 unleashes ^1SCORING RAGE\n"
msgstr ""
-#: qcsrc/client/hud.qc:2884
+#: qcsrc/client/hud.qc:1720
#, c-format
msgid "%s^7 unleashes ^1RAGE\n"
msgstr ""
-#: qcsrc/client/hud.qc:2887
+#: qcsrc/client/hud.qc:1723
#, c-format
msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2889
+#: qcsrc/client/hud.qc:1725
#, c-format
msgid "%s^7 starts the ^1MASSACRE!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2892
+#: qcsrc/client/hud.qc:1728
#, c-format
msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2894
+#: qcsrc/client/hud.qc:1730
#, c-format
msgid "%s^7 executes ^1MAYHEM!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2897
+#: qcsrc/client/hud.qc:1733
#, c-format
msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2899
+#: qcsrc/client/hud.qc:1735
#, c-format
msgid "%s^7 is a ^1BERSERKER!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2902
+#: qcsrc/client/hud.qc:1738
#, c-format
msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:1740
#, c-format
msgid "%s^7 inflicts ^1CARNAGE!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2907
+#: qcsrc/client/hud.qc:1743
#, c-format
msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2909
+#: qcsrc/client/hud.qc:1745
#, c-format
msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
msgstr ""
-#: qcsrc/client/hud.qc:2917
+#: qcsrc/client/hud.qc:1753
#, c-format
msgid "^1%s^1 was in the water for too long\n"
msgstr ""
-#: qcsrc/client/hud.qc:2919
+#: qcsrc/client/hud.qc:1755
#, c-format
msgid "^1%s^1 drowned\n"
msgstr ""
-#: qcsrc/client/hud.qc:2924
+#: qcsrc/client/hud.qc:1760
#, c-format
msgid "^1%s^1 was slimed\n"
msgstr ""
-#: qcsrc/client/hud.qc:2930
+#: qcsrc/client/hud.qc:1766
#, c-format
msgid "^1%s^1 found a hot place\n"
msgstr ""
-#: qcsrc/client/hud.qc:2932
+#: qcsrc/client/hud.qc:1768
#, c-format
msgid "^1%s^1 turned into hot slag\n"
msgstr ""
-#: qcsrc/client/hud.qc:2939
+#: qcsrc/client/hud.qc:1775
#, c-format
msgid "^1%s^1 tested gravity (and it worked)\n"
msgstr ""
-#: qcsrc/client/hud.qc:2941
+#: qcsrc/client/hud.qc:1777
#, c-format
msgid "^1%s^1 hit the ground with a crunch\n"
msgstr ""
-#: qcsrc/client/hud.qc:2946
+#: qcsrc/client/hud.qc:1782
#, c-format
msgid "^1%s^1 became a shooting star\n"
msgstr ""
-#: qcsrc/client/hud.qc:2952
+#: qcsrc/client/hud.qc:1788
#, c-format
msgid "^1%s^1 discovered a swamp\n"
msgstr ""
-#: qcsrc/client/hud.qc:2954
+#: qcsrc/client/hud.qc:1790
#, c-format
msgid "^1%s^1 is now conserved for centuries to come\n"
msgstr ""
-#: qcsrc/client/hud.qc:2959
+#: qcsrc/client/hud.qc:1795
#, c-format
msgid "^1%s^1 was mowed down by a turret \n"
msgstr ""
-#: qcsrc/client/hud.qc:2971
+#: qcsrc/client/hud.qc:1807
#, c-format
msgid "^1%s^1 died in an accident\n"
msgstr ""
-#: qcsrc/client/hud.qc:2975
+#: qcsrc/client/hud.qc:1811
#, c-format
msgid "^1%s^1 was unfairly eliminated\n"
msgstr ""
-#: qcsrc/client/hud.qc:2981
+#: qcsrc/client/hud.qc:1817
#, c-format
msgid "^1%s^1 felt a little hot\n"
msgstr ""
-#: qcsrc/client/hud.qc:2983
+#: qcsrc/client/hud.qc:1819
#, c-format
msgid "^1%s^1 burnt to death\n"
msgstr ""
-#: qcsrc/client/hud.qc:2990
+#: qcsrc/client/hud.qc:1826
#, c-format
msgid "^1%s^1 needs a restart\n"
msgstr ""
-#: qcsrc/client/hud.qc:2997
+#: qcsrc/client/hud.qc:1833
#, c-format
msgid "^1%s^1 needs a restart after a %d scoring spree\n"
msgstr ""
-#: qcsrc/client/hud.qc:2999
+#: qcsrc/client/hud.qc:1835
#, c-format
msgid "^1%s^1 died with a %d kill spree\n"
msgstr ""
-#: qcsrc/client/hud.qc:3003
+#: qcsrc/client/hud.qc:1839
#, c-format
msgid "%s^7 got the %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:3006
+#: qcsrc/client/hud.qc:1842
#, c-format
msgid "%s^7 lost the %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:3009
+#: qcsrc/client/hud.qc:1845
#, c-format
msgid "%s^7 picked up the %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:3012
+#: qcsrc/client/hud.qc:1848
#, c-format
msgid "%s^7 returned the %s\n"
msgstr ""
-#: qcsrc/client/hud.qc:3015
+#: qcsrc/client/hud.qc:1851
#, c-format
msgid "%s^7 captured the %s%s\n"
msgstr ""
-#: qcsrc/client/hud.qc:3034
+#: qcsrc/client/hud.qc:1870
#, c-format
msgid "%s^7 has picked up the ball!\n"
msgstr ""
-#: qcsrc/client/hud.qc:3039
+#: qcsrc/client/hud.qc:1875
#, c-format
msgid "%s^7 has dropped the ball!\n"
msgstr ""
-#: qcsrc/client/hud.qc:3052
+#: qcsrc/client/hud.qc:1886
#, c-format
msgid "You are now on: %s"
msgstr ""
-#: qcsrc/client/hud.qc:3054
+#: qcsrc/client/hud.qc:1888
#, c-format
msgid ""
"You have been moved into a different team to improve team balance\n"
"You are now on: %s"
msgstr ""
-#: qcsrc/client/hud.qc:3057
+#: qcsrc/client/hud.qc:1891
msgid "^1Reconsider your tactics, camper!"
msgstr ""
-#: qcsrc/client/hud.qc:3059
+#: qcsrc/client/hud.qc:1893
msgid "^1Die camper!"
msgstr ""
-#: qcsrc/client/hud.qc:3062
+#: qcsrc/client/hud.qc:1896
msgid "^1You are reinserted into the game for running out of ammo..."
msgstr ""
-#: qcsrc/client/hud.qc:3064
+#: qcsrc/client/hud.qc:1898
msgid "^1You were killed for running out of ammo..."
msgstr ""
-#: qcsrc/client/hud.qc:3067
+#: qcsrc/client/hud.qc:1901
msgid "^1You need to preserve your health"
msgstr ""
-#: qcsrc/client/hud.qc:3069
+#: qcsrc/client/hud.qc:1903
msgid "^1You grew too old without taking your medicine"
msgstr ""
-#: qcsrc/client/hud.qc:3072
+#: qcsrc/client/hud.qc:1906
msgid "^1Don't go against team mates!"
msgstr ""
-#: qcsrc/client/hud.qc:3074
+#: qcsrc/client/hud.qc:1908
msgid "^1Don't shoot your team mates!"
msgstr ""
-#: qcsrc/client/hud.qc:3079
+#: qcsrc/client/hud.qc:1913
msgid "^1You need to be more careful!"
msgstr ""
-#: qcsrc/client/hud.qc:3081
+#: qcsrc/client/hud.qc:1915
msgid "^1You killed your own dumb self!"
msgstr ""
-#: qcsrc/client/hud.qc:3086
+#: qcsrc/client/hud.qc:1920
#, c-format
-msgid "^1Moron! You went against %s, a team mate!"
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
msgstr ""
-#: qcsrc/client/hud.qc:3088
+#: qcsrc/client/hud.qc:1922
#, c-format
-msgid "^1Moron! You fragged %s, a team mate!"
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
msgstr ""
-#: qcsrc/client/hud.qc:3092
+#: qcsrc/client/hud.qc:1926
msgid "^1First score"
msgstr ""
-#: qcsrc/client/hud.qc:3094
+#: qcsrc/client/hud.qc:1928
msgid "^1First blood"
msgstr ""
-#: qcsrc/client/hud.qc:3098
+#: qcsrc/client/hud.qc:1932
msgid "^1First casualty"
msgstr ""
-#: qcsrc/client/hud.qc:3100
+#: qcsrc/client/hud.qc:1934
msgid "^1First victim"
msgstr ""
-#: qcsrc/client/hud.qc:3104
+#: qcsrc/client/hud.qc:1938
#, c-format
msgid "^1You scored against ^7%s^1 who was typing!"
msgstr ""
-#: qcsrc/client/hud.qc:3106
+#: qcsrc/client/hud.qc:1940
#, c-format
msgid "^1You typefragged ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3110
+#: qcsrc/client/hud.qc:1944
#, c-format
msgid "^1You were scored against by ^7%s^1 while you were typing!"
msgstr ""
-#: qcsrc/client/hud.qc:3112
+#: qcsrc/client/hud.qc:1946
#, c-format
msgid "^1You were typefragged by ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3116
+#: qcsrc/client/hud.qc:1950
#, c-format
msgid "^4You scored against ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3118
+#: qcsrc/client/hud.qc:1952
#, c-format
msgid "^4You fragged ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3122
+#: qcsrc/client/hud.qc:1956
#, c-format
msgid "^1You were scored against by ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3124
+#: qcsrc/client/hud.qc:1958
#, c-format
msgid "^1You were fragged by ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:3129
+#: qcsrc/client/hud.qc:1963
msgid "^1Watch your step!"
msgstr ""
-#: qcsrc/client/hud.qc:3194 qcsrc/client/hud.qc:3195
+#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
#, c-format
msgid "Player %d"
msgstr ""
-#: qcsrc/client/hud.qc:3791
+#: qcsrc/client/hud.qc:2823
msgid "^1Intermediate 1 (+15.42)"
msgstr ""
-#: qcsrc/client/hud.qc:3793 qcsrc/client/hud.qc:3835 qcsrc/client/hud.qc:3876
+#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
#, c-format
msgid "^1PENALTY: %.1f (%s)"
msgstr ""
-#: qcsrc/client/hud.qc:3878
+#: qcsrc/client/hud.qc:2910
#, c-format
msgid "^2PENALTY: %.1f (%s)"
msgstr ""
-#: qcsrc/client/hud.qc:3903
+#: qcsrc/client/hud.qc:2938
+msgid "^1You must answer before entering hud configure mode\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2941
msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
msgstr ""
-#: qcsrc/client/hud.qc:3985
+#: qcsrc/client/hud.qc:3023
msgid "A vote has been called for:"
msgstr ""
-#: qcsrc/client/hud.qc:3987
+#: qcsrc/client/hud.qc:3025
msgid "Allow servers to store and display your name?"
msgstr ""
-#: qcsrc/client/hud.qc:3991
+#: qcsrc/client/hud.qc:3029
msgid "^1Configure the HUD"
msgstr ""
-#: qcsrc/client/hud.qc:3995
+#: qcsrc/client/hud.qc:3033
#, c-format
msgid "Yes (%s): %d"
msgstr ""
-#: qcsrc/client/hud.qc:3997
+#: qcsrc/client/hud.qc:3035
#, c-format
msgid "No (%s): %d"
msgstr ""
-#: qcsrc/client/hud.qc:4510 qcsrc/client/hud.qc:4513 qcsrc/client/hud.qc:4515
+#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
msgid "Personal best"
msgstr ""
-#: qcsrc/client/hud.qc:4528 qcsrc/client/hud.qc:4531 qcsrc/client/hud.qc:4533
+#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
msgid "Server best"
msgstr ""
-#: qcsrc/client/hud.qc:4765
+#: qcsrc/client/hud.qc:3905
msgid "^3Player^7: This is the chat area."
msgstr ""
-#: qcsrc/client/hud.qc:4828
+#: qcsrc/client/hud.qc:3973
#, c-format
msgid "FPS: %.*f"
msgstr ""
-#: qcsrc/client/hud.qc:4893
+#: qcsrc/client/hud.qc:4040
msgid "^1Observing"
msgstr ""
-#: qcsrc/client/hud.qc:4895
+#: qcsrc/client/hud.qc:4042
#, c-format
msgid "^1Spectating: ^7%s"
msgstr ""
-#: qcsrc/client/hud.qc:4899
+#: qcsrc/client/hud.qc:4046
#, c-format
msgid "^1Press ^3%s^1 to spectate"
msgstr ""
-#: qcsrc/client/hud.qc:4901
+#: qcsrc/client/hud.qc:4048
#, c-format
msgid "^1Press ^3%s^1 for another player"
msgstr ""
-#: qcsrc/client/hud.qc:4905
+#: qcsrc/client/hud.qc:4052
#, c-format
msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
msgstr ""
-#: qcsrc/client/hud.qc:4907
+#: qcsrc/client/hud.qc:4054
#, c-format
msgid "^1Press ^3%s^1 to observe"
msgstr ""
-#: qcsrc/client/hud.qc:4910
+#: qcsrc/client/hud.qc:4057
#, c-format
msgid "^1Press ^3%s^1 for gamemode info"
msgstr ""
-#: qcsrc/client/hud.qc:4914
+#: qcsrc/client/hud.qc:4061
msgid "^1Wait for your turn to join"
msgstr ""
-#: qcsrc/client/hud.qc:4920
+#: qcsrc/client/hud.qc:4067
msgid "^1Match has already begun"
msgstr ""
-#: qcsrc/client/hud.qc:4922
+#: qcsrc/client/hud.qc:4069
msgid "^1You have no more lives left"
msgstr ""
-#: qcsrc/client/hud.qc:4924 qcsrc/client/hud.qc:4927
+#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
#, c-format
msgid "^1Press ^3%s^1 to join"
msgstr ""
-#: qcsrc/client/hud.qc:4935
+#: qcsrc/client/hud.qc:4082
#, c-format
msgid "^1Game starts in ^3%d^1 seconds"
msgstr ""
-#: qcsrc/client/hud.qc:4942
+#: qcsrc/client/hud.qc:4089
msgid "^2Currently in ^1warmup^2 stage!"
msgstr ""
-#: qcsrc/client/hud.qc:4957
+#: qcsrc/client/hud.qc:4104
#, c-format
msgid "%sPress ^3%s%s to end warmup"
msgstr ""
-#: qcsrc/client/hud.qc:4959
+#: qcsrc/client/hud.qc:4106
#, c-format
msgid "%sPress ^3%s%s once you are ready"
msgstr ""
-#: qcsrc/client/hud.qc:4964
+#: qcsrc/client/hud.qc:4111
msgid "^2Waiting for others to ready up to end warmup..."
msgstr ""
-#: qcsrc/client/hud.qc:4966
+#: qcsrc/client/hud.qc:4113
msgid "^2Waiting for others to ready up..."
msgstr ""
-#: qcsrc/client/hud.qc:4972
+#: qcsrc/client/hud.qc:4119
#, c-format
msgid "^2Press ^3%s^2 to end warmup"
msgstr ""
-#: qcsrc/client/hud.qc:4993
+#: qcsrc/client/hud.qc:4140
msgid "Teamnumbers are unbalanced!"
msgstr ""
-#: qcsrc/client/hud.qc:4998
+#: qcsrc/client/hud.qc:4145
#, c-format
msgid " Press ^3%s%s to adjust"
msgstr ""
-#: qcsrc/client/hud.qc:5006
+#: qcsrc/client/hud.qc:4153
msgid "^7Press ^3ESC ^7to show HUD options."
msgstr ""
-#: qcsrc/client/hud.qc:5008
+#: qcsrc/client/hud.qc:4155
msgid "^3Doubleclick ^7a panel for panel-specific options."
msgstr ""
-#: qcsrc/client/hud.qc:5010
+#: qcsrc/client/hud.qc:4157
msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
msgstr ""
-#: qcsrc/client/hud.qc:5012
+#: qcsrc/client/hud.qc:4159
msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
msgstr ""
-#: qcsrc/client/hud.qc:5037
+#: qcsrc/client/hud.qc:4197
msgid " qu/s"
msgstr ""
-#: qcsrc/client/hud.qc:5041
+#: qcsrc/client/hud.qc:4201
msgid " m/s"
msgstr ""
-#: qcsrc/client/hud.qc:5045
+#: qcsrc/client/hud.qc:4205
msgid " km/h"
msgstr ""
-#: qcsrc/client/hud.qc:5049
+#: qcsrc/client/hud.qc:4209
msgid " mph"
msgstr ""
-#: qcsrc/client/hud.qc:5053
+#: qcsrc/client/hud.qc:4213
msgid " knots"
msgstr ""
+#: qcsrc/client/hud.qc:4860
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
+msgstr ""
+
+#: qcsrc/client/waypointsprites.qc:594
+#, c-format
+msgid "%s needing help!"
+msgstr ""
+
+#: qcsrc/client/hud_config.qc:136
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr ""
+
+#: qcsrc/client/hud_config.qc:140
+#, c-format
+msgid "^1Couldn't write to %s\n"
+msgstr ""
+
#: qcsrc/client/scoreboard.qc:19
msgid "SCO^bckills"
msgstr ""
msgstr ""
#: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
msgstr ""
#: qcsrc/client/scoreboard.qc:244
msgid "N/A"
msgstr ""
-#: qcsrc/client/scoreboard.qc:951
+#: qcsrc/client/scoreboard.qc:950
#, c-format
msgid "Accuracy stats (average %d%%)"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1016
+#: qcsrc/client/scoreboard.qc:1015
#, c-format
msgid "%d%%"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1076
+#: qcsrc/client/scoreboard.qc:1075
msgid "Rankings"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1167 qcsrc/client/scoreboard.qc:1169
+#: qcsrc/client/scoreboard.qc:1170
msgid "Scoreboard"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1210
+#: qcsrc/client/scoreboard.qc:1215
#, c-format
msgid "Speed award: %d ^7(%s^7)"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1214
+#: qcsrc/client/scoreboard.qc:1219
#, c-format
msgid "All-time fastest: %d ^7(%s^7)"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1241 qcsrc/client/teamplay.qc:55
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
msgid "Spectators"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1248
+#: qcsrc/client/scoreboard.qc:1252
#, c-format
msgid "playing on ^2%s^7"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1255 qcsrc/client/scoreboard.qc:1260
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
#, c-format
msgid " for up to ^1%1.0f minutes^7"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1283
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
msgid " or"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
#, c-format
msgid " until ^3%s %s^7"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1275
-#: qcsrc/client/scoreboard.qc:1287 qcsrc/client/scoreboard.qc:1294
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
msgid "SCO^points"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1269 qcsrc/client/scoreboard.qc:1276
-#: qcsrc/client/scoreboard.qc:1288 qcsrc/client/scoreboard.qc:1295
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
msgid "SCO^is beaten"
msgstr ""
-#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
#, c-format
msgid " until a lead of ^3%s %s^7"
msgstr ""
msgid "Awaiting orders..."
msgstr ""
-#: qcsrc/client/teamplay.qc:56
+#: qcsrc/client/movetypes.qc:163
+#, c-format
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+
+#: qcsrc/client/movetypes.qc:166
+#, c-format
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:64
msgid "Red Team"
msgstr ""
-#: qcsrc/client/teamplay.qc:57
+#: qcsrc/client/teamplay.qc:65
msgid "Blue Team"
msgstr ""
-#: qcsrc/client/teamplay.qc:58
+#: qcsrc/client/teamplay.qc:66
msgid "Yellow Team"
msgstr ""
-#: qcsrc/client/teamplay.qc:59
+#: qcsrc/client/teamplay.qc:67
msgid "Pink Team"
msgstr ""
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
+#: qcsrc/common/mapinfo.qc:1092
+#, c-format
+msgid "%s: %s"
msgstr ""
#: qcsrc/server/w_fireball.qc:417
msgid "%s tasted %s's fireball"
msgstr ""
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr ""
-
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_shotgun.qc:203
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_shotgun.qc:215
+#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:293
#, c-format
-msgid "%s did the impossible"
+msgid "%s is now thinking with portals"
msgstr ""
-#: qcsrc/server/w_nex.qc:269 qcsrc/server/w_minstanex.qc:292
+#: qcsrc/server/w_nex.qc:255 qcsrc/server/w_minstanex.qc:295
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr ""
-
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr ""
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr ""
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr ""
-
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:254
+#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:258
#, c-format
msgid "%s was sniped by %s"
msgstr ""
msgid "%s was riddled full of holes by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr ""
-
#: qcsrc/server/w_minstanex.qc:2
msgid "MinstaNex"
msgstr ""
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr ""
-
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "@!#%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
+#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#, c-format
+msgid "%s did the impossible"
msgstr ""
#: qcsrc/server/w_porto.qc:298
msgid "%s felt %s doing the impossible to him"
msgstr ""
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr ""
-
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
-#: qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
-msgstr ""
-
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr ""
-
-#: qcsrc/server/w_rocketlauncher.qc:500 qcsrc/server/w_minelayer.qc:495
+#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr ""
msgid "%s has run into %s's gravity bomb"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr ""
-
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
#: qcsrc/server/w_seeker.qc:2
msgid "T.A.G. Seeker"
msgstr ""
msgid "%s was tagged by %s"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr ""
-
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
--- /dev/null
+// placeholder file, is replaced by data/campaign.cfg in user home directory
// e.g. Xonotic 1.5.1 RC1 will be 15101
set g_xonoticversion git "Xonotic version (formatted for humans)"
-gameversion 100 // 0.1.0
+gameversion 500 // 0.5.0
gameversion_min 0 // git builds see all versions
gameversion_max 65535 // git builds see all versions
// other aliases
alias +hook +button6
alias -hook -button6
+alias use "impulse 21"
alias ready "cmd ready"
alias lockteams "sv_cmd lockteams"
alias unlockteams "sv_cmd unlockteams"
seta crosshair_rifle "" "crosshair to display when wielding the rifle"
seta crosshair_rifle_color "0.85 0.5 0.25" "crosshair color to display when wielding the rifle"
seta crosshair_rifle_alpha 1 "crosshair alpha value to display when wielding the rifle"
-seta crosshair_rifle_size 0.65 "crosshair size when wielding the rifle"
+seta crosshair_rifle_size 0.5 "crosshair size when wielding the rifle"
seta crosshair_tuba "" "crosshair to display when wielding the tuba"
seta crosshair_tuba_color "0.85 0.5 0.25" "crosshair color to display when wielding the tuba"
seta crosshair_tuba_alpha 1 "crosshair alpha value to display when wielding the tuba"
v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
r_motionblur 0 // motion blur value, default is 0
-r_damageblur 0 // motion blur when damaged, default is 0
+r_damageblur 0 // motion blur when damaged, default is 0 (removed in Xonotic)
-r_bloom_blur 8
-r_bloom_brighten 3
+r_bloom_blur 16
+r_bloom_brighten 2.5
r_bloom_colorexponent 1
r_bloom_colorscale 1
-r_bloom_colorsubtract 0.25
+r_bloom_colorsubtract 0.15
r_bloom_resolution 320
r_hdr_range 4
seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy"
set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this"
-seta cl_eventchase_death 0 "camera goes into 3rd person mode when the player is dead"
+seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead"
seta cl_eventchase_distance 140 "final camera distance"
seta cl_eventchase_speed 1.3 "how fast the camera slides back, 0 is instant"
set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel"
set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
-set sv_pogostick 1 "don't require releasing the space bar for jumping again"
set sv_doublejump 0 "allow Quake 2-style double jumps"
set sv_jumpspeedcap_min "" "lower bound on the baseline velocity of a jump; final velocity will be >= (jumpheight * min + jumpheight)"
set sv_jumpspeedcap_max "" "upper bound on the baseline velocity of a jump; final velocity will be <= (jumpheight * max + jumpheight)"
// general bot AI cvars
set bot_ai_thinkinterval 0.05
set bot_ai_strategyinterval 5 "How often a new objective is chosen"
-set bot_ai_enemydetectioninterval 3 "How often bots pick a new target"
+set bot_ai_enemydetectioninterval 2 "How often bots pick a new target"
set bot_ai_enemydetectionradius 10000 "How far bots can see enemies"
set bot_ai_dodgeupdateinterval 0.2 "How often scan for items to dodge. Currently not in use."
set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the situation will be chosen"
set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming"
set bot_ai_custom_weapon_priority_distances "300 850" "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
set bot_ai_custom_weapon_priority_far "minstanex nex rifle electro rocketlauncher grenadelauncher hagar hlac crylink laser uzi fireball seeker shotgun tuba minelayer" "Desired weapons for far distances ordered by priority"
-set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi rifle crylink hlac hagar shotgun laser tuba minelayer" "Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro rifle rocketlauncher laser fireball minelayer" "Desired weapons for close distances ordered by priority"
+set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi crylink hlac hagar shotgun laser rifle tuba minelayer" "Desired weapons for middle distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro rocketlauncher laser fireball rifle minelayer" "Desired weapons for close distances ordered by priority"
set bot_ai_weapon_combo 1 "Enable bots to do weapon combos"
set bot_ai_weapon_combo_threshold 0.4 "Try to make a combo N seconds after the last attack"
set bot_ai_friends_aware_pickup_radius "500" "Bots will not pickup items if a team mate is this distance near the item"
set bot_ai_ignoregoal_timeout 3 "Ignore goals making bots to get stuck in front of a wall for N seconds"
set bot_ai_bunnyhop_skilloffset 7 "Bots with skill equal or greater than this value will perform the \"bunnyhop\" technique"
-set bot_ai_bunnyhop_startdistance 100 "Run to goals located further than this distance"
-set bot_ai_bunnyhop_stopdistance 125 "Stop jumping after reaching this distance to the goal"
+set bot_ai_bunnyhop_startdistance 200 "Run to goals located further than this distance"
+set bot_ai_bunnyhop_stopdistance 200 "Stop jumping after reaching this distance to the goal"
set bot_ai_bunnyhop_firstjumpdelay 0.2 "Start running to the goal only if it was seen for more than N seconds"
set bot_god 0 "god mode for bots"
set bot_ai_navigation_jetpack 0 "Enable bots to navigate maps using the jetpack"
set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
set g_antilag_nudge 0 "don't touch"
set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
-set g_shootfromclient 1 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed, and defaulted to, too; see also cl_gunalign"
+set g_shootfromclient 2 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed; see also cl_gunalign"
set g_shootfromeye 0 "shots are fired from your eye/crosshair; visual gun position can still be influenced by cl_gunalign 1 and 2"
set g_shootfromcenter 0 "weapon gets moved to the center, shots still come from the barrel of your weapon; visual gun position can still be influenced by cl_gunalign 1 and 2"
set g_shootfromfixedorigin "" "if set to a string like 0 y z, the gun is moved to the given y and z coordinates. If set to a string like x y z, the whole shot origin is used"
set g_ctf_fullbrightflags 0
set g_ctf_dynamiclights 0
set g_ctf_allow_drop 1 "dropping allows circumventing carrierkill score, so enable this with care!"
-set g_ctf_reverse 0 "when 1, bases/flags are switched :P you have to capture your OWN flag by bringing it to the ENEMY's"
+set g_ctf_reverse 0 "if enabled, flags positions are switched: you have to capture the enemy's flag from your own base by bringing it to your own flag in the enemy base"
set g_balance_ctf_delay_collect 1.0
set g_balance_ctf_damageforcescale 1
-set g_ctf_shield_max_ratio 0 "shield at most 0% of a team from the enemy flag (try: 0.4 for 40%)"
-set g_ctf_shield_min_negscore 20 "shield the player from the flag if he's got -20 points or less"
+set g_ctf_shield_max_ratio 0 "shield at most this percentage of a team from the enemy flag (try: 0.4 for 40%)"
+set g_ctf_shield_min_negscore 20 "shield the player from the flag if he's got this negative amount of points or less"
set g_ctf_shield_force 100 "push force of the shield"
// fun for server admins
set g_ca 0 "Clan Arena: Played in rounds, once you're dead you're out! The team with survivors wins the round."
set g_ca_point_limit 10 "point limit 10 is standard for clan arena"
set g_ca_point_leadlimit 0
+set g_ca_spectate_enemies 0 "Allow spectating enemy player by dead player during clan arena games."
set g_ca_warmup 10 "how long the players will have time to run around the map before the round starts"
// onslaught
set g_multijump_speed -999999 "Minimum vertical speed a player must have in order to jump again"
// effects
+r_glsl_vertextextureblend_usebothalphas 1 // allows to abuse texture blending as detail texture
+r_glsl_postprocess 1
r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
r_picmipworld 1
gl_picmip_world 0
seta r_ambient 4
cl_decals_fadetime 5
cl_decals_time 2
-seta cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left"
+seta cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only"
seta cl_nogibs 0 "reduce number of violence effects, or remove them totally"
seta cl_particlegibs 0 "simpler gibs"
seta cl_gibs_damageforcescale 3.5 "force to push around gibs"
bind SPACE +jump
// weapons
-bind 1 "impulse 1"
-bind 2 "impulse 2"
-bind 3 "impulse 3"
-bind 4 "impulse 4"
-bind 5 "impulse 5"
-bind 6 "impulse 6"
-bind 7 "impulse 7"
-bind 8 "impulse 8"
-bind 9 "impulse 9"
-bind 0 "impulse 14" // cycles the superweapons
+alias weapon_group_1 "impulse 1"
+alias weapon_group_2 "impulse 2"
+alias weapon_group_3 "impulse 3"
+alias weapon_group_4 "impulse 4"
+alias weapon_group_5 "impulse 5"
+alias weapon_group_6 "impulse 6"
+alias weapon_group_7 "impulse 7"
+alias weapon_group_8 "impulse 8"
+alias weapon_group_9 "impulse 9"
+alias weapon_group_0 "impulse 14" // cycles the superweapons
+bind 0 weapon_group_0
+bind 1 weapon_group_1
+bind 2 weapon_group_2
+bind 3 weapon_group_3
+bind 4 weapon_group_4
+bind 5 weapon_group_5
+bind 6 weapon_group_6
+bind 7 weapon_group_7
+bind 8 weapon_group_8
+bind 9 weapon_group_9
bind q weaplast
bind MOUSE1 +fire
bind MOUSE2 +fire2
-bind MOUSE3 +zoom
+bind MOUSE3 togglezoom
bind MOUSE4 weaplast
bind MOUSE5 +hook
bind MWHEELUP weapnext
bind r reload
bind BACKSPACE dropweapon
bind g dropweapon
+// TODO change this to "use" once we can
bind f +use
// misc
set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
seta g_campaign_name "xonoticbeta"
set g_campaign_skill 0
-set g_campaignxonotic20_index 0
-set g_campaignxonotic25_index 1
+alias warp "sv_cmd warp $*"
alias singleplayer_start "g_campaign_index 0; set scmenu_campaign_goto 0"
alias singleplayer_continue "set scmenu_campaign_goto -1"
set sv_motd ""
-set g_waypoints_for_items 1 "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
+set g_waypoints_for_items 0 "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
seta g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match"
seta g_maplist_votable_keeptwotime 15
set g_nick_flood_penalty_yellow 3 "number of changes to allow before warning and movement blocking"
set g_nick_flood_penalty_red 30 "number of changes to allow before totally disorienting the player"
+seta g_waypointsprite_uppercase 1
set g_waypointsprite_normdistance 512
set g_waypointsprite_minscale 0.5
set g_waypointsprite_minalpha 0.4
set g_waypointsprite_limitedrange 5120
set g_waypointsprite_stuffbinds 0
seta g_waypointsprite_scale 1
+seta g_waypointsprite_fontsize 12
seta g_waypointsprite_alpha 1 "This allows the client to control transparency of the waypoint"
seta g_waypointsprite_edgefadealpha 0.5 "alpha multiplier near the edge"
seta g_waypointsprite_edgefadescale 1 "scale multiplier near the edge"
seta g_waypointsprite_edgefadedistance 50 "distance in virtual pixels from edge where to start fading"
+seta g_waypointsprite_edgeoffset_bottom 0 "offset of how close the waypoint can be to the bottom edge of the screen"
+seta g_waypointsprite_edgeoffset_left 0 "offset of how close the waypoint can be to the left edge of the screen"
+seta g_waypointsprite_edgeoffset_right 0 "offset of how close the waypoint can be to the right edge of the screen"
+seta g_waypointsprite_edgeoffset_top 0 "offset of how close the waypoint can be to the top edge of the screen"
seta g_waypointsprite_crosshairfadealpha 0.25 "alpha multiplier near crosshair"
seta g_waypointsprite_crosshairfadescale 1 "scale multiplier near the crosshair"
seta g_waypointsprite_crosshairfadedistance 150 "distance in virtual pixels from crosshair where to start fading"
seta g_waypointsprite_distancefadealpha 1 "alpha multiplier near distance"
seta g_waypointsprite_distancefadescale 0.7 "scale multiplier near the distance"
seta g_waypointsprite_distancefadedistancemultiplier 0.5 "distance in map sizes from distance where to stop fading"
+set g_waypointsprite_spam 0 "Debugging feature. Set to 10 and load courtfun in race mode to test."
alias "g_waypointsprite_personal" "impulse 30"
alias "g_waypointsprite_personal_p" "impulse 31"
alias "g_waypointsprite_personal_d" "impulse 32"
alias "g_waypointsprite_team_danger_d" "impulse 39"
alias "g_waypointsprite_clear_personal" "impulse 47"
alias "g_waypointsprite_clear" "impulse 48"
-alias "g_waypointsprite_toggle" "impulse 49"
+alias "g_waypointsprite_toggle" "toggle cl_hidewaypoints"
// key for that?
seta cl_hidewaypoints 0 "disable static waypoints, only show team waypoints"
set g_balance_keyhunt_delay_tracking 10
set g_balance_keyhunt_delay_fadeout 2
set g_balance_keyhunt_delay_collect 1.5
-set g_balance_keyhunt_delay_drop 0.4
set g_balance_keyhunt_maxdist 150
set g_balance_keyhunt_score_collect 3
set g_balance_keyhunt_score_carrierfrag 2
seta "userbind12_press" "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p"; seta "userbind12_release" ""; seta "userbind12_description" "team: killed flag, icon"
seta "userbind13_press" "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"; seta "userbind13_release" ""; seta "userbind13_description" "team: dropped flag, icon"
seta "userbind14_press" "say_team dropped gun %w^7 (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
+// TODO change this to "use" once we can
seta "userbind15_press" "say_team dropped flag/key %w^7 (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
seta "userbind16_press" "say :-) / nice one"; seta "userbind16_release" ""; seta "userbind16_description" "chat: nice one"
seta "userbind17_press" "say good game"; seta "userbind17_release" ""; seta "userbind17_description" "chat: good game"
seta hud_panel_weapons_ammo_full_cells 80 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_rockets 80 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this ammo count"
+seta hud_panel_weapons_onlyowned 1 "show only owned weapons"
seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
seta hud_damage 0.55 "an improved version of gl_polyblend for damage, draw an image instead when hurt"
+seta hud_damage_blur 10 "Use postprocessing to blur the screen when you have taken damage. This can be paired with current hud damage or just used alone. Higher values = more blur"
+seta hud_damage_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
seta hud_damage_gentle_alpha_multiplier 0.10 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
seta hud_damage_color "1 0 0" "color of flash"
seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
+seta hud_powerup 0 "power of the sharpen effect when owning the shield or strength powerups, default is 0.5"
+
+seta hud_postprocessing 1 "enables the ability for effects such as hud_damage_blur and hud_contents to apply a postprocessing method upon the screen - enabling this disables manual editing of the postprocess cvars"
+seta hud_postprocessing_maxbluralpha 0 "maximum alpha which the blur postprocess can be, default is 0.5"
+seta hud_postprocessing_maxblurradius 8 "maximum radius which the blur postprocess can be, default is 8"
+
seta hud_contents 1 "an improved version of gl_polyblend for liquids such as water/lava/slime, draw a filler when inside the liquid"
+seta hud_contents_blur 10 "Use postprocessing to blur the screen when you are inside a liquid. Higher values = more blur"
+seta hud_contents_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
seta hud_contents_factor 1 "factor at which to multiply the current faded value."
seta hud_contents_fadeintime 0.02 "factor of time it takes for the alpha level to reach normal value when entering the liquid"
seta hud_contents_fadeouttime 0.1 "factor of time it takes for the alpha level to reach normal value when leaving the liquid"
seta hud_shownames 1 "draw names and health/armor of nearby players"
seta hud_shownames_enemies 2 "1 = draw names of enemies you point at (TODO), 2 = draw names of all enemies in view"
+seta hud_shownames_self 0 "also include your own name to be shown when third person camera mode is on (chase_active/cl_eventchase)"
seta hud_shownames_status 1 "1 = draw health/armor status of teammates"
seta hud_shownames_statusbar_height 4 "height of status bar"
seta hud_shownames_aspect 8 "aspect ratio of total drawing area per name"
seta cl_port $cl_port
seta r_showsurfaces $r_showsurfaces
seta r_ambient $r_ambient
-seta skill $skill
+seta skill 4
seta gl_finish $gl_finish
seta v_kicktime $v_kicktime
seta r_subdivisions_tolerance $r_subdivisions_tolerance
// ticrate
-sys_ticrate 0.0166667
-cl_netfps 60 // should match
+//sys_ticrate 0.0166667
+sys_ticrate 0.0333333
+cl_netfps 60 // should match or be a multiple
sv_gameplayfix_delayprojectiles 0
sv_gameplayfix_q2airaccelerate 1
sv_gameplayfix_stepmultipletimes 1
// hud: font size
seta hud_fontsize 11
-seta scr_centersize 12
seta hud_width 560
// these entities are not referenced by anything directly, they just represent
set sv_clones 0 "number of clones a player may make (reset by the \"kill\" command)"
-set cl_handicap 1 "the higher, the more damage you will receive (client setting)"
+set cl_handicap 1 "the higher, the more damage you will receive (client setting) NOTE: reconnect or use sendcvar command to update the choice."
+
+seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice."
// must be at the bottom of this file:
// alias for switching the teamselect menu
seta cl_vehicle_spiderbot_cross_size 1
//cl_gunalign calculator
-seta menu_cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left"
+seta menu_cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only"
alias _gunalign_01 "cl_gunalign 1"
alias _gunalign_02 "cl_gunalign 2"
alias _gunalign_03 "cl_gunalign 3"
set g_triggerimpulse_accel_multiplier 1 "trigger_impulse accelerator multiplier (applied AFTER the power)"
set g_triggerimpulse_directional_multiplier 1 "trigger_impulse directional field multiplier"
set g_triggerimpulse_radial_multiplier 1 "trigger_impulse radial field multiplier"
+set the_goggles "they do nothing" "but the googles, they do"
seta g_ghost_items 1 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
seta g_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
set developer_shtest 0 "experimental speedhack detection"
set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code"
set g_debug_bot_commands 0 "print scripted bot commands before executing"
+set g_debug_defaultsounds 0 "always use default sounds"
// debug cvars for keyhunt attaching
set _angles "0 0 0"
set _campaign_index ""
set _campaign_name ""
+// debug
+set _independent_players 0 "DO NOT TOUCH"
+
// define some engine cvars that we need even on dedicated server
set r_showbboxes 0
scr_infobar_height 12
// DP cannot properly detect this, so rather turn off the detection
-r_texture_dds_load_dxt1_noalpha 1
-r_texture_dds_load_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
+r_texture_dds_load_alphamode 2
+r_texture_dds_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
r_texture_dds_load_logfailure 0 // this engine feature SUCKS
set vid_netwmfullscreen 0 // doesn't support non-native res
r_cullentities_trace 0
// less "lagging" of other players, but also less PL tolerant... let's try this
-sv_clmovement_inputtimeout 0.05
+sv_clmovement_inputtimeout 0.07 // more than 2, less than 3 server frames
// exact gloss looks better, e.g. on g-23
r_shadow_glossexact 1
+r_shadow_glossintensity 1
// use fake light if map has no lightmaps
r_fakelight 1
// create this cvar in case the engine did not
set snd_soundradius 1200
+// declare the channels we use
+seta snd_channel8volume 1 "QuakeC controlled background music volume"
+seta snd_channel9volume 1 "QuakeC controlled ambient sound volume"
+
// loading screen
scr_loadingscreen_background 0
scr_loadingscreen_barcolor "0 0.5 1"
scr_loadingscreen_barheight 12
-scr_loadingscreen_count 12
+scr_loadingscreen_count 13
scr_loadingscreen_scale 999
scr_loadingscreen_scale_base 1
scr_loadingscreen_scale_limit 2
exec effects-normal.cfg
exec physicsX.cfg
exec turrets.cfg
+exec vehicles.cfg
// hud cvar descriptions
exec _hud_descriptions.cfg
originjitter 1 1 1
velocityjitter 100 100 100
velocitymultiplier -0.31
+
+// --------------- vehicles
+
+effect spiderbot_minigun_trail
+notunderwater
+trailspacing 10
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 1 2
+alpha 20 50 100
+sizeincrease 2
+velocityjitter 5 5 5
+gravity -0.03
+airfriction 1
+
+effect spiderbot_minigun_muzzleflash
+count 3
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 10 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 150 150 150
+velocitymultiplier 0.35
+sizeincrease -100
+stretchfactor 1.3
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_muzzleflash
+count 6
+type spark
+color 0xff9c00 0xff8400
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.8
+effect spiderbot_minigun_muzzleflash
+countabsolute 2
+type static
+tex 48 55
+color 0xff9c00 0xff8400
+size 32 32
+alpha 256 512 6680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 120
+lightradiusfade 8000
+lightcolor 3 3 0
+
+effect spiderbot_minigun_impact
+countabsolute 1
+type static
+tex 65 65
+color 0xff9c00 0xf6ff00
+size 52 52
+alpha 50 100 1680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 9 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 3
+airfriction 6
+rotate -180 180 4000 -4000
+// smoke
+effect spiderbot_minigun_impact
+count 6
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 10 20
+alpha 50 50 190
+sizeincrease 80
+velocityjitter 100 100 250
+velocitymultiplier 0.49
+gravity 1.3
+airfriction 10
+rotate -180 180 0 0
+// smoke 2
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 15 19
+alpha 25 51 128
+airfriction 6
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 7.6
+// derbis
+effect spiderbot_minigun_impact
+notunderwater
+count 3
+type alphastatic
+tex 66 68
+color 0x99977D 0xFFFFFF
+size 6 8
+alpha 644 756 1484
+gravity 1.1
+airfriction 0.4
+sizeincrease -10
+velocitymultiplier 0.15
+originjitter 16 16 16
+velocityjitter 124 124 224
+rotate -180 180 -1000 1000
+// decal
+effect spiderbot_minigun_impact
+countabsolute 1
+type decal
+tex 56 59
+size 20 25
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect spiderbot_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 33 33
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect spiderbot_rocket_explode
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 12 21
+sizeincrease 495
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+originjitter 100 100 100
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire effect 2
+effect spiderbot_rocket_explode
+notunderwater
+count 16
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 3 3
+sizeincrease 120
+alpha 200 256 912
+airfriction -2
+liquidfriction 8
+velocityjitter 412 412 412
+rotate -180 180 -150 150
+stretchfactor 10
+// fire rays
+effect spiderbot_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 712 712 712
+stretchfactor 10
+// smoke
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 10 15
+sizeincrease 280
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke2
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 100 150
+sizeincrease 30
+alpha 300 650 556
+originjitter 10 10 10
+velocityjitter 200 200 200
+airfriction 2
+gravity -0.5
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// underwater bubbles
+effect spiderbot_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect spiderbot_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+
+effect spiderbot_rocket_thrust
+notunderwater
+count 3
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 5 10
+sizeincrease -40
+alpha 200 256 1600
+velocityjitter 20 20 20
+velocitymultiplier -1.4
+stretchfactor 0.9
+effect spiderbot_rocket_thrust
+notunderwater
+count 4
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 25 25
+sizeincrease -3000
+alpha 200 200 9000
+velocityjitter 60 60 60
+velocitymultiplier -1.4
+stretchfactor 1
+rotate -180 180 -500 500
+
+
+
+// long lasting smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 60 60 60
+velocitymultiplier -0.1
+airfriction 0.3
+gravity -0.01
+// fast smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+gravity -0.3
+velocityjitter 160 160 60
+airfriction 0.3
+// fire
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 30 30
+sizeincrease 40
+velocitymultiplier 0.5
+alpha 200 256 1960
+velocityjitter 60 60 60
+airfriction 0.3
+stretchfactor 3
+airfriction 0.3
+//sparks
+effect spiderbot_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 160 160 160
+velocitymultiplier -0.5
+
+effect wakizashi_gun_impact
+count 15
+type spark
+color 0xff0000 0xc03535
+tex 41 41
+size 4 7
+alpha 256 512 1180
+airfriction 4
+gravity 3
+originjitter 40 40 10
+velocityjitter 350 350 550
+velocityoffset 0 0 700
+stretchfactor 0.9
+effect wakizashi_gun_impact
+type smoke
+count 24
+color 0xd0d0a0 0xc03535
+tex 0 8
+size 10 20
+alpha 50 90 150
+sizeincrease 80
+velocityjitter 250 250 450
+velocityoffset 0 0 600
+originjitter 40 40 10
+airfriction 4
+sizeincrease 80
+rotate -180 180 0 0
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 65 65
+color 0xff0000 0xc03535
+size 82 82
+alpha 250 300 680
+sizeincrease -180
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 33 33
+color 0xff0000 0xc03535
+size 40 40
+alpha 50 100 620
+sizeincrease 900
+rotate -180 180 400 -400
+effect wakizashi_gun_impact
+countabsolute 1
+type decal
+tex 59 59
+size 14 14
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect wakizashi_gun_muzzleflash
+count 16
+type spark
+color 0xff0000 0xc03535
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.7
+
+effect wakizashi_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 33 33
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect wakizashi_rocket_explode
+notunderwater
+count 64
+type static
+tex 48 55
+color 0xFFAE00 0xff5a00
+size 12 21
+sizeincrease 195
+alpha 200 256 512
+airfriction 2
+liquidfriction 8
+originjitter 10 10 10
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire rays
+effect wakizashi_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0xFFEA00 0xff5a00
+size 43 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect wakizashi_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 10 15
+sizeincrease 230
+alpha 300 450 556
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// bouncing sparks
+effect wakizashi_rocket_explode
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 884
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 170
+originjitter 60 60 60
+velocityjitter 524 524 524
+// underwater bubbles
+effect wakizashi_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect wakizashi_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 3
+type spark
+tex 48 55
+color 0x00FFDD 0x6200FF
+size 14 19
+sizeincrease -2
+alpha 200 256 1600
+velocityjitter 60 60 60
+velocitymultiplier -1.1
+stretchfactor 1
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 2
+type spark
+tex 48 55
+color 0xFFFF33 0xFFEE00
+size 5 10
+sizeincrease -2
+alpha 200 256 1900
+velocityjitter 60 60 60
+velocitymultiplier -0.3
+stretchfactor 3
+
+// long lasting smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 3 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 160 160 60
+velocitymultiplier -0.1
+airfriction 0.3
+// fast smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+velocityjitter 160 160 60
+velocitymultiplier 0.4
+airfriction 0.3
+//sparks
+effect wakizashi_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 60 60 60
+velocitymultiplier -1.5
+
+effect wakizashi_booster_smoke
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease 10
+gravity -0.1
+alpha 200 750 200
+velocityjitter 40 40 40
+originjitter 60 60 60
+airfriction 2
+color 0xA69A80 0xB3B39F
+rotate -180 180 -20 20
+
+// decal
+effect raptor_cannon_impact
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+//spark
+effect raptor_cannon_impact
+notunderwater
+count 6
+type spark
+tex 40 40
+color 0xD400FF 0x571863
+size 1 1
+alpha 644 956 784
+gravity 1
+airfriction 0.2
+velocityoffset 0 0 150
+originjitter 16 16 16
+velocityjitter 124 124 524
+// smoke
+effect raptor_cannon_impact
+count 4
+type alphastatic
+tex 0 7
+size 50 50
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 340
+gravity 0.7
+airfriction 2
+// fire
+effect raptor_cannon_impact
+notunderwater
+count 10
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 33 44
+sizeincrease 25
+alpha 200 256 812
+bounce 1.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 312 312 312
+
+
+effect raptor_cannon_muzzleflash
+count 16
+type spark
+color 0xD400FF 0x571863
+tex 8 15
+size 10 17
+alpha 1256 1512 56280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.6
+effect raptor_cannon_muzzleflash
+countabsolute 1
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 32 32
+alpha 6056 20112 406280
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 150
+lightradiusfade 6000
+lightcolor 3 0 6
+
+// decal
+effect raptor_bomb_impact
+countabsolute 1
+type decal
+tex 8 16
+size 84 84
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+//spark vertical
+effect raptor_bomb_impact
+count 3
+type spark
+color 0xff9c00 0xff3c00
+tex 48 55
+size 20 40
+alpha 300 300 600
+originjitter 10 10 10
+velocityjitter 40 40 120
+stretchfactor 210
+sizeincrease 50
+
+//fire
+effect raptor_bomb_impact
+count 4
+type static
+color 0xff9c00 0xff3c00
+tex 48 55
+size 30 120
+alpha 300 300 500
+originjitter 10 10 10
+velocityjitter 950 950 0
+sizeincrease 230
+airfriction 2
+
+//smoke
+effect raptor_bomb_impact
+count 4
+type spark
+blend alpha
+tex 0 7
+size 120 180
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 280
+velocityoffset 0 0 280
+originjitter 30 30 10
+stretchfactor 10
+
+//smoke 2
+effect raptor_bomb_impact
+count 4
+//type alphastatic
+type spark
+blend alpha
+tex 0 7
+size 40 100
+color 0x646364 0x151515
+alpha 328 328 350
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 580
+originjitter 30 30 10
+sizeincrease 60
+airfriction 0.6
+gravity 2
+
+// sparks
+effect raptor_bomb_impact
+notunderwater
+count 5
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 5
+alpha 644 956 984
+gravity 1
+airfriction 0.3
+velocityoffset 0 0 350
+originjitter 16 16 16
+velocityjitter 174 174 924
+stretchfactor 2
+
+effect raptor_bomb_spread
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+originjitter 110 110 110
+velocityjitter 324 324 324
+
+
+// generic explosion size:big (biggest explosion ever)
+effect explosion_big
+countabsolute 1
+type decal
+tex 8 16
+size 172 172
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 600
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect explosion_big
+countabsolute 1
+type static
+tex 33 33
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 4400
+// fire effect
+effect explosion_big
+notunderwater
+count 64
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 80 80 80
+velocityjitter 2512 2512 2512
+// fire rays
+effect explosion_big
+notunderwater
+count 64
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 800
+airfriction -5
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect explosion_big
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 50 100
+sizeincrease 244
+alpha 300 650 456
+velocityjitter 3444 3444 3444
+airfriction 8
+color 0x4F4B46 0x000000
+// bouncing sparks
+effect explosion_big
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 4
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 160 160 160
+velocityjitter 924 924 924
+stretchfactor 0.7
+// derbis
+effect explosion_big
+notunderwater
+count 16
+type alphastatic
+tex 66 68
+color 0xFFFFFF 0xcac5b4
+size 10 16
+alpha 444 1356 1184
+gravity 2.3
+airfriction 0.5
+velocityjitter 1800 1800 1800
+velocityoffset 0 0 970
+sizeincrease -5
+rotate -180 180 -1000 1000
+// underwater bubbles
+effect explosion_big
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_big
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+
+// generic explosion size:medium (it leaves rising smoke for a longer time)
+// shockwave
+effect explosion_medium
+countabsolute 1
+type static
+tex 33 33
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+gravity -2
+alpha 200 256 612
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -150 150
+// fire rays
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 43 74
+sizeincrease 40
+alpha 200 256 800
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// smoke
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 5
+size 250 300
+sizeincrease -30
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke 2
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 50 100
+sizeincrease 50
+gravity -0.3
+alpha 300 650 256
+originjitter 100 100 100
+velocityjitter 500 500 500
+velocityoffset 0 0 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke rays
+effect explosion_medium
+type spark
+notunderwater
+tex 0 8
+count 13
+size 150 200
+sizeincrease 100
+alpha 140 255 350
+velocityjitter 250 250 250
+originjitter 40 40 40
+color 0x4F4B46 0x000000
+stretchfactor 50
+// bouncing sparks
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 2 3
+alpha 644 956 984
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 100 100 100
+velocityjitter 624 624 624
+stretchfactor 0.7
+// underwater bubbles
+effect explosion_medium
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_medium
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+// generic explosion size:small (its fire only, made to support other explosions)
+// shockwave
+effect explosion_small
+countabsolute 1
+type static
+tex 33 33
+size 22 22
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 1 44
+sizeincrease 45
+alpha 200 256 1212
+airfriction 5
+liquidfriction 8
+velocityjitter 512 512 512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+velocityjitter 912 912 912
+rotate -180 180 -150 150
+// fire rays
+effect explosion_small
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 30
+alpha 200 256 1300
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// underwater bubbles
+effect explosion_small
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect explosion_small
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+// big smoke ( for spamming on damaged stuff )
+effect smoke_big
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 30 60
+sizeincrease 15
+gravity -0.5
+alpha 200 750 200
+originjitter 55 55 55
+velocityjitter 140 140 200
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+
+// small smoke ( more precise than big one, for spamming on damaged parts like raptors spinner )
+effect smoke_small
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease -10
+gravity -0.5
+alpha 200 750 200
+velocityjitter 40 40 400
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
cl_decals 1
+cl_decals_models 0
cl_decals_time 4
cl_particles_quality 1
gl_flashblend 0
r_bloom 1
r_coronas 1
r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0
r_depthfirst 2
r_drawdecals_drawdistance 500
r_drawparticles_drawdistance 2000
cl_decals 1
+cl_decals_models 0
cl_decals_time 2
cl_particles_quality 0.4
gl_flashblend 1
r_bloom 0
r_coronas 1
r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
r_depthfirst 0
r_drawdecals_drawdistance 200
r_drawparticles_drawdistance 500
cl_decals 1
+cl_decals_models 0
cl_decals_time 2
cl_particles_quality 1
gl_flashblend 0
r_bloom 0
r_coronas 1
r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
r_depthfirst 0
r_drawdecals_drawdistance 300
r_drawparticles_drawdistance 1000
cl_decals 1
+cl_decals_models 0
cl_decals_time 2
cl_particles_quality 1
gl_flashblend 0
r_bloom 0
r_coronas 1
r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
r_depthfirst 1
r_drawdecals_drawdistance 300
r_drawparticles_drawdistance 1000
cl_decals 0
+cl_decals_models 0
cl_decals_time 2
cl_particles_quality 0.4
gl_flashblend 1
r_bloom 0
r_coronas 1
r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
r_depthfirst 0
r_drawdecals_drawdistance 100
r_drawparticles_drawdistance 250
cl_decals 1
+cl_decals_models 1
cl_decals_time 10
cl_particles_quality 1
gl_flashblend 0
r_bloom 1
r_coronas 1
r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
r_depthfirst 2
r_drawdecals_drawdistance 500
r_drawparticles_drawdistance 2000
cl_decals 1
+cl_decals_models 1
cl_decals_time 10
cl_particles_quality 1
gl_flashblend 0
r_bloom 1
r_coronas 1
r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
r_depthfirst 2
r_drawdecals_drawdistance 500
r_drawparticles_drawdistance 2000
--- /dev/null
+use strict;
+use warnings;
+use Locale::PO;
+
+sub quote($)
+{
+ my $s = shift;
+ $s = '"' . quotemeta($s) . '"';
+ return $s;
+}
+sub unquote($)
+{
+ my $s = shift;
+ $s =~ s/^"//;
+ $s =~ s/"$//;
+ $s =~ s/\\(.)/$1/g;
+ return $s;
+}
+my $po = Locale::PO->load_file_ashash("menu.dat." . $ENV{L} . ".po");
+while(<>)
+{
+ /\\(.*?)\\(.*)/s or do { print; next; };
+ my @s = split /\//, $1;
+ @s = map { $po->{quote($_)} ? unquote($po->{quote($_)}->msgstr()) : $_ } @s;
+ my $s = join "/", @s;
+ $_ = "\\$s\\$2";
+ print "$_";
+}
+++ /dev/null
-title Default // "WickedX"
-author sev
-
-// Colors: 'Red Green Blue'
-// Suffixes: Clicked (_c), Disabled (_d), Focused (_f), Normal (_n)
-
-// Background layer scaling:
-// Crop (c), Letterbox (l), Height (h), Width (w), Stretch (s)
-// Background layer positioning:
-// Top Left (7), Top Center (8) Top Right (9)
-// Middle Left (4), Middle Center (5) Middle Right (6)
-// Bottom Left (1), Bottom Center (2) Bottom Right (3)
-// ALIGN_BACKGROUND(_INGAME) spspsp, s=Scale p=Position
-
-//------------------------------------------------------------------------------
-// Structure (e.g. positions, sizes, margins)
-//------------------------------------------------------------------------------
-// item: color picker
-// uses "colorpicker" images
-MARGIN_COLORPICKER '0 0 0'
-
-// item: dialog
-// uses "border" images
-// uses "closebutton" images
-MARGIN_TOP 8
-MARGIN_BOTTOM 8
-MARGIN_LEFT 8
-MARGIN_RIGHT 8
-MARGIN_COLUMNS 4
-MARGIN_ROWS 4
-HEIGHT_DIALOGBORDER 1
-
-// font sizes (used for everything)
-FONTSIZE_NORMAL 12
-HEIGHT_NORMAL 1.5
-FONTSIZE_TITLE 16
-HEIGHT_TITLE 1.5
-HEIGHT_ZOOMEDTITLE -1
-
-// general
-// uses "background" images
-// uses "background_ingame" images
-ALIGN_BACKGROUND h5h5
-ALIGN_BACKGROUND_INGAME h5
-ALPHA_BACKGROUND_INGAME 1
-ALPHA_DISABLED 0.2
-ALPHA_BEHIND 0.5
-ALPHA_TEXT 0.7
-
-// mouse
-// uses "cursor" images
-SIZE_CURSOR '32 32 0'
-OFFSET_CURSOR '0 0 0'
-ALPHA_CURSOR_INTRO 0
-
-// nexposee positions of windows (they are the scale transformation
-// centers, NOT the actual positions of the windows!)
-POSITION_DIALOG_MULTIPLAYER '0.8 0.4 0'
-POSITION_DIALOG_SINGLEPLAYER '0.2 0.4 0'
-POSITION_DIALOG_SETTINGS '0.5 0.95 0'
-POSITION_DIALOG_CREDITS '-0.05 1.2 0'
-POSITION_DIALOG_QUIT '1.05 1.2 0'
-
-// tooltips
-// uses "tooltip" images
-MARGIN_TOOLTIP '8 8 0'
-BORDER_TOOLTIP '16 16 0'
-FONTSIZE_TOOLTIP 12
-ALPHA_TOOLTIP 0.7
-WIDTH_TOOLTIP 0.3
-AVOID_TOOLTIP '8 8 0'
-
-//------------------------------------------------------------------------------
-// Colors (e.g. font colors, field colors)
-//------------------------------------------------------------------------------
-// item: campaign
-ALPHA_CAMPAIGN_SELECTABLE 0.8
-COLOR_CAMPAIGN_SELECTABLE '1 1 1'
-ALPHA_CAMPAIGN_CURRENT 1
-COLOR_CAMPAIGN_CURRENT '1 1 1'
-ALPHA_CAMPAIGN_FUTURE 0.2
-COLOR_CAMPAIGN_FUTURE '1 1 1'
-ALPHA_CAMPAIGN_DESCRIPTION 0.7
-
-// item: credits list
-COLOR_CREDITS_TITLE '0.875 0.375 0'
-ALPHA_CREDITS_TITLE 1
-COLOR_CREDITS_FUNCTION '0 0.1875 0.4375'
-ALPHA_CREDITS_FUNCTION 0.5
-COLOR_CREDITS_PERSON '0 0.375 0.75'
-ALPHA_CREDITS_PERSON 0.875
-ROWS_CREDITS 20
-WIDTH_CREDITS 0.5
-
-// item: cvar list
-ALPHA_CVARLIST_SAVED 1
-ALPHA_CVARLIST_TEMPORARY 0.7
-COLOR_CVARLIST_CHANGED '0 0.375 0.75'
-COLOR_CVARLIST_REVERTBUTTON '1 0 0'
-COLOR_CVARLIST_UNCHANGED '1 1 1'
-
-// item: list box
-COLOR_LISTBOX_SELECTED '0.875 0.375 0'
-ALPHA_LISTBOX_SELECTED 1
-COLOR_LISTBOX_WAITING '1 1 1'
-ALPHA_LISTBOX_WAITING 0.5
-
-// item: map list
-COLOR_MAPLIST_TITLE '1 1 1'
-COLOR_MAPLIST_AUTHOR '0 0.375 0.75'
-COLOR_MAPLIST_INCLUDEDBG '0 0.1875 0.4375'
-ALPHA_MAPLIST_INCLUDEDFG 1
-ALPHA_MAPLIST_INCLUDEDBG 0.375
-ALPHA_MAPLIST_NOTINCLUDEDFG 0.25
-
-// item: nexposee
-ALPHAS_MAINMENU '0.8 0.9 1'
-
-// item: player model
-COLOR_MODELTITLE '1 1 1'
-ALPHA_MODELTITLE 1
-
-// item: server info
-COLOR_SERVERINFO_NAME '1 1 1'
-COLOR_SERVERINFO_IP '0.875 0.375 0'
-
-// 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_HIGHPING '1 0 0'
-ALPHA_SERVERLIST_HIGHPING 0.4
-ALPHA_SERVERLIST_FAVORITE 0.8
-COLOR_SERVERLIST_FAVORITE '1 1 1'
-
-// item: skin list
-COLOR_SKINLIST_TITLE '1 1 1'
-COLOR_SKINLIST_AUTHOR '0 0.375 0.75'
-
-//------------------------------------------------------------------------------
-// Images (colors multiplied to images)
-//------------------------------------------------------------------------------
-// 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'
-COLOR_BUTTON_D '1 1 1'
-
-// item: checkbox
-// uses "checkbox" images
-COLOR_CHECKBOX_N '1 1 1'
-COLOR_CHECKBOX_C '0.5 0.75 1'
-COLOR_CHECKBOX_F '0.5 0.75 1'
-COLOR_CHECKBOX_D '1 1 1'
-
-// item: crosshair button
-// uses "crosshairbutton" images
-
-// dialog background colors
-// uses "border" images
-COLOR_DIALOG_MULTIPLAYER '1 1 1'
-COLOR_DIALOG_SETTINGS '1 1 1'
-COLOR_DIALOG_TEAMSELECT '1 1 1'
-COLOR_DIALOG_QUIT '1 1 1'
-COLOR_DIALOG_ADVANCED '1 1 1'
-COLOR_DIALOG_MUTATORS '1 1 1'
-COLOR_DIALOG_MAPINFO '1 1 1'
-COLOR_DIALOG_USERBIND '1 1 1'
-COLOR_DIALOG_SINGLEPLAYER '1 1 1'
-COLOR_DIALOG_CREDITS '1 1 1'
-COLOR_DIALOG_WEAPONS '1 1 1'
-COLOR_DIALOG_WAYPOINTS '1 1 1'
-COLOR_DIALOG_SERVERINFO '1 1 1'
-COLOR_DIALOG_CVARS '1 0 0'
-
-// item: input box
-// uses "inputbox" images
-COLOR_INPUTBOX_N '1 1 1'
-COLOR_INPUTBOX_F '1 1 1'
-MARGIN_INPUTBOX_CHARS 1
-
-// item: key grabber
-COLOR_KEYGRABBER_TITLES '1 1 1'
-ALPHA_KEYGRABBER_TITLES 1
-COLOR_KEYGRABBER_KEYS '1 1 1'
-ALPHA_KEYGRABBER_KEYS 0.7
-
-// item: player color button
-// uses "colorbutton" images
-// uses "color" images
-
-// item: player name editor
-// uses "charmap" images
-// uses "charmapbutton" images
-
-// item: radio button
-// uses "radiobutton" images
-COLOR_RADIOBUTTON_N '1 1 1'
-COLOR_RADIOBUTTON_C '1 1 1'
-COLOR_RADIOBUTTON_F '1 1 1'
-COLOR_RADIOBUTTON_D '1 1 1'
-
-// item: scrollbar
-// uses "scrollbar" images
-COLOR_SCROLLBAR_N '1 1 1'
-COLOR_SCROLLBAR_C '0.5 0.75 1'
-COLOR_SCROLLBAR_F '0.5 0.75 1'
-COLOR_SCROLLBAR_S '0.25 0.25 0.25'
-WIDTH_SCROLLBAR 16
-
-// item: slider
-// uses "slider" images
-COLOR_SLIDER_N '1 1 1'
-COLOR_SLIDER_C '0.5 0.75 1'
-COLOR_SLIDER_F '0.5 0.75 1'
-COLOR_SLIDER_D '1 1 1'
-COLOR_SLIDER_S '0.25 0.25 0.25'
-WIDTH_SLIDERTEXT 0.333333333333
-TOLERANCE_SLIDER '0.2 2 0'
// uses "closebutton" images
MARGIN_TOP 8
MARGIN_BOTTOM 8
-MARGIN_LEFT 8
-MARGIN_RIGHT 8
+MARGIN_LEFT 16
+MARGIN_RIGHT 16
MARGIN_COLUMNS 4
MARGIN_ROWS 4
HEIGHT_DIALOGBORDER 1
--- /dev/null
+title Default // "WickedX"
+author sev
+
+// Colors: 'Red Green Blue'
+// Suffixes: Clicked (_c), Disabled (_d), Focused (_f), Normal (_n)
+
+// Background layer scaling:
+// Crop (c), Letterbox (l), Height (h), Width (w), Stretch (s)
+// Background layer positioning:
+// Top Left (7), Top Center (8) Top Right (9)
+// Middle Left (4), Middle Center (5) Middle Right (6)
+// Bottom Left (1), Bottom Center (2) Bottom Right (3)
+// ALIGN_BACKGROUND(_INGAME) spspsp, s=Scale p=Position
+
+//------------------------------------------------------------------------------
+// Structure (e.g. positions, sizes, margins)
+//------------------------------------------------------------------------------
+// item: color picker
+// uses "colorpicker" images
+MARGIN_COLORPICKER '0 0 0'
+
+// item: dialog
+// uses "border" images
+// uses "closebutton" images
+MARGIN_TOP 8
+MARGIN_BOTTOM 8
+MARGIN_LEFT 16
+MARGIN_RIGHT 16
+MARGIN_COLUMNS 4
+MARGIN_ROWS 4
+HEIGHT_DIALOGBORDER 1
+
+// font sizes (used for everything)
+FONTSIZE_NORMAL 12
+HEIGHT_NORMAL 1.5
+FONTSIZE_TITLE 16
+HEIGHT_TITLE 1.5
+HEIGHT_ZOOMEDTITLE -1
+
+// general
+// uses "background" images
+// uses "background_ingame" images
+ALIGN_BACKGROUND h5h5
+ALIGN_BACKGROUND_INGAME h5
+ALPHA_BACKGROUND_INGAME 1
+ALPHA_DISABLED 0.2
+ALPHA_BEHIND 0.5
+ALPHA_TEXT 0.7
+
+// mouse
+// uses "cursor" images
+SIZE_CURSOR '32 32 0'
+OFFSET_CURSOR '0 0 0'
+ALPHA_CURSOR_INTRO 0
+
+// nexposee positions of windows (they are the scale transformation
+// centers, NOT the actual positions of the windows!)
+POSITION_DIALOG_MULTIPLAYER '0.8 0.4 0'
+POSITION_DIALOG_SINGLEPLAYER '0.2 0.4 0'
+POSITION_DIALOG_SETTINGS '0.5 0.95 0'
+POSITION_DIALOG_CREDITS '-0.05 1.2 0'
+POSITION_DIALOG_QUIT '1.05 1.2 0'
+
+// tooltips
+// uses "tooltip" images
+MARGIN_TOOLTIP '8 8 0'
+BORDER_TOOLTIP '16 16 0'
+FONTSIZE_TOOLTIP 12
+ALPHA_TOOLTIP 0.7
+WIDTH_TOOLTIP 0.3
+AVOID_TOOLTIP '8 8 0'
+
+//------------------------------------------------------------------------------
+// Colors (e.g. font colors, field colors)
+//------------------------------------------------------------------------------
+// item: campaign
+ALPHA_CAMPAIGN_SELECTABLE 0.8
+COLOR_CAMPAIGN_SELECTABLE '1 1 1'
+ALPHA_CAMPAIGN_CURRENT 1
+COLOR_CAMPAIGN_CURRENT '1 1 1'
+ALPHA_CAMPAIGN_FUTURE 0.2
+COLOR_CAMPAIGN_FUTURE '1 1 1'
+ALPHA_CAMPAIGN_DESCRIPTION 0.7
+
+// item: credits list
+COLOR_CREDITS_TITLE '0.875 0.375 0'
+ALPHA_CREDITS_TITLE 1
+COLOR_CREDITS_FUNCTION '0 0.1875 0.4375'
+ALPHA_CREDITS_FUNCTION 0.5
+COLOR_CREDITS_PERSON '0 0.375 0.75'
+ALPHA_CREDITS_PERSON 0.875
+ROWS_CREDITS 20
+WIDTH_CREDITS 0.5
+
+// item: cvar list
+ALPHA_CVARLIST_SAVED 1
+ALPHA_CVARLIST_TEMPORARY 0.7
+COLOR_CVARLIST_CHANGED '0 0.375 0.75'
+COLOR_CVARLIST_REVERTBUTTON '1 0 0'
+COLOR_CVARLIST_UNCHANGED '1 1 1'
+
+// item: list box
+COLOR_LISTBOX_SELECTED '0.875 0.375 0'
+ALPHA_LISTBOX_SELECTED 1
+COLOR_LISTBOX_WAITING '1 1 1'
+ALPHA_LISTBOX_WAITING 0.5
+
+// item: map list
+COLOR_MAPLIST_TITLE '1 1 1'
+COLOR_MAPLIST_AUTHOR '0 0.375 0.75'
+COLOR_MAPLIST_INCLUDEDBG '0 0.1875 0.4375'
+ALPHA_MAPLIST_INCLUDEDFG 1
+ALPHA_MAPLIST_INCLUDEDBG 0.375
+ALPHA_MAPLIST_NOTINCLUDEDFG 0.25
+
+// item: nexposee
+ALPHAS_MAINMENU '0.8 0.9 1'
+
+// item: player model
+COLOR_MODELTITLE '1 1 1'
+ALPHA_MODELTITLE 1
+
+// item: server info
+COLOR_SERVERINFO_NAME '1 1 1'
+COLOR_SERVERINFO_IP '0.875 0.375 0'
+
+// 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_HIGHPING '1 0 0'
+ALPHA_SERVERLIST_HIGHPING 0.4
+ALPHA_SERVERLIST_FAVORITE 0.8
+COLOR_SERVERLIST_FAVORITE '1 1 1'
+
+// item: skin list
+COLOR_SKINLIST_TITLE '1 1 1'
+COLOR_SKINLIST_AUTHOR '0 0.375 0.75'
+
+//------------------------------------------------------------------------------
+// Images (colors multiplied to images)
+//------------------------------------------------------------------------------
+// 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'
+COLOR_BUTTON_D '1 1 1'
+
+// item: checkbox
+// uses "checkbox" images
+COLOR_CHECKBOX_N '1 1 1'
+COLOR_CHECKBOX_C '0.5 0.75 1'
+COLOR_CHECKBOX_F '0.5 0.75 1'
+COLOR_CHECKBOX_D '1 1 1'
+
+// item: crosshair button
+// uses "crosshairbutton" images
+
+// dialog background colors
+// uses "border" images
+COLOR_DIALOG_MULTIPLAYER '1 1 1'
+COLOR_DIALOG_SETTINGS '1 1 1'
+COLOR_DIALOG_TEAMSELECT '1 1 1'
+COLOR_DIALOG_QUIT '1 1 1'
+COLOR_DIALOG_ADVANCED '1 1 1'
+COLOR_DIALOG_MUTATORS '1 1 1'
+COLOR_DIALOG_MAPINFO '1 1 1'
+COLOR_DIALOG_USERBIND '1 1 1'
+COLOR_DIALOG_SINGLEPLAYER '1 1 1'
+COLOR_DIALOG_CREDITS '1 1 1'
+COLOR_DIALOG_WEAPONS '1 1 1'
+COLOR_DIALOG_WAYPOINTS '1 1 1'
+COLOR_DIALOG_SERVERINFO '1 1 1'
+COLOR_DIALOG_CVARS '1 0 0'
+
+// item: input box
+// uses "inputbox" images
+COLOR_INPUTBOX_N '1 1 1'
+COLOR_INPUTBOX_F '1 1 1'
+MARGIN_INPUTBOX_CHARS 1
+
+// item: key grabber
+COLOR_KEYGRABBER_TITLES '1 1 1'
+ALPHA_KEYGRABBER_TITLES 1
+COLOR_KEYGRABBER_KEYS '1 1 1'
+ALPHA_KEYGRABBER_KEYS 0.7
+
+// item: player color button
+// uses "colorbutton" images
+// uses "color" images
+
+// item: player name editor
+// uses "charmap" images
+// uses "charmapbutton" images
+
+// item: radio button
+// uses "radiobutton" images
+COLOR_RADIOBUTTON_N '1 1 1'
+COLOR_RADIOBUTTON_C '1 1 1'
+COLOR_RADIOBUTTON_F '1 1 1'
+COLOR_RADIOBUTTON_D '1 1 1'
+
+// item: scrollbar
+// uses "scrollbar" images
+COLOR_SCROLLBAR_N '1 1 1'
+COLOR_SCROLLBAR_C '0.5 0.75 1'
+COLOR_SCROLLBAR_F '0.5 0.75 1'
+COLOR_SCROLLBAR_S '0.25 0.25 0.25'
+WIDTH_SCROLLBAR 16
+
+// item: slider
+// uses "slider" images
+COLOR_SLIDER_N '1 1 1'
+COLOR_SLIDER_C '0.5 0.75 1'
+COLOR_SLIDER_F '0.5 0.75 1'
+COLOR_SLIDER_D '1 1 1'
+COLOR_SLIDER_S '0.25 0.25 0.25'
+WIDTH_SLIDERTEXT 0.333333333333
+TOLERANCE_SLIDER '0.2 2 0'
// uses "closebutton" images
MARGIN_TOP 8
MARGIN_BOTTOM 8
-MARGIN_LEFT 8
-MARGIN_RIGHT 8
+MARGIN_LEFT 16
+MARGIN_RIGHT 16
MARGIN_COLUMNS 4
MARGIN_ROWS 4
HEIGHT_DIALOGBORDER 1
seta hud_progressbar_acceleration_color "0.5 0.75 1"
seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
-seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 "
+seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 "
seta hud_configure_grid "1"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta scr_centerpos "0.25"
-
seta hud_panel_weapons 1
seta hud_panel_weapons_pos "0.940000 0.180000"
seta hud_panel_weapons_size "0.060000 0.610000"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics 0
+seta hud_panel_physics 3
seta hud_panel_physics_pos "0.420000 0.620000"
seta hud_panel_physics_size "0.170000 0.080000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_progressbar "1"
seta hud_panel_physics_text "1"
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.175000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
menu_sync
seta hud_progressbar_acceleration_color "0.5 0.75 1"
seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
-seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 "
+seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 "
seta hud_configure_grid "1"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta scr_centerpos "0.25"
-
seta hud_panel_weapons 1
seta hud_panel_weapons_pos "0.350000 0.940000"
seta hud_panel_weapons_size "0.300000 0.060000"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics 0
+seta hud_panel_physics 3
seta hud_panel_physics_pos "0.440000 0.590000"
seta hud_panel_physics_size "0.120000 0.050000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_progressbar "3"
seta hud_panel_physics_text "2"
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.175000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
menu_sync
seta hud_progressbar_acceleration_color "0.5 0.75 1"
seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
-seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 "
+seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 "
seta hud_configure_grid "1"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta scr_centerpos "0.25"
-
seta hud_panel_weapons 1
seta hud_panel_weapons_pos "0.920000 0.090000"
seta hud_panel_weapons_size "0.060000 0.630000"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics 0
+seta hud_panel_physics 3
seta hud_panel_physics_pos "0.410000 0.590000"
seta hud_panel_physics_size "0.180000 0.100000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_progressbar "1"
seta hud_panel_physics_text "1"
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.175000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
menu_sync
seta hud_progressbar_acceleration_color "0.5 0.75 1"
seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
-seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 "
+seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 "
seta hud_configure_grid "1"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta scr_centerpos "0.25"
-
seta hud_panel_weapons 1
seta hud_panel_weapons_pos "0.350000 0.940000"
seta hud_panel_weapons_size "0.300000 0.060000"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics 0
+seta hud_panel_physics 3
seta hud_panel_physics_pos "0.270000 0.730000"
seta hud_panel_physics_size "0.170000 0.030000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_progressbar "3"
seta hud_panel_physics_text "2"
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.175000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
menu_sync
seta hud_progressbar_acceleration_color "0.25 1 0.25"
seta hud_progressbar_acceleration_neg_color "1 0.25 0.25"
-seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 "
+seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 "
seta hud_configure_grid "1"
seta hud_configure_grid_xsize "0.01"
seta hud_configure_grid_ysize "0.01"
-seta scr_centerpos "0.25"
-
seta hud_panel_weapons 1
seta hud_panel_weapons_pos "0.370000 0.870000"
seta hud_panel_weapons_size "0.340000 0.060000"
seta hud_panel_infomessages_bg_padding ""
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics 0
+seta hud_panel_physics 3
seta hud_panel_physics_pos "0.430000 0.640000"
seta hud_panel_physics_size "0.140000 0.100000"
seta hud_panel_physics_bg "0"
seta hud_panel_physics_progressbar "3"
seta hud_panel_physics_text "2"
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.175000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
menu_sync
--- /dev/null
+alias playdemo "set _demo_name \"$1\""
+set _demo_name ""
+set _demo_seeking 0
+set _demo_good 0
+set _demo_time_increasing 0
+set _demo_time 0
+set _demo_time_step 0
+alias seekdemo "_seekdemo_1_$_demo_seeking $1"
+alias _seekdemo_1_0 "cl_cmd rpn time dup \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
+alias _seekdemo_1_1 "cl_cmd rpn time _demo_time \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
+alias _seekdemo_2 "_demo_seeking 1; r_render 0; snd_startnonloopingsounds 0; _seekdemo_3_$_demo_time_increasing"
+alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 10 _seekdemo_9_2"
+alias _seekdemo_3_1 "_seekdemo_7"
+alias _seekdemo_4 "set _demo_good 0; cl_cmd rpn /_demo_good 1 def; _seekdemo_5"
+alias _seekdemo_5 "_seekdemo_6_$_demo_good"
+alias _seekdemo_6_0 "defer 0.02 _seekdemo_4"
+alias _seekdemo_6_1 "defer clear; _seekdemo_7"
+alias _seekdemo_7 "set _demo_time_step 2; cl_cmd rpn _demo_time time gt /_demo_time_step exch def; _seekdemo_8"
+alias _seekdemo_8 "_seekdemo_9_$_demo_time_step"
+alias _seekdemo_9_0 "slowmo 1; set _demo_seeking 0; r_render 1; snd_startnonloopingsounds 1"
+alias _seekdemo_9_1 "cl_cmd rpn _demo_time time sub 10 mul 1 add /slowmo exch def; defer 0.001 _seekdemo_7"
+alias _seekdemo_9_2 "slowmo 1; set _demo_seeking 0; r_render 1; snd_startnonloopingsounds 1; echo SEEK FAILED"
+bind , "seekdemo -5"
+bind . "seekdemo +5"
+bind m "seekdemo -30"
+bind - "seekdemo +30"
+bind / "seekdemo +30"
+
+// Usage:
+// start a demo
+// use ,. keys to seek -5/+5 seconds
+// use m/ keys (left/right of ,.) to seek -30/+30 seconds
"weaplast" "previously used"
"weapbest" "best"
"reload" "reload"
-"impulse 1" "Laser"
-"impulse 2" "Shotgun"
-"impulse 3" "Machine Gun"
-"impulse 4" "Mortar / Mine Layer"
-"impulse 5" "Electro"
-"impulse 6" "Crylink / HLAC"
-"impulse 7" "Nex / MinstaNex / Rifle"
-"impulse 8" "Hagar / Seeker"
-"impulse 9" "Rocket Launcher / Fireball"
-"impulse 14" "Port-O-Launch / Hook"
+"weapon_group_1" "Laser"
+"weapon_group_2" "Shotgun"
+"weapon_group_3" "Machine Gun"
+"weapon_group_4" "Mortar / Mine Layer"
+"weapon_group_5" "Electro"
+"weapon_group_6" "Crylink / HLAC"
+"weapon_group_7" "Nex / MinstaNex / Rifle"
+"weapon_group_8" "Hagar / Seeker"
+"weapon_group_9" "Rocket Launcher / Fireball"
+"weapon_group_0" "Port-O-Launch / Hook"
"" ""
"" "View"
"+zoom" "hold zoom"
--- /dev/null
+"" "Movimento"
+"+forward" "avanti"
+"+back" "indietro"
+"+moveleft" "a sinistra"
+"+moveright" "a destra"
+"+jump" "salta / nuota"
+"+crouch" "accovacciarsi / abbassarsi"
+"+hook" "uncino / jet pack"
+"" ""
+"" "Attacco"
+"+fire" "fuoco primario"
+"+fire2" "fuoco secondario"
+"" ""
+"" "Cambio d'arma"
+"weapprev" "arma precedente"
+"weapnext" "arma successiva"
+"weaplast" "ultima arma usata"
+"weapbest" "miglior arma"
+"reload" "ricarica"
+"impulse 1" "Laser"
+"impulse 2" "Shotgun"
+"impulse 3" "Machine Gun"
+"impulse 4" "Mortar / Mine Layer"
+"impulse 5" "Electro"
+"impulse 6" "Crylink / HLAC"
+"impulse 7" "Nex / MinstaNex / Fucile"
+"impulse 8" "Hagar / Seeker"
+"impulse 9" "Rocket Launcher / Fireball"
+"impulse 14" "Port-O-Launch / Hook"
+"" ""
+"" "Vista"
+"+zoom" "tieni zoom"
+"togglezoom" "attiva/disattiva zoom"
+"+showscores" "mostra punteggio"
+"screenshot" "cattura schermata"
+"" ""
+"" "Comunicazione"
+"messagemode" "chat pubblica"
+"messagemode2" "chat di squadra"
+"+con_chat_maximize" "mostra storia chat"
+"vyes" "vota SÌ"
+"vno" "vota NO"
+"ready" "pronto"
+"" ""
+"" "Client"
+"+show_info" "info del server"
+"toggleconsole" "apri console"
+"disconnect" "disconnetti"
+"quit" "esci"
+"" ""
+"" "Teamplay"
+"messagemode2" "chat di squadra"
+"team_auto" "auto-unisciti ad una squadra"
+"menu_showteamselect" "selezione della squadra"
+"spec" "entra in modalità spettatore"
+"dropweapon" "rilascia arma"
+"+use" "rilascia chiave / rilascia bandiera"
+"" ""
+"" "Definiti dall'utente"
+"+userbind 1" "$userbind1"
+"+userbind 2" "$userbind2"
+"+userbind 3" "$userbind3"
+"+userbind 4" "$userbind4"
+"+userbind 5" "$userbind5"
+"+userbind 6" "$userbind6"
+"+userbind 7" "$userbind7"
+"+userbind 8" "$userbind8"
+"+userbind 9" "$userbind9"
+"+userbind 10" "$userbind10"
+"+userbind 11" "$userbind11"
+"+userbind 12" "$userbind12"
+"+userbind 13" "$userbind13"
+"+userbind 14" "$userbind14"
+"+userbind 15" "$userbind15"
+"+userbind 16" "$userbind16"
+"+userbind 17" "$userbind17"
+"+userbind 18" "$userbind18"
+"+userbind 19" "$userbind19"
+"+userbind 20" "$userbind20"
+"+userbind 21" "$userbind21"
+"+userbind 22" "$userbind22"
+"+userbind 23" "$userbind23"
+"+userbind 24" "$userbind24"
+"+userbind 25" "$userbind25"
+"+userbind 26" "$userbind26"
+"+userbind 27" "$userbind27"
+"+userbind 28" "$userbind28"
+"+userbind 29" "$userbind29"
+"+userbind 30" "$userbind30"
+"+userbind 31" "$userbind31"
+"+userbind 32" "$userbind32"
de German "Deutsch"
en English "English"
-fi Finnish "Suomi"
+es Spanish "Español"
fr French "Français"
-hu Hungarian "Magyar"
it Italian "Italiano"
+hu Hungarian "Magyar"
nl Dutch "Nederlands"
pt Portuguese "Português"
ro Romanian "Romana"
ru Russian "Русский"
-se Swedish "Svenska"
-es Spanish "Español"
+fi Finnish "Suomi"
msgstr ""
"Project-Id-Version: 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:05+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
"PO-Revision-Date: 2011-04-20 10:46+0200\n"
"Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
"Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "^4MQC Build-Information: ^1%s (deutsch)\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Nur aktuellen Munitionstyp anzeigen"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Icon ausrichten:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Links"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Rechts"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Nachrichten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Anzeigedauer:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Ausblenden nach:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Reihenfolge vertauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Textausrichtung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Mittig"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Schriftgröße:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Chat-Panel"
msgid "Entry fadetime:"
msgstr "Eintrags-Ausblendung:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Physik-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel nicht anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panel anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panel auch beim Zuschauen anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panel nur in Race und CTS anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Statusleiste"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Innen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Außen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Geschwindigkeit/Beschleunigung tauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Geschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Mit vertikaler Geschwindigkeit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Geschwindigkeitseinheit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "Knoten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Geschwindigkeitsrekord:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Beschleunigung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Mit vertikaler Beschleunigung"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Bonus-Panel"
msgid "Pressed Keys Panel"
msgstr "Gedrückte-Tasten-Panel"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel nicht anzeigen"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Panel beim Zuschauen anzeigen"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:612
msgid "Alpha:"
msgstr "Alpha:"
msgid "Score Panel"
msgstr "Punkte-Panel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Punkte:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Platzierungen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Auch für mich"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Rein"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Zeit-Panel"
msgid "Fade effect:"
msgstr "Ausblendeeffekt:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "keiner"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Schieben"
msgid "Alpha"
msgstr "Alpha"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "beide"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Waffensymbole:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr "Nur vorhandene Waffen zeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Show weapon ID as:"
msgstr "Waffen-ID zeigen als:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
msgid "SHOWAS^None"
msgstr "nichts"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
msgid "Number"
msgstr "Zahl"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Bind"
msgstr "Taste"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
msgid "Show Accuracy"
msgstr "Trefferquote zeigen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Show Ammo"
msgstr "Munition zeigen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
msgid "Ammo bar color:"
msgstr "Muntionsleistenfarbe:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
msgid "Ammo bar alpha:"
msgstr "Munitionsleistenalpha:"
msgid "Panel background defaults:"
msgstr "Panel-Standardhintergrund:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
+msgid "Background:"
+msgstr "Hintergrund:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
msgid "Disable"
msgstr "Aus"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
msgid "Color:"
msgstr "Farbe:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
msgid "Border size:"
msgstr "Rahmengröße:"
msgid "Team color:"
msgstr "Teamfarbe:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
msgid "Test team color in configure mode"
msgstr "Teamfarbe bei Konfiguration testen"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
msgid "Padding:"
msgstr "Abstand:"
msgid "Player Setup"
msgstr "Spieler-Einstellungen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Spieltyp"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Spieleinstellungen:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Zeitlimit:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Standardwert der Map verwenden"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Punktelimit"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Spielerplätze:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Anzahl Bots:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Spielstärke:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Bots halt"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Anfänger"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Gewinnst schon"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Kannst gewinnen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Könntest gewinnen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Fortgeschritten"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Experte"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Profi"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Mörder"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Übermenschlich"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Gottgleich"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutators..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Erweiterte Einstellungen..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Mapliste:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Alle auswählen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Keine auswählen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Starten!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Capture-Limit:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Leben:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Runden:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Tore:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Punktelimit:"
msgid "Game types:"
msgstr "Spieltyp:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Schließen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Start"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Timedemo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Abspielen"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Verbinden"
msgstr "Schadenseffekt:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_input.c:74
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Sofort anwenden"
msgid "Draw 1st person weapon model"
msgstr "Waffe in 3D anzeigen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Links"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Rechts"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "3D-Ansicht spiegeln"
msgid "Music:"
msgstr "Musik:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Umgebung:"
msgid "Info:"
msgstr "Info:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Gegenstände:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Schmerz:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Spieler:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Schüsse:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Stimme:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Waffen:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frequenz:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11,025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22,05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44,1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Kanäle"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Stereokanäle tauschen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Kopfhörer-Modus"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Räumliche Sprachnachrichten:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "keine"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "nur Spott"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "alle"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Spott-Radius:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "Sehr klein"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Klein"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Normal"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Groß"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Sehr groß"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Automatischer Spott"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Zeitwarnung:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "keine"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 Minute"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 Minuten"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "beide"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Treffer-Indikator"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Menü-Sounds"
msgid "Decals"
msgstr "Einschusslöcher"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "auch auf Objekten"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distanz:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Zeit:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Lightmaps verwenden"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Deluxemapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Glanz"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Offsetmapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Reliefmapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Reflexionen:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Schwammig"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Gut"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Scharf"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Oberflächen anzeigen"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Kein dynamisches Licht"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Flash-Blend-Näherung"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Dynamisches Licht in Echtzeit"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Schatten"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Map-Licht in Echtzeit"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Normalmaps verwenden"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Weiche Schatten"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Koronas"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Occlusion Queries verwenden"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Überstrahlung"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "Lichtdynamik (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Bewegungsunschärfe:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Schadensunschärfe:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Schärfeeffekte"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Empfindlichkeit:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Mausgeschwindigkeit:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Mausfilterung"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Höhe invertieren"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Joystick verwenden"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Mausbeschleunigung deaktivieren"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"Konsole öffnen\" schließt auch"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:72
+msgid "Holding jump key keeps jumping"
+msgstr "Festhalten der Springen-Taste springt weiter"
+
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
msgid "User defined key bind"
msgstr "Benutzerdefinierte Tastenbelegung"
msgstr "Frames pro Sekunde anzeigen"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Tachometer"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (ohne Einheit)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "Knoten"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Akzelerometer anzeigen"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Akzelerometer-Skalierung:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Eingabelatenz minimieren"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Kontrasterhöhung:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Sättigung:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Umgebungslicht:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Lichtstärke:"
msgid "Singleplayer"
msgstr "Einzelspieler"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
msgid "Instant action! (random map with bots)"
msgstr "Sofortstart! (zufällige Map mit Bots)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
msgid "Start Singleplayer!"
msgstr "Spiel starten!"
msgid "Bookmark"
msgstr "Speichern"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Servername"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Map"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Typ"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Spieler"
msgid "<AUTHOR>"
msgstr "<AUTOR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "AUS"
msgid "%dx%d"
msgstr "%dx%d"
-#: qcsrc/menu/xonotic/util.qc:270
+#: qcsrc/menu/xonotic/util.qc:271
#, c-format
msgid "Received HTTP request data for an invalid id %d.\n"
msgstr "HTTP-Antwort für ungültige ID %d erhalten.\n"
-#: qcsrc/menu/xonotic/util.qc:285
+#: qcsrc/menu/xonotic/util.qc:286
#, c-format
msgid "error receiving update notification: status is %d\n"
msgstr "Fehler beim Empfang von Update-Information (Status: %d)\n"
-#: qcsrc/menu/xonotic/util.qc:290
+#: qcsrc/menu/xonotic/util.qc:291
msgid "error: received HTML instead of an update notification\n"
msgstr "Fehler: HTML statt Update-Information erhalten\n"
-#: qcsrc/menu/xonotic/util.qc:295
+#: qcsrc/menu/xonotic/util.qc:296
msgid "error: received carriage returns from update notification server\n"
msgstr "Fehler: Carriage-Returns in Update-Information enthalten\n"
-#: qcsrc/menu/xonotic/util.qc:316
+#: qcsrc/menu/xonotic/util.qc:317
#, c-format
msgid ""
"Update can be downloaded at:\n"
"%s\n"
"heruntergeladen werden.\n"
-#: qcsrc/menu/xonotic/util.qc:337
+#: qcsrc/menu/xonotic/util.qc:340
msgid "Autogenerating mapinfo for newly added maps..."
msgstr "Automatische Generierung von mapinfo-Dateien..."
-#: qcsrc/menu/xonotic/util.qc:367
+#: qcsrc/menu/xonotic/util.qc:370
#, c-format
msgid "^1%s TEST BUILD"
msgstr "^1%s TESTVERSION"
-#: qcsrc/menu/xonotic/util.qc:432
+#: qcsrc/menu/xonotic/util.qc:428
#, c-format
msgid "Update to %s now!"
msgstr "Jetzt auf %s updaten!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:513
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
"^1Darstellungsprobleme sind zu erwarten.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Assault"
msgstr "Assault"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Capture The Flag"
msgstr "Capture The Flag"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:539
msgid "Deathmatch"
msgstr "Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:540
msgid "Domination"
msgstr "Domination"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:541
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:542
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:543
msgid "Key Hunt"
msgstr "Key Hunt"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:544
msgid "Last Man Standing"
msgstr "Last Man Standing"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:545
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:546
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:547
msgid "Race"
msgstr "Race"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:548
msgid "Race CTS"
msgstr "Race CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:549
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:550
msgid "Team Deathmatch"
msgstr "Team Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:569
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba-Werfen"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Hintergrund:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:634
msgid "Default"
msgstr "Standard"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Use default"
msgstr "Standard verwenden"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:620
msgid "Team Color:"
msgstr "Teamfarbe:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Panel aktivieren"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s zerstörte sich selbst erfolgreich mit der Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s konnte sich nicht vor %ss Crylink verstecken"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s trat %ss Crylink zu nahe"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s schaute sich %ss Crylink sehr genau an"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s vergaß, wo er das Plasma hingetan hatte"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s spielte mit Plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s hat gerade %ss blaue Kugel bemerkt"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s kam mit %ss blauer Kugel in Kontakt"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s kam zu nah an %ss blauen Strahl"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s wurde von %ss blauen Strahl erwischt"
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s wollte wissen, ob seine Granate funktioniert"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s verfing sich in der eigenen Detonation"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s hat %ss Granate nicht gesehen"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s ist fast %ss Granate ausgewichen"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s nahm %ss Granate in den Mund"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s hat mit kleinen Raketen gespielt"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "^1%s^1 wurde von %s^1 erwischt"
#: qcsrc/server/w_hook.qc:2
msgid "Grappling Hook"
-msgstr "Grappling Hook"
+msgstr "Enterhaken"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s hat das Unmögliche geschafft"
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s hat sich in die Hölle gelasert"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s ist von %ss Gauntlet halbiert worden"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s ist explodiert"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s ist %ss Mine zu nahe getreten"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s ist fast %ss Mine ausgewichen"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s ist auf %ss Mine gelatscht"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s kann jetzt mit Portalen denken"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "^1%s^1 wurde von %s^1 vernichtet"
msgid "%s felt %s doing the impossible to him"
msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Rocket Launcher"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s ist %ss Rakete zu nahe getreten"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s ist fast %ss Rakete ausgewichen"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s hat %ss Rakete in den Mund genommen"
msgid "Shotgun"
msgstr "Shotgun"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "^1%s^1 wurde von %s^1 erschossen"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
"%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
#, c-format
msgid "%s was riddled full of holes by %s"
msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "Damage & water blur"
+#~ msgstr "Schadens-Unschärfe"
+
+#~ msgid "Powerup sharpen"
+#~ msgstr "Bonus-Schärfe"
msgstr ""
"Project-Id-Version: Xonotic 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"Last-Translator: Rodrigo Mouton Laudin <ratogenesis@gmail.com>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revisión-Date: 2011-03-24 19:40+0100\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
#: qcsrc/menu/gamecommand.qc:239
msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
msgstr ""
-"Comando no valido. Para una lista de comandos soportados, teclea menu_cmd "
+"Comando no válido. Para una lista de comandos soportados, escriba menu_cmd "
"help\n"
#: qcsrc/menu/item/gecko.c:49
msgid "Browser not initialized!"
-msgstr "navegador no inicializado!"
+msgstr "¡Navegador no inicializado!"
#: qcsrc/menu/item/label.c:63
#, c-format
msgstr "Personalizado"
#: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
msgid "^4MQC Build information: ^1%s\n"
msgstr "^4MQC Información de compilación/build %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
"player name to get started. You can change these options later through the "
"menu system."
msgstr ""
-"Bienvenido a Xonotic, por favor seleccióne su Lenguaje preferido y luego "
+"Bienvenido a Xonotic, por favor seleccióne su lenguaje preferido y luego "
"ingrese su nombre de jugador. Estas opciones pueden ser modificadas luego "
"utilizando el menú de configuración"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
msgid "Ammo Panel"
-msgstr "panel de munición"
+msgstr "Panel de munición"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
msgid "Ammunition display:"
msgid "Show only current ammo type"
msgstr "Mostrar sólo la munición actual"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Alinear ícono"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Izquierda"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Derecha"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Mensaje centrado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Duración del mensaje:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Tiempo hasta desaparecer:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Intercambiar orden de mensajes"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alineado de texto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Escala de fuente:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Panel de chat"
msgid "Entry fadetime:"
msgstr "Desaparecimento de la entrada:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Panel de Física"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panel habilitado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panel activado aún como espectador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panel activo en modo Race/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barra de estado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Alinear a la izquierda"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Alinear a la derecha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Alineado interior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Alineado exterior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Intercambiar la posición de velocidad/aceleración"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Velocidad:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Incluir velocidad vertical"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unidad de velocidad"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "nudos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Mostrar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Máxima velocidad:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Aceleración:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Incluir aceleración vertical"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Panel de Poderes"
msgid "Pressed Keys Panel"
msgstr "Panel de teclas presionadas"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel desactivado"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Panel activado cuando este espectador"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Transparencia:"
msgid "Score Panel"
msgstr "Panel de Puntos"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Puntaje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Posiciones:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Y yo"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Puro"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Panel del Temporizador"
msgid "Fade effect:"
msgstr "Efecto de desvanecimento"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "Ninguno"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Corte"
msgid "Alpha"
msgstr "Transparencia"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Ambos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "íconos de armas"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Mostra ID de arma como:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
-msgstr "Nenhum"
+msgstr "Ninguno"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Número"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Lazo"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Mostrar precision"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Mostrar munición"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Color de la barra de munición:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Transparencia de la barra de munición:"
msgid "Panel background defaults:"
msgstr "Panel de fondo por defecto:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fondo:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Desactivar"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Color:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Tamaño de limite:"
msgid "Team color:"
msgstr "Color del equipo:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Probar color del equipo en modo configuración"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Relleno:"
msgstr "Muelle de HUD:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-#, fuzzy
msgid "DOCK^Disabled"
msgstr "Desactivado"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-#, fuzzy
msgid "DOCK^Small"
-msgstr "Pequeno"
+msgstr "Chico"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-#, fuzzy
msgid "DOCK^Medium"
msgstr "Medio"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-#, fuzzy
msgid "DOCK^Large"
msgstr "Grande"
msgid "Player Setup"
msgstr "Jugador"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Tipo de juego:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Configuración del encuentro:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Limite de tiempo:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Usar definicion especifica del mapa"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Limite de puntos:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Slots de Jugadores:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Número de bots:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Dificultad del bot:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Bot"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Iniciado"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Ganaras"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Puedes ganar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Podrias ganar ganar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Avanzado"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Experto"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Profesional"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Asesino"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "No humano"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Semi-dios"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutators..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Configuración avanzada..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Lista de mapas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Seleccionar todos"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Seleccionar ninguno"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
-msgstr "Comenzar Multijugador!"
+msgstr "¡Comenzar Multijugador!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Limite de capturas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Vidas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Vueltas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Metas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Limite de Frags:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
msgid "Allow spectating"
-msgstr "Permitir espectador"
+msgstr "Permitir espectadores"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
msgid "Spawn shield:"
-msgstr "Proteccion del colocado:"
+msgstr "Tiempo de protección al resucitar:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
msgid "Game speed:"
msgid "Game types:"
msgstr "Modos de juego:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Cerrar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Jugar"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
msgid "Rocket Flying"
-msgstr "Vuelo de cohete"
+msgstr "Volar con Cohetes"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
msgid "Midair"
-msgstr "aire"
+msgstr "No saltes"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
msgstr "Jetpack"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
-#, fuzzy
msgid "MUT^None"
msgstr "Ninguno"
msgid "Timedemo"
msgstr "Demo temporizado"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Jugar"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Ingresar"
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
-#, fuzzy
msgid "SRVS^Empty"
msgstr "Vacío"
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
-#, fuzzy
msgid "SRVS^Full"
msgstr "Completo"
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
msgid "Join!"
-msgstr "Ingresar!"
+msgstr "¡Ingresar!"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
msgid "Server Information"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
#, c-format
msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d lugares para jugar disponibles"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
#, c-format
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
msgid "View bobbing:"
-msgstr "Ver flotando:"
+msgstr "Vista flotante:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
msgid "Zoom factor:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
msgid "Crosshair size:"
-msgstr "Tamaño da mira:"
+msgstr "Tamaño de mira:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
msgid "Crosshair alpha:"
-msgstr "Transparencia da mira:"
+msgstr "Transparencia de mira:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
msgid "Crosshair color:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
msgid "By health"
-msgstr ""
+msgstr "Por salud"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-#, fuzzy
msgid "Custom"
msgstr "Personalizado"
msgstr "Test de tiro:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
-#, fuzzy
msgid "HTST^None"
msgstr "Ninguno"
msgstr "Forzar modelos:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
-#, fuzzy
msgid "MDL^None"
msgstr "Ninguno"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
-#, fuzzy
msgid "MDL^Custom"
-msgstr "Modificado"
+msgstr "Personalizado"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
-#, fuzzy
msgid "MDL^All"
msgstr "Todos"
msgstr "Gibs:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
-#, fuzzy
msgid "GIBS^None"
msgstr "Ninguno"
msgstr "Pocas"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
-#, fuzzy
msgid "GIBS^Many"
-msgstr "Muchas"
+msgstr "Muchos"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
-#, fuzzy
msgid "GIBS^Lots"
msgstr "Abundante"
msgstr "Daño colateral:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
-msgstr "Aplicar imediatamente"
+msgstr "Aplicar inmediatamente"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
msgid "Waypoints"
msgid "Draw 1st person weapon model"
msgstr "Dibujar modelo de arma en primera persona"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Alinear a la izquierda"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Alinear a la derecha"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Invertir vista horizontalmente"
msgid "Music:"
msgstr "Musica:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Ambiente:"
msgid "Info:"
msgstr "Información:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Items:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Dolor:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Jugador:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Disparos:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Voz:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Armas:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frecuencia:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Canales:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Intercambiar Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Modo para auricular"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Voces espaciales:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "Ninguno"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
-msgstr "bromas"
+msgstr "Provocaciones"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "Todos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Nivel de taunts:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
-msgstr "Bien corto"
+msgstr "Muy corto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Corto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Normal"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Alto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Total"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Taunts Automatico"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Aviso de tiempo:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Ninguno"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minuto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minutos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "Ambos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Indicador de tiro acertado"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Sonidos del menú"
msgstr "Predefinición de calidad:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
-#, fuzzy
msgid "PRE^OMG!"
msgstr "OMG!"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
-#, fuzzy
msgid "PRE^Low"
msgstr "Bajo"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
-#, fuzzy
msgid "PRE^Medium"
msgstr "Media"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
-#, fuzzy
msgid "PRE^Normal"
msgstr "Normal"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
-#, fuzzy
msgid "PRE^High"
msgstr "Alta"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
-#, fuzzy
msgid "PRE^Ultra"
msgstr "Ultra"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
-#, fuzzy
msgid "PRE^Ultimate"
msgstr "Máxima"
msgstr "Detalles geométricos:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
-#, fuzzy
msgid "DET^Lowest"
msgstr "Mínimo"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
-#, fuzzy
msgid "DET^Low"
msgstr "Bajo"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
-#, fuzzy
msgid "DET^Normal"
msgstr "Normal"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
-#, fuzzy
msgid "DET^Good"
msgstr "Bueno"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
-#, fuzzy
msgid "DET^Best"
msgstr "Mejor"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
-#, fuzzy
msgid "DET^Insane"
msgstr "Insano"
msgstr "Antialiasing:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
-#, fuzzy
msgid "AA^Disabled"
msgstr "Deshabilitado"
msgstr "Resolución de textura:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
-#, fuzzy
msgid "RES^Leet"
msgstr "Leet"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
-#, fuzzy
msgid "RES^Lowest"
msgstr "Mínimo"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
-#, fuzzy
msgid "RES^Low"
msgstr "Bajo"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
-#, fuzzy
msgid "RES^Normal"
msgstr "Normal"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
-#, fuzzy
msgid "RES^Good"
msgstr "Bueno"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
-#, fuzzy
msgid "RES^Best"
msgstr "Mejor"
msgstr "Filtro Anisotrópico:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
-#, fuzzy
msgid "ANISO^Disabled"
msgstr "Deshabilitado"
msgid "Decals"
msgstr "Símbolos"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Marcas en los jugadores"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distancia:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Tiempo:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Usar lightmaps"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Mapeado Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Brillo"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Despl. de mapeado"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Mapeado Relief"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Reflejos:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Borroso"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Bueno"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Ajustado"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Mostrar superficies"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Sin iluminación dinámica"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Aproximación de flash mezclado"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Iluminación dinámica en tiempo real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Sombras"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Iluminación del mundo en tiempo real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Usar mapa de normales"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Sombras Suaves"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Coronas"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Usar consultas de oclusion"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Bloom"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "High Dynamic Range (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
-msgstr "Distorsión p/ movimiento:"
+msgstr "Difuminado p/ movimiento:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Distorsión por daño:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Difuminado y postprocesamiento ajustado"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Sensibilidad:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Velocidad del puntero:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Filtro del raton"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Invertir eje Y"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Usar entrada de joystick"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Desactivar aceleracion del raton"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"entrar a la consola\" tambien cerrar"
msgstr "Mostrar cuadros por segundo"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Medidor de Velocidad"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (escondido)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nudos"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostrar acelerómetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Escala del acelerómetro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimizar retardo de entrada"
msgstr "Tamaño de Font/UI:"
#: qcsrc/menu/xonotic/dialog_settings_video.c:31
-#, fuzzy
msgid "SZ^Unreadable"
msgstr "Ilegible"
#: qcsrc/menu/xonotic/dialog_settings_video.c:32
-#, fuzzy
msgid "SZ^Tiny"
msgstr "Minuscula"
#: qcsrc/menu/xonotic/dialog_settings_video.c:33
-#, fuzzy
msgid "SZ^Little"
msgstr "Muy pequeña"
#: qcsrc/menu/xonotic/dialog_settings_video.c:34
-#, fuzzy
msgid "SZ^Small"
msgstr "Pequeña"
#: qcsrc/menu/xonotic/dialog_settings_video.c:35
-#, fuzzy
msgid "SZ^Medium"
msgstr "Media"
#: qcsrc/menu/xonotic/dialog_settings_video.c:36
-#, fuzzy
msgid "SZ^Large"
msgstr "Grande"
#: qcsrc/menu/xonotic/dialog_settings_video.c:37
-#, fuzzy
msgid "SZ^Huge"
msgstr "Enorme"
#: qcsrc/menu/xonotic/dialog_settings_video.c:38
-#, fuzzy
msgid "SZ^Gigantic"
msgstr "Gigante"
#: qcsrc/menu/xonotic/dialog_settings_video.c:39
-#, fuzzy
msgid "SZ^Colossal"
msgstr "Colossal"
msgstr "Vertex Buffer Objects (VBOs)"
#: qcsrc/menu/xonotic/dialog_settings_video.c:59
-#, fuzzy
msgid "VBO^Off"
msgstr "Desactivado"
msgstr "Profundidad primero:"
#: qcsrc/menu/xonotic/dialog_settings_video.c:69
-#, fuzzy
msgid "DF^Disabled"
msgstr "Desactivado"
#: qcsrc/menu/xonotic/dialog_settings_video.c:70
-#, fuzzy
msgid "DF^World"
msgstr "Mundo"
#: qcsrc/menu/xonotic/dialog_settings_video.c:71
-#, fuzzy
msgid "DF^All"
msgstr "Todos"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Resaltador de contraste"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Saturacion de color:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Ambiente:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensidad:"
msgid "Singleplayer"
msgstr "Jugador"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
-msgstr "Accion instantanea! (Mapa aleatorio con bots)"
+msgstr "¡Accion instantanea! (Mapa aleatorio con bots)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
-msgstr "Comenzar!"
+msgstr "¡Comenzar!"
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
msgid "Winner"
#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
msgid "Do not press this button again!"
-msgstr "No vuelva a presionar este boton!"
+msgstr "¡No vuelva a presionar este boton!"
#: qcsrc/menu/xonotic/maplist.c:278
msgid ""
msgid "Bookmark"
msgstr "Marcador"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Nombre del Host"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Mapa"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Tipo"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Jugadores"
msgid "<AUTHOR>"
msgstr "<AUTOR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
-#, fuzzy
msgid "VOL^OFF"
msgstr "DESACTIVADO"
#: qcsrc/menu/xonotic/slider_decibels.c:52
-#, fuzzy
msgid "VOL^MAX"
msgstr "MAXIMO"
#: qcsrc/menu/xonotic/util.qc:367
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s TEST BUILD"
#: qcsrc/menu/xonotic/util.qc:432
#, c-format
msgid "Update to %s now!"
-msgstr "Actualizar para %s ahora!"
+msgstr "¡Actualizar para %s ahora!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1ERROR: Se requiere la compresion de texturas, pero no es soportada.\n"
"^1Pueden ocurrir posibles problemas visuales.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Asalto"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Captura la Bandera"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Combate a muerte"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Dominación"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Caza de llave"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Ultimo Sobreviviente"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Embestida"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Carrera"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Carrera CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runamatch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Combate a muerte por equipos"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba Throwing"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fondo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Por Defecto"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Usar por defecto"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Color del equipo:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Activar panel"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s logró autodestruirse con el Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s no se pudo esconder del Crylink de %s"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s estuvo demasiado cerca del Crylink de %s"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s miró de cerca al Crylink de %s"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s no pudo recordar donde dejó su plasma la última vez"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s jugó con plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s acaba de percatarse de la bola azul de %s"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s tuvo un encuentro cercano con la bola azul de %s"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s sintió el aire electrificante del combo de %s"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s estuvo demasiado cerca del rayo azul de %s"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s estuvo en estado critico por el rayo azul de %s"
msgid "Mortar"
msgstr "Mortero"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s probó su propia granada"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s ha detonado"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s no vió la granada de %s"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s casi esquivó la granada de %s"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s se comió la granada de %s"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s jugó con pequeños cohetes"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s esperó que no le reboten misiles de %s"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "%s fue molido por %s"
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s hizo lo imposible"
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s se fué al infierno montado en su laser"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s fue cortado a la mitad por el gauntlet de %s"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "%s fue muerto por el laser de %s"
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s explotó"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s estuvo cerca de la mina de %s"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s casi esquivo la mina de %s"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s caminó encima de la mina de %s"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s ahora está \"thinking with portals\""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "%s ha sido vaporizado por %s"
msgid "%s felt %s doing the impossible to him"
msgstr "%s sintió a %s hacer lo imposible por él/ella"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Rifle"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s se disparó a si mismo"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s se disparó a si mismo"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s no logró esconderse del granizo de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s murió en el granizo de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s no logró esconderse del rifle de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s fué disparado en la cabeza por %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s fué disparado con un rifle por %s"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Rocket Launcher"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s estuvo demasiado cerca del cohete de %s"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s casi esquivó el cohete de %s"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s se comió el misil de %s"
msgid "Shotgun"
msgstr "Escopeta"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$s ^7abofeteó %1$s ^7con una gran ^2shotgun"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "%s fue tiroteado por %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s se disparó a si mismo"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s se disparó a si mismo"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s no logró esconderse del granizo de balas de %s"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s murió en el granizo de balas de %s"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s no logró esconderse del rifle de %s"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s fué disparado en la cabeza por %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s fué disparado con un rifle por %s"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr "%s se lastimó sus propios oídos con la Tuba de @!#%%"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr "%s murió por la gran interpretación de Tuba de @!#%%"
#, c-format
msgid "%s was riddled full of holes by %s"
msgstr "%s fue totalmente acribillado por %s"
-
-#~ msgid "%s ran into %s's flac"
-#~ msgstr "%s se cruzó con el flac de %s"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "configuración de puntos de camino:"
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
msgstr ""
"Project-Id-Version: 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Henry 'Exitium' Sanmark <henry.sanmark@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "omavalintainen"
#: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
msgid "^4MQC Build information: ^1%s\n"
-msgstr "^4MQC Version tiedot: %s\n"
+msgstr "^4MQC Version tiedot: ^1%s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
"player name to get started. You can change these options later through the "
"menu system."
msgstr ""
+"Tervetuloa pelaamaan Xonoticcia! Valitse haluamasi kieli ja pelaajanimesi "
+"aloittaaksesi. Voit vaihtaa näitä asetuksia jälkikäteen pelin asetuksista."
#: qcsrc/menu/xonotic/dialog_firstrun.c:38
#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
msgid "Show only current ammo type"
msgstr "Näytä vain nykyinen ammustyyppi"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Kuvakkeen kohdistus:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Vasen"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Oikea"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Keskeiskirjoitus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Viestien kesto:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Sisääntulon häivennyksen kesto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Käännä ilmoitusjärjestys"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Tekstin kohdistus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Keskus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Fontin skaala:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Keskustelupaneeli"
msgid "Entry fadetime:"
msgstr "Sisääntulon häivennyksen kesto"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Fysiikkapaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneeli pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Paneeli päälle"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Paneeli päällä kun katsojana"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Paneeli käytössä vain kilpajuoksuissa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Tilapalkki"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Vasen tasaus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Oikea tasaus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Sisäänpäin kohditus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Ulospäin kohdistus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Vaihda nopeuden/kiihtyvyyden paikkaa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Nopeus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Huomioi pystysuora nopeus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Nopeuden mittayksikkö:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "knots"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Näytä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Huippunopeus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Kiihtyvyys:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Huomioi pystysuora kiihtyvyys"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Tehonlisäyspaneeli"
msgid "Pressed Keys Panel"
msgstr "Painettujen näppäinten paneeli"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Paneeli pois päältä"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Paneeli päällä kun katsojana"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Alpha:"
msgid "Score Panel"
msgstr "Tulospaneeli"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Tulos:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Tilastot:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Ja minä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Muokkaamaton"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Ajastinpaneeli"
msgid "Fade effect:"
msgstr "Himmennyseffekti:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "EF^Ei mikään"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Liukuminen"
msgid "Alpha"
msgstr "Alpha"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "EF^Molemmat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Aseiden kuvakkeet:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Näytä aseen tunniste:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "SHOWAS^Ei mitään."
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Numero"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Näppäin"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Näytä tarkkuus"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Näytä panokset"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Ammuskotelon väri"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Ammuskotelon alpha"
msgid "Panel background defaults:"
msgstr "Paneelin taustan perusasetukset:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Tausta:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Pois päältä"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Väri:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Reunan koko:"
msgid "Team color:"
msgstr "Joukkueen väri:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Kokeile joukkueen väriä muokkaustilassa"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Pehmustus:"
msgid "Player Setup"
msgstr "Pelaajan asetukset"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Pelityyppi"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Ottelun asetukset"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Aikaraja"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Käytä kartan omaa oletusarvoa"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Pisteraja:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Pelaajamäärä:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Bottien lukumäärä:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Bottien taitotaso:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Typerä kone"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Aloittelija"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Helppo voitto"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Helpohko"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Keskitaso"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Kehittynyt"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Ekspertti"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Mestari"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Murhaaja"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Epäinhimillinen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Jumalainen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Muokkaukset..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Edistyneet asetukset..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Karttalista"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Valitse kaikki"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Poista kaikki valinnat"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Aloita moninpeli!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Lipunryöstöraja"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Elämät:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Kierrokset:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Maalit:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Tapporaja:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
msgid "Virtual friendly fire (effect only)"
-msgstr "Virtuaalinen joukkuevahinko (vain effekti)"
+msgstr "Virtuaalinen joukkuevahinko (vain efekti)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
msgid "Friendly fire penalty:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
msgid "Virtual penalty (effect only)"
-msgstr "Virtuaalinen rangaistus (vain effekti)"
+msgstr "Virtuaalinen rangaistus (vain efekti)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
msgid "Teams:"
msgid "Game types:"
msgstr "Pelityypit:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Sulje"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Pelaa"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Aikademo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Pelaa"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Liity"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
#, c-format
msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d vapaata pelaajapaikkaa"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
#, c-format
msgid "%d modified settings"
-msgstr "%d muokatut asetukset"
+msgstr "%d muokattua asetusta"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
msgid "Official settings"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
msgid "CA:"
-msgstr "Lipunryöstö (CTF)"
+msgstr "CA:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
msgid "Key:"
-msgstr "Avain (Key)"
+msgstr "Avain:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
msgid "Encryption:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
msgid "Model:"
-msgstr "Malli:"
+msgstr "Hahmo:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
msgid "Field of view:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
msgid "By health"
-msgstr ""
+msgstr "Elämän mukaan"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-#, fuzzy
msgid "Custom"
-msgstr "omavalintainen"
+msgstr "Omavalintainen"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
msgid "Enable center dot"
-msgstr "Ota keskipiste käyttöön"
+msgstr "Ota tähtäin käyttöön"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
msgid "Size:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
msgid "Enter HUD editor"
-msgstr "Mene näkymän muokkaimeen"
+msgstr "Muokkaa näkymää"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
msgid "Force models:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
msgid "Damage splash:"
-msgstr "Vahinkoroiskeet"
+msgstr "Veriroiskeet"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Ota heti käyttöön"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
msgid "Waypoints"
-msgstr "Välimatkat"
+msgstr "Välietapit"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
msgid "Show base waypoints"
-msgstr "Näytä päämäärien välimatkat"
+msgstr "Näytä tukikohtien välimatkat"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
msgid "Waypoint scale:"
-msgstr "Välimatkan skaala:"
+msgstr "Välietappien skaala:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
msgid "Waypoint alpha:"
-msgstr "Välimatkojen alpha:"
+msgstr "Välietappien alpha:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
msgid "Show names:"
msgid "Draw 1st person weapon model"
msgstr "Piirrä ensimmäisen persoonan asemalli"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Vasen tasaus"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Oikea tasaus"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Käännä näkymä horisontaalisesti"
msgid "Music:"
msgstr "Musiikki:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "VOL^Ympäristö:"
msgid "Info:"
msgstr "Tiedoitukset:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Esineet:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Kipu:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Pelaaja:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Laukaukset:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Puhe:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Aseet:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Taajuus:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 Khz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Kanavat:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
-msgstr ""
+msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Vaihda stereoäänilähteiden paikkaa"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Kuulokeystävällinen tila"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Tilanneäänet:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "VOCS^Ei mitään"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "VOCS^Huudahdukset"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "VOCS^Kaikki"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Huudahduksen kantama"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "RNG^Hyvin lyhyt"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "RNG^Lyhyt"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "RNG^Normaali"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "RNG^Pitkä"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "RNG^Täysi"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Automaattiset huudahdukset"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Aikavaroitus:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "WRN^Ei mitään"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minuutti"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minuuttia"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "WRN^Molemmat"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Osumailmaisin"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Valikon äänet"
msgid "Decals"
msgstr "Siirtokuvat"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Hahmojen siirtokuvat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Etäisyys:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
-msgstr "Aika:"
+msgstr "Kesto:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Käytä valaistuksia"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Pikselikohtainen valaistus"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Kiilto"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Korosta tekstuurien kuhmuja"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Tehokas tekstuurien kuhmujen korostus"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Heijastukset:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Sumea"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "REFL^Hyvä"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Terävä"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Näytä pinnat"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Ei dynaamista valaistusta"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Yksinkertaiset valot"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Reaaliaikainen dynaaminen valaitus"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Varjot"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Reaaliaikainen ympäristön valaistus"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Käytä tekstuurien suunnattua varjostamista"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Pehmeät varjot"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Valokehät"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Käytä Occlusion Queryä"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Hehku"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "HDR"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Liikesumeus:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Vahinkosumeus:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Sumenna ja terävöitä jälkikäsittelyä"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Herkkyys:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Käyttöliittymän hiiren nopeus:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Hiiren suodatin"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Käännä hiiren suunta"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Käytä peliohjainta"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Laita käyttöjärjestelmän hiiren kiihtyvyys pois päältä"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"avaa komentorivi\" myös sulkee komentorivin"
msgstr "Näytä ruudunpäivitysnopeus (FPS)"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Nopeusmittari"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (kätketty)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "knots"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Näytä kiihtyvyysmittari"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Kiihtyvyysmittarin skaala:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimoi syötteen viive"
#: qcsrc/menu/xonotic/dialog_settings_video.c:46
msgid "Vertical Synchronization"
-msgstr "VSYNC"
+msgstr "Pystytahdistus (VSYNC)"
#: qcsrc/menu/xonotic/dialog_settings_video.c:49
msgid "Use OpenGL 2.0 shaders (GLSL)"
#: qcsrc/menu/xonotic/dialog_settings_video.c:67
msgid "Depth first:"
-msgstr "Syvyys ensin (Depth First):"
+msgstr "Syvyyssuuntainen renderöinti:"
#: qcsrc/menu/xonotic/dialog_settings_video.c:69
msgid "DF^Disabled"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Kontrastin lisäys:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Kylläisyys:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "LIT^Ympäristö:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensiivisyys:"
msgid "Singleplayer"
msgstr "Yksinpeli"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Suoraan taisteluun! (satunnainen kartta bottien kera)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Aloita yksinpeli!"
msgid "Bookmark"
msgstr "Kirjanmerkki"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Viive"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Palvelimen nimi"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Kartta"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Tyyppi"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Pelaajat"
msgid "<AUTHOR>"
msgstr "<AUTHOR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "VOL^OFF"
#: qcsrc/menu/xonotic/util.qc:367
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s TESTIVERSIO"
#: qcsrc/menu/xonotic/util.qc:432
#, c-format
msgid "Update to %s now!"
msgstr "Päivitä versioon %s nyt!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1VIRHE: Tekstuurien pakkaus vaaditaan mutta ei ole tuettuna.\n"
"^1Grafiikkavirheitä odotettavissa.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
-msgstr "Areena"
+msgstr "Areena (Arena)"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Rynnäkkö (Assault)"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Lipunryöstö (CTF)"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Klaaniareena (Clan Arena)"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Mättö (Deathmatch)"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Hallinta (Domination)"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Pakkashippa (Freeze Tag)"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Pakomatka (Keepaway)"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
-msgstr "Avaimenmetsästys (Key Hunt)"
+msgstr "Avaimenetsintä (Key Hunt)"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Viimeiseen mieheen (Last Man Standing)"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexpallo (Nexball)"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Suurtaistelu (Onslaught)"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Kilpailu (RACE)"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
-msgstr "Kilpailu CTS"
+msgstr "Kilpailu CTS (RACE CTS)"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Riimu-ottelu (Runematch)"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Joukkuemättö (Team Deatchmatch)"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#% tuubanheitto!"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Tausta:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Perusasetus"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Käytä perusasetusta"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Joukkueen väri"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Ota paneeli käyttöön"
#: qcsrc/server/w_crylink.qc:2
msgid "Crylink"
-msgstr ""
+msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr ""
+msgstr "%s hautoi itsetuhoisia ajatuksia Crylink kädessä"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
-msgstr ""
+msgstr "%s ei kyennyt pakenemaan pelaajan %s Crylinkkiä"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
-msgstr ""
+msgstr "%s oli liian lähellä pelaajan %s ampumarataa"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
-msgstr ""
+msgstr "%s pääsi tutustumaan lähemmin pelaajan %s kauniiseen Crylinkkiin"
#: qcsrc/server/w_electro.qc:2
msgid "Electro"
-msgstr ""
+msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
-msgstr ""
+msgstr "%s ei sattunut muistamaan minne se plasma oikein kuuluikaan"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
-msgstr ""
+msgstr "%s leikki plasmalla, ei hyvä"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
-msgstr ""
+msgstr "%s näki pelaajan %s sinisen pallon"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
-msgstr ""
+msgstr "%s pääsi tutustumaan pelaajan %s siniseen palloon"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
-msgstr ""
+msgstr "%s tunsi sähköä ilmassa pelaajan %s tulituksen jälkeen"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
-msgstr ""
+msgstr "%s joutui liian lähelle pelaajan %s sinistä sädettä"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
-msgstr ""
+msgstr "%s posahti pelaajan %s siniseen säteeseen"
#: qcsrc/server/w_fireball.qc:2
-#, fuzzy
msgid "Fireball"
-msgstr "Nexpallo (Nexball)"
+msgstr "Fireball"
#: qcsrc/server/w_fireball.qc:417
#, c-format
msgid "%s forgot about some firemine"
-msgstr ""
+msgstr "%s unohti tulimiinansa"
#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
#, c-format
msgid "%s should have used a smaller gun"
-msgstr ""
+msgstr "%s olisi pitänyt käyttää pienempää asetta"
#: qcsrc/server/w_fireball.qc:426
#, c-format
msgid "%s tried to catch %s's firemine"
-msgstr ""
+msgstr "%s koetti napata pelaajan %s tulimiinan"
#: qcsrc/server/w_fireball.qc:428
#, c-format
msgid "%s fatefully ignored %s's firemine"
-msgstr ""
+msgstr "%s kohtalokkaasti tutustui pelaajan %s tulimiinaan"
#: qcsrc/server/w_fireball.qc:435
#, c-format
msgid "%s could not hide from %s's fireball"
-msgstr ""
+msgstr "%s ei kyennyt pakenemaan pelaajan %s tulipalloa"
#: qcsrc/server/w_fireball.qc:437
#, c-format
msgid "%s saw the pretty lights of %s's fireball"
-msgstr ""
+msgstr "&s näki kauniita valoja pelaajan %s tulipallosta"
#: qcsrc/server/w_fireball.qc:440
#, c-format
msgid "%s got too close to %s's fireball"
-msgstr ""
+msgstr "%s joutui turhan lähelle pelaajan %s tulipalloa"
#: qcsrc/server/w_fireball.qc:442
#, c-format
msgid "%s tasted %s's fireball"
-msgstr ""
+msgstr "%s maistoi pelaajan %s tulipalloa"
#: qcsrc/server/w_grenadelauncher.qc:2
msgid "Mortar"
-msgstr ""
+msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
-msgstr ""
+msgstr "%s testasi räjähtääkö oma kranaatti"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
-msgstr ""
+msgstr "%s pössähti"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
-msgstr ""
+msgstr "%s ei nähnyt pelaajan %s kranaattia"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
-msgstr ""
+msgstr "%s väisti melkein pelaajan %s kranaatin"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
-msgstr ""
+msgstr "%s söi pelaajan %s kranaatin"
#: qcsrc/server/w_hagar.qc:2
msgid "Hagar"
-msgstr ""
+msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
-msgstr ""
+msgstr "%s leikki pienien rakettien kanssa"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr ""
+msgstr "%s toivoi ettei pelaajan %s raketit olisi kimmonneet"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
-msgstr ""
+msgstr "%s joutui pelaajan %s nuijimaksi"
#: qcsrc/server/w_hlac.qc:2
msgid "Heavy Laser Assault Cannon"
-msgstr ""
+msgstr "HLAC"
#: qcsrc/server/w_hlac.qc:242
#, c-format
msgid "%s was cut down by %s"
-msgstr ""
+msgstr "%s joutui pelaajan %s niittämäksi"
#: qcsrc/server/w_hook.qc:2
-#, fuzzy
msgid "Grappling Hook"
-msgstr "Köysi"
+msgstr "Grabbling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
-msgstr ""
+msgstr "%s teki mahdottomat"
#: qcsrc/server/w_hook.qc:268
#, c-format
msgid "%s has run into %s's gravity bomb"
-msgstr ""
+msgstr "%s juoksi pelaajan %s pommiin"
#: qcsrc/server/w_laser.qc:2
msgid "Laser"
-msgstr ""
+msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
-msgstr ""
+msgstr "%s lähetti itsensä laserilla helvettiin"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
-msgstr ""
+msgstr "%s leikkaantui kahtia pelaajan %s taisteluhansikkaaseen"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
-msgstr ""
+msgstr "%s kuoli pelaajan %s laseriin"
#: qcsrc/server/w_minelayer.qc:2
-#, fuzzy
msgid "Mine Layer"
-msgstr "Yksinpeli"
+msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
-msgstr ""
+msgstr "%s räjähti"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
-msgstr ""
+msgstr "%s joutui liian lähelle pelaajan %s miinaa"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
-msgstr ""
+msgstr "%s miltein väisti pelaajan %s miinan"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
-msgstr ""
+msgstr "%s astui pelaajan %s miinaan"
#: qcsrc/server/w_minstanex.qc:2
-#, fuzzy
msgid "MinstaNex"
-msgstr "MinstaGib"
+msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s kokee portaalit"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
-msgstr ""
+msgstr "%s höyrystyi pelaajan %s toimesta"
#: qcsrc/server/w_nex.qc:2
-#, fuzzy
msgid "Nex"
-msgstr "Nexpallo (Nexball)"
+msgstr "Nex"
#: qcsrc/server/w_porto.qc:2
msgid "Port-O-Launch"
-msgstr ""
+msgstr "Port-O-Launch"
#: qcsrc/server/w_porto.qc:298
#, c-format
msgid "%s felt %s doing the impossible to him"
-msgstr ""
+msgstr "%s tunsi kuinka pelaaja %s teki hänelle mahdottoman tempun"
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr ""
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Rifle"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
#, c-format
-msgid "%s got too close to %s's rocket"
-msgstr ""
+msgid "%s shot themself automatically"
+msgstr "%s ampui itsensä täysin omatoimisesti"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
#, c-format
-msgid "%s almost dodged %s's rocket"
-msgstr ""
+msgid "%s sniped themself somehow"
+msgstr "%s onnistui jotenkin ampumaan omaan jalkaansa"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
#, c-format
-msgid "%s ate %s's rocket"
-msgstr ""
-
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr ""
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s ei kyennyt pakenemaan pelaajan %s luotisadetta"
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:244
#, c-format
-msgid "%s was tagged by %s"
-msgstr ""
+msgid "%s died in %s's bullet hail"
+msgstr "%s kuoli pelaajan %s luotisateeseen"
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Laukaukset:"
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s ei kyennyt piiloutumaan pelaajan %s kivääriä"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr ""
+msgid "%s got hit in the head by %s"
+msgstr "%s sai päähänsä reiän pelaajan %s toimesta"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
#, c-format
-msgid "%s was gunned by %s"
-msgstr ""
+msgid "%s was sniped by %s"
+msgstr "%s ammuttiin alas, kuolonlaukauksen tarjosi %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr ""
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
-#: qcsrc/server/w_rifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
-msgid "%s shot themself automatically"
-msgstr ""
+msgid "%s got too close to %s's rocket"
+msgstr "%s joutui liian lähelle pelaajan %s rakettia"
-#: qcsrc/server/w_rifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
-msgid "%s sniped themself somehow"
-msgstr ""
+msgid "%s almost dodged %s's rocket"
+msgstr "%s miltein väisti pelaajan %s raketin"
-#: qcsrc/server/w_rifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr ""
+msgid "%s ate %s's rocket"
+msgstr "%s söi pelaajan %s raketin"
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr ""
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
-#: qcsrc/server/w_rifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr ""
+msgid "%s was tagged by %s"
+msgstr "%s joutui pelaajan %s leimaamaksi ja tuhoamaksi"
-#: qcsrc/server/w_rifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
-msgid "%s got hit in the head by %s"
-msgstr ""
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr "%2$s ^7murjoi pelaajaa %1$s ^2haulikon tylpällä päällä"
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
-msgid "%s was sniped by %s"
-msgstr ""
+msgid "%s was gunned by %s"
+msgstr "%s ammuttiin alas pelaajan %s toimesta"
#: qcsrc/server/w_tuba.qc:2
-#, fuzzy, c-format
+#, c-format
msgid "@!#%'n Tuba"
-msgstr "@!#% tuubanheitto!"
+msgstr "@!#% tuuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
-msgstr ""
+msgstr "%s tärykalvot räjähti, kun hän soitteli @!#%% tuubaa"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
+"%s kuoli ihastuksesta kuullessaan pelaajan %s kaunista @!#%% tuubansoittoa"
#: qcsrc/server/w_uzi.qc:2
msgid "Machine Gun"
-msgstr ""
+msgstr "Machine Gun"
#: qcsrc/server/w_uzi.qc:323
#, c-format
msgid "%s was riddled full of holes by %s"
-msgstr ""
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Välimatkojen asetukset:"
-
-#~ msgid ""
-#~ "Please answer a few initial questions to enhance the game experience."
-#~ msgstr ""
-#~ "Ole hyvä ja vastaa muutamaan alustavaan kysymykseen parantaaksesi "
-#~ "pelikokemustasi."
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
+msgstr "%s sai muutaman uuden ilmanvaihtoreiän, kun %s tarjosi niitä"
msgstr ""
"Project-Id-Version: Xonotic 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
-"PO-Revision-Date: 2011-03-09 15:48-0500\n"
-"Last-Translator: Maxime Paradis <taximus.micro@gmail.com>\n"
-"Language-Team: French <kde-i18n-doc@kde.org>\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"PO-Revision-Date: 2011-08-23 18:51-0400\n"
+"Last-Translator: \n"
+"Language-Team: \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "personnalisé"
#: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
msgid "^4MQC Build information: ^1%s\n"
-msgstr "^4MQC Build information : %s (français)\n"
+msgstr "^4MQC Information de version : %s (français)\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Ne montrer que le type de munition actuel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Aligner l'icône"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Gauche"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Droite"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Écriture du centre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Durée du message:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Temps d'effacement d'une entrée:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Inverser l'ordre des notifications"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alignement icônes:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Taille de police:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Panneau de Chat"
msgid "Entry fadetime:"
msgstr "Temps d'effacement d'une entrée:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Panneau d'effets physiques"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panneau désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panneau activé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panneau activé même en spectateur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panneau activé seulement en Race/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barre de statut"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "À gauche"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "À droite"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Aligner vers l'intérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Aligner vers l'extérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Échanger positions Vitesse/Accélération"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Vitesse:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Inclure vitesse verticale"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unité de vitesse"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "noeuds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Montrer"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Vitesse maximale:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Accélération:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Inclure accélération verticale"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Panneau des Pouvoirs"
msgid "Pressed Keys Panel"
msgstr "Panneau Touches Pressées"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panneau désactivé"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Panneau activé en spectateur"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Opacité:"
msgid "Score Panel"
msgstr "Tableau des scores"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Score:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Rangs:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Et moi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Pure"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Chronomètre"
msgid "Fade effect:"
msgstr "Effet d'effacement:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "Aucun"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Glisse"
msgid "Alpha"
msgstr "Opacité"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Les deux"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Icônes d'armes:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Montrer le numéro d'arme:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "Aucun"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Numéro"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Touche"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Monter la précision"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Montrer barre de munitions"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Couleur barre de munitions:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Opacité barre de munitions:"
msgid "Panel background defaults:"
msgstr "Fond du Panneau par défaut:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Arrière-plan:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Désactiver"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Couleur:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Taille des bords:"
msgid "Team color:"
msgstr "Couleur d'équipe:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Afficher la couleur d'équipe en mode configuration"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Ajustement:"
msgstr "Contour interface:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-#, fuzzy
msgid "DOCK^Disabled"
msgstr "Désactivé"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-#, fuzzy
msgid "DOCK^Small"
msgstr "Petit"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-#, fuzzy
msgid "DOCK^Medium"
msgstr "Moyen"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-#, fuzzy
msgid "DOCK^Large"
msgstr "Grand"
msgid "Player Setup"
msgstr "Paramètres Joueur"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Mode de jeu:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Paramètres match:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Limite de temps:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Utiliser le paramètre de carte"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Limite de points:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Nombre de joueurs max.:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Nombre de robots:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Difficulté robot:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Nul"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Jeu d'enfant"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Très Facile"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Facile"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Assez Facile"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Avancé"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Expert"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Professionnel"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Assassin"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Inhumain"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Dieu"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Spéciales..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Paramètres avancés..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Liste de cartes:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Tout sélectionner"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Ne rien sélectionner"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Démarrer!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Limite de captures:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Vies:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Tours:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Buts:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Limite de tués:"
msgid "Game types:"
msgstr "Modes de jeux:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Fermer"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Jouer"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Test Performance"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Jouer"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Joindre"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
#, c-format
msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d Emplacements libres"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
#, c-format
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
msgid "By health"
-msgstr ""
+msgstr "Par vie"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-#, fuzzy
msgid "Custom"
-msgstr "personnalisé"
+msgstr "Personnalisé"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
msgid "Enable center dot"
msgstr "Effet santé faible:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Appliquer maintenant"
msgid "Draw 1st person weapon model"
msgstr "Afficher l'arme à la première personne"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "À gauche"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "À droite"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Vue Miroir"
msgid "Music:"
msgstr "Musique:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Ambiance:"
msgid "Info:"
msgstr "Information:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Objets:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Douleur:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Joueur:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Tirs:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Voix:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Armes:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Fréquence:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Canaux:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stéréo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Échanger les canaux Stéréo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Mode casque audio"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Voix personnages:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "Aucun"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "Voix"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "Tout"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Distance voix:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "Très court"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Court"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Normal"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Long"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Tout"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Voix automatiques"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Avertissement temps:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Aucun"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minute"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minutes"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "Les deux"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Son tir réussi"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Sons du menu"
msgid "Decals"
msgstr "Marques impacts"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Décalques sur les modèles"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distance max.:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Temps:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Utiliser les lightmaps"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Textures Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Brillance textures"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Textures relief"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Textures relief avancé"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Réflexions:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Flou"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Bon"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Net"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Textures unies"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Pas de lumières dynamiques"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Lumières dynamiques rapides"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Lumières dynamiques en temps réel"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Ombres"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Lumières carte en temps réel"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Lumières Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Ombres avancées"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Brillance Lumière"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Utiliser l'Occlusion du rendu"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Effets d'éblouissement"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "High Dynamic Range (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Flou de vitesse:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Flou de dégâts:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Flou et netteté post-processeur"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Sensibilité:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Vitesse souris menus:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Filtre Souris"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Inverser souris (axe Y)"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Utiliser une manette"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Désactiver l'accélération souris de l'OS"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"ouvrir la console\" ferme aussi la console"
msgstr "Montrer les Images Par Seconde"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Speedomètre"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (caché)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "noeuds"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Montrer l'accéléromètre"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Taille accéléromètre:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimiser la latence des contrôles"
msgstr "Utiliser GLSL pour gérer les couleurs"
#: qcsrc/menu/xonotic/dialog_settings_video.c:56
-#, fuzzy
msgid "Vertex Buffer Objects (VBOs)"
msgstr "Objets en tampon mémoire (VBOs)"
#: qcsrc/menu/xonotic/dialog_settings_video.c:59
-#, fuzzy
msgid "VBO^Off"
msgstr "Désactivé"
msgstr "Points et Triangles"
#: qcsrc/menu/xonotic/dialog_settings_video.c:67
-#, fuzzy
msgid "Depth first:"
-msgstr "Fixeur profondeur:"
+msgstr "Profondeur d'abord:"
#: qcsrc/menu/xonotic/dialog_settings_video.c:69
-#, fuzzy
msgid "DF^Disabled"
msgstr "Désactivé"
#: qcsrc/menu/xonotic/dialog_settings_video.c:70
-#, fuzzy
msgid "DF^World"
-msgstr "Carte"
+msgstr "Monde"
#: qcsrc/menu/xonotic/dialog_settings_video.c:71
-#, fuzzy
msgid "DF^All"
msgstr "Tout"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Amélioration contraste:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Saturation:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Ambiance:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensité:"
msgid "Singleplayer"
msgstr "Monojoueur"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Instant action! (map aléatoire avec bots)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Démarrer !"
msgid "Bookmark"
msgstr "Marque-page"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Latence"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Nom d'Hôte"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Carte"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Mode"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Joueurs"
msgid "<AUTHOR>"
msgstr "<AUTEUR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "OFF"
#: qcsrc/menu/xonotic/util.qc:367
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "VERSION DE TEST ^1%s"
#: qcsrc/menu/xonotic/util.qc:432
#, c-format
msgid "Update to %s now!"
msgstr "Mettez à jour vers %s maintenant !"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1ERROR: La texture de compression est nécessaire mais non supportée.\n"
"^1Attendez vous à voir des problèmes de rendu.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arène Duel"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Assaut"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Capture Du Drapeau"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Arène Équipes"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Match à Mort"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Domination"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Cache-Cache Du Drapeau"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Chasse aux Clés"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Dernier Survivant"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Course"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Course CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Match à Mort Équipe"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "Lancer de @!#%'n Tuba"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Arrière-plan:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Par défaut"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Par défaut"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Couleur d'équipe:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Activer ce panneau"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s a réussi à se suicider avec le Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s n'a pas pu se cacher du Crylink de %s"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s a été trop près du Crylink de %s"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s a voulu voir se qui se trouvait dans le Crylink de %s"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s ne se souvenait pas où il a tiré du plasma"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s a joué avec du plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s vient de remarquer la boule plasma de %s"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s s'est fait toucher par la boule plasma de %s"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s se sent électrisé par le combo de %s"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s a été trop près du rayon plasma de %s"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s a été désintégré à cause du rayon plasma de %s"
#: qcsrc/server/w_fireball.qc:2
-#, fuzzy
msgid "Fireball"
-msgstr "Fireball"
+msgstr "Boule de Feu"
#: qcsrc/server/w_fireball.qc:417
#, c-format
msgid "Mortar"
msgstr "Mortier"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s a mangé sa propre grenade"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s a fait boum"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s n'a pas vu la grenade de %s"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s a presque réussi à esquiver la grenade de %s"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s a mangé la grenade de %s"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s a joué avec des petits missiles"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s a pensé que les petits missiles de %s ne rebondissaient pas"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "%s a trop mangé de mini-missiles de la part de %s"
msgstr "%s s'est fait couper par %s"
#: qcsrc/server/w_hook.qc:2
-#, fuzzy
msgid "Grappling Hook"
msgstr "Grappin"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s a fait l'impossible"
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s s'est suicidé au laser"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s s'est fait couper en deux par le laser de %s"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "%s a été désintégré par le laser de %s"
#: qcsrc/server/w_minelayer.qc:2
-#, fuzzy
msgid "Mine Layer"
msgstr "Lance-Mines"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s a explosé"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s s'est trop approché de la mine de %s"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s a presque esquivé la mine de %s"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s a marché sur la mine de %s"
#: qcsrc/server/w_minstanex.qc:2
-#, fuzzy
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s pense maintenant avec les portails"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "%s s'est fait vaporiser par %s"
#: qcsrc/server/w_nex.qc:2
-#, fuzzy
msgid "Nex"
msgstr "Nex"
msgid "%s felt %s doing the impossible to him"
msgstr "%s a eu tort de prendre le portail de %s"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Fusil"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s s'est suicidé au sniper"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s a oublié le cran de sûreté en chargeant"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s n'a pas pu se cacher de la nuée de balles de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s est mort de la nuée de balles de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s n'a pas réussi à se cacher du sniper de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s s'est fait décapiter au sniper par %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s s'est fait descendre au sniper par %s"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Lance-Roquettes"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s s'est trop approché de la roquette de %s"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s a presque esquivé la roquette de %s"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s a mangé la roquette de %s"
msgstr "%s s'est fait tagguer par %s"
#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
msgid "Shotgun"
msgstr "Fusil"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$s ^7a baffé %1$s ^7avec un ^2fusil"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "%s s'est fait fusiller par %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Fusil Sniper"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s s'est suicidé au sniper"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s a oublié le cran de sûreté en chargeant"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s n'a pas pu se cacher de la nuée de balles de %s"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s est mort de la nuée de balles de %s"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s n'a pas réussi à se cacher du sniper de %s"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s s'est fait décapiter au sniper par %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s s'est fait descendre au sniper par %s"
-
#: qcsrc/server/w_tuba.qc:2
-#, fuzzy, c-format
+#, c-format
msgid "@!#%'n Tuba"
-msgstr "@!#%'n Tuba"
+msgstr "@!#% Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr "%s s'est fait casser les tympans par son propre tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr "%s n'a pas aimé la musique de %s et en est mort"
msgid "%s was riddled full of holes by %s"
msgstr "%s s'est fait trouer par %s"
-#~ msgid "%s ran into %s's flac"
-#~ msgstr "%s n'a pas eu peur des missiles de %s"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Paramètres Waypoint (flèches 3D sur la carte):"
+#~ msgid "Damage & water blur"
+#~ msgstr "Flou de d�g�ts:"
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
+#~ msgid "Powerup sharpen"
+#~ msgstr "Panneau des Pouvoirs"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "^4MQC Épitési információ: %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Csak az aktuális lőszer típus megjelenítése"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Bal"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Jobb"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+#, fuzzy
+msgid "Message duration:"
+msgstr "Színtelítettség:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+#, fuzzy
+msgid "Fade time:"
+msgstr "Bejegyzés halványulási idő:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+#, fuzzy
+msgid "Flip messages order"
+msgstr "Értesítés rend megfordítás"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+#, fuzzy
+msgid "Text alignment:"
+msgstr "Ikon igazítás:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+#, fuzzy
+msgid "Font scale:"
+msgstr "Útpont részletesség:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Csevely Panel"
msgid "Entry fadetime:"
msgstr "Bejegyzés halványulási idő:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Csevely Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel kikapcsolva"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#, fuzzy
+msgid "Panel enabled"
+msgstr "Panel kikapcsolva"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled even observing"
+msgstr "Panel engedélyezett, ha csak néző vagy"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#, fuzzy
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panel engedélyezve a csapatjátékokban"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Állapotsor engedélyezése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Balra igazítása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Jobbra igazított"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Befelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Kifelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Életerő és páncél poziciójának cseréje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Sebesség (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "csomó"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Lőszer mutatása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Nagyítás sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Tükrözödés:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Powerups Panel"
msgid "Pressed Keys Panel"
msgstr "Lenyomott gombok lapja"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel kikapcsolva"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Panel engedélyezett, ha csak néző vagy"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Alpha:"
msgid "Score Panel"
msgstr "Ponttáblázat"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "VBO^Off"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Időtáblázat"
msgid "Fade effect:"
msgstr "Halványulás hatás:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "EF^Nincs"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Csúszás"
msgid "Alpha"
msgstr "Alpha"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "Mindkettő"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Fegyver ikonok:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "A Fegyver azonosító megjelenítés eszerint:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "Nincs"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Szám"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Hozzárendelés"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Pontosság mutatása"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Lőszer mutatása"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Lőszer jelző színe:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Lőszer jelző alpha:"
msgid "Panel background defaults:"
msgstr "Panel háttér alapértelmezett:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Háttér:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Letiltás"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Szín:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Keret méret:"
msgid "Team color:"
msgstr "Csapat szín:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Csapat szín ellenörzés konfigurációs módban"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Padding:"
msgid "Player Setup"
msgstr "Játékos beállítás"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Játék típus:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Meccs beállítások:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Idő határ:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Térképhez tartozó alapérték használata"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Pont határ:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Összes játékos:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Botok száma:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Botok szintje"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Béna"
# :)))
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Kezdő"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Biztosan te nyersz"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Nyerhetsz"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Még legyőzheted"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Rutinos"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Tapasztalt"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Hivatásos"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Orgyilkos"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Embertelen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Isteni"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutatorok..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Különleges beállítások ..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Térkép lista:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Az összes kiválasztása"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Egyik sem"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Többjátékos indítása"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Rablás határérték:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Életek:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Körök:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Célok:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Frag határérték:"
msgid "Game types:"
msgstr "Játék típusok:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Zárt"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#, fuzzy
+msgid "MAP^Play"
msgstr "Játék"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Demó időmérés"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Játék"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Csatlakozás"
msgstr "Sérülés szórás:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Azonnali alkalmazás"
msgid "Draw 1st person weapon model"
msgstr "1.személyű fegyver modell kirajzolása"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Balra igazítása"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Jobbra igazított"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "A nézet horizontális döntése"
msgid "Music:"
msgstr "Zene:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "VOL^Környezet:"
msgid "Info:"
msgstr "Információ:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Tárgyak:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Fájdalom:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Játékos:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Lövések:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Hang:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Fegyverek:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frekvencia:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11,025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22,05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44,1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Csatornák:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Monó"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Sztereó"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Sztereó megcserélése"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Fejhallgató barát mód"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Térbeli hangok:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "VOCS^Nincs"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "VOCS^Bekiabálások"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "VOCS^Minden"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Bekiabálás terület:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "RNG^Nagyon rövid"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "RNG^Rövid"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "RNG^Normál"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "RNG^Hosszú"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "RNG^Teljes"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Automatikus bekiabálások"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Idő figyelmeztetés:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Nincs"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 perc"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 perc"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "Mindkettő"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Találat jelző"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Menü hangok"
msgid "Decals"
msgstr "Dekorációk"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Távolság:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Idő:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Fénytérképek használata"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Deluxe mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Fényes"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Offset mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Relief mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Tükrözödés:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Homályos"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Refl^Jó"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Éles"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Felületek megjelenítése"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Nincsenek dinamikus fények"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Közelítő villanás keverés"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Valós idejű dinamikus fények"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Árnyékok"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Valós idejű világ fényhatások"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Normál map használata"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Lágy árnyékok"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Fénykörök"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Use Occlusion Queries"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Virágzás"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "Magas dinamika tartomány (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Mozgási elmosás:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Sérülés elmosás:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Érzékenység:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "UI egér sebesség:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Egér szürés"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Forditott egér"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Joystick bemenet használata"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "OS egér gyorsítás kikapcsolása"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"belépés a konzolba\" zár is"
msgstr "A képkocka/s mutatása"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Sebességmérő"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (rejtett)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "csomó"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Gyorsulásmérő mutatása"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Gyorsulásmérő beosztás:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Bemeneti késleltetés minimalizása"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Kontraszt növelés:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Színtelítettség:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Környezet:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Erősség:"
msgid "Singleplayer"
msgstr "Egyjátékos"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Azonnali játék (véletlenszerű pálya botokkal)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Egyjátékos mód indítása"
msgid "Bookmark"
msgstr "Könyvjelző"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Gazda név"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Térkép"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Típus"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Játékosok"
msgid "<AUTHOR>"
msgstr "<SZERZŐ>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "Hangerő ki"
msgid "Update to %s now!"
msgstr "Most frissítsd %s-re!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1Hiba: textúra tömörítés szükséges, de nem támogatott.\n"
"^1Gondok lehetnek a látvánnyal.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Aréna"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Ostrom"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Szerezd meg a zászlót"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Klán Aréna"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Mindenki mindenki ellen"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Uralom"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Kulcs vadászat"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Last Man Standing"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Támadás"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Futam"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Race CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Rúnameccs"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Csapatos öldöklés"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba Dobás"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Háttér:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Alapértelmezett"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Alapértékek használata"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Csapat színe:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Panel engedélyezés"
msgid "Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
msgid "Electro"
msgstr ""
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "Mortar"
msgstr "Előre"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, fuzzy, c-format
msgid "%s detonated"
msgstr "néző"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
msgid "Hagar"
msgstr ""
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
msgid "Grappling Hook"
msgstr "Ragadós horog"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr ""
msgid "Laser"
msgstr "Mester:"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
msgid "Mine Layer"
msgstr "Egyjátékos"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
msgid "MinstaNex"
msgstr "MinstaGib"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
msgid "%s felt %s doing the impossible to him"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
#, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
#, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
#, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:251
#, c-format
-msgid "%s was tagged by %s"
+msgid "%s failed to hide from %s's rifle"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Lövések:"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
#, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
msgstr ""
-#: qcsrc/server/w_rifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
-msgid "%s shot themself automatically"
+msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
-msgid "%s sniped themself somehow"
+msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s ate %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
msgstr ""
-#: qcsrc/server/w_rifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
#, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Lövések:"
+
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
msgstr ""
#: qcsrc/server/w_tuba.qc:2
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba Dobás"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
msgid "%s was riddled full of holes by %s"
msgstr ""
+#, fuzzy
+#~ msgid "Damage & water blur"
+#~ msgstr "Sérülés elmosás:"
+
+#, fuzzy
+#~ msgid "Powerup sharpen"
+#~ msgstr "Powerups Panel"
+
+#~ msgid "Speedometer"
+#~ msgstr "Sebességmérő"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (rejtett)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Gyorsulásmérő mutatása"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Gyorsulásmérő beosztás:"
+
#~ msgid ""
#~ "Please answer a few initial questions to enhance the game experience."
#~ msgstr ""
# Xonotic Menu
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# Copyright (C) 2011 Team Xonotic
# This file is distributed under the same license as the PACKAGE package.
# Felice Sallustio <fel.sallustio@gmail.com>, 2011.
# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.
msgstr ""
"Project-Id-Version: 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-01 13:33+0200\n"
-"PO-Revision-Date: 2011-04-29 16:29+0100\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"PO-Revision-Date: 2011-09-04 01:40+0100\n"
"Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
-"Language-Team: \n"
+"Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
"X-Poedit-Language: Italian\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
#: qcsrc/menu/gamecommand.qc:65
msgid "Usage: menu_cmd command..., where possible commands are:\n"
-msgstr "Uso: menu_cmd command..., dove i possibili comandi sono:\n"
+msgstr "Uso: menu_cmd comando..., dove i possibili comandi sono:\n"
#: qcsrc/menu/gamecommand.qc:66
msgid " sync - reloads all cvars on the current menu page\n"
msgstr "^4MQC Build information: ^1%s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
#: qcsrc/menu/xonotic/dialog_firstrun.c:38
#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
msgid "Text language:"
-msgstr "Lingua testo:"
+msgstr "Lingua di testo:"
#: qcsrc/menu/xonotic/dialog_firstrun.c:47
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
msgid "Show only current ammo type"
msgstr "Mostra solo il tipo corrente di munizioni"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Allinea icone:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Sinistra"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Destra"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Centerprint"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Durata messaggi:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Durata dissolvenza:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Inverti ordine messaggi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Allineamento testo:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Scala testo:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Pannello Chat"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
msgid "Flip notify order"
-msgstr "Inverti ordine delle notifiche"
+msgstr "Inverti ordine notifiche"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
msgid "Entry lifetime:"
msgid "Entry fadetime:"
msgstr "Durata dissolvenza:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Pannello Fisica"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Pannello disabilitato"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Pannello abilitato"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Pannello abilitato anche osservando"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Pannello abilitato solo in Corsa/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barra di stato"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Allinea a sinistra"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Allinea a destra"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Allinea all'interno"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Allinea all'esterno"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Inverti posizioni velocità/accelerazione"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Velocità:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Includi velocità verticale"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unità di velocità:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "nodi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Mostra"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Velocità massima"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Accelerazione:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Includi accelerazione verticale"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Pannello dei Powerup"
msgid "Pressed Keys Panel"
msgstr "Pannello dei tasto premuti"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Pannello disabilitato"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
-msgstr "Pannello abilitato in modalità spettatore"
+msgstr "Pannello abilitato quando spettatore"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Opacità:"
msgid "Score Panel"
msgstr "Pannello punteggio"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Punteggi:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Classifica:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Off"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "E me"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Puro"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Pannello tempo"
msgid "Fade effect:"
msgstr "Effetto dissolvenza:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "EF^Nessuno"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Slide"
msgid "Alpha"
msgstr "Opacità"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "EF^Entrambi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Icone armi:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Mostra ID arma come:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "SHOWAS^Nessuno"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Numero"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
-msgstr "Bind"
+msgstr "Tasto"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Mostra precisione"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Mostra munizioni"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Colore barra munizioni:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Opacità barra munizioni:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
msgid "Panel background defaults:"
-msgstr "Sfondo del pannello predefinito:"
+msgstr "Predefiniti dello sfondo del pannello:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Sfondo:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Disabilita"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Colore:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
-msgstr "Dimensioni del bordo:"
+msgstr "Dimensioni bordo:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
msgid "Team color:"
msgstr "Colore team:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Prova colore team in modalità configurazione"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Riempimento:"
msgid "Player Setup"
msgstr "Setup giocatore"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Tipo di gioco:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Impostazioni partita:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Limite di tempo:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Usa le impostazioni di default della mappa"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
-msgstr "Limiti di punteggio:"
+msgstr "Limite di punteggio:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Posti per giocatori:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Numero di bot:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Abilità bot:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "\"Come un bot\""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Principiante"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Vincerai"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Puoi vincere"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Potresti vincere"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Avanzato"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Esperto"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Pro"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Assassino"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Inumano"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "\"Come un Dio\""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutatori..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Impostazioni avanzate..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Lista delle mappe:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Seleziona tutto"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Deseleziona tutto"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Inizia Multiplayer!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Limite catture:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Vite:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Giri:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Goal:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
-msgstr "Limiti di frag:"
+msgstr "Limite di frag:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
msgid "Advanced server settings"
msgid "Game types:"
msgstr "Tipi di gioco:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Chiudi"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Gioca"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
msgid "Dodging"
-msgstr "Dodging"
+msgstr "Schivamento"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
msgid "Rocket Flying"
-msgstr "Razzo volante"
+msgstr "Volando coi razzi"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
msgid "Timedemo"
msgstr "Timedemo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Riproduci"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Entra"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
msgid "N/A"
-msgstr "N/A"
+msgstr "N/D"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
#, c-format
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
msgid "N/A (can't connect)"
-msgstr "N/A (impossibile connettersi)"
+msgstr "N/D (impossibile connettersi)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
msgid "not supported (can't connect)"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
msgid "View bobbing:"
-msgstr "Ondeggiamento vista:"
+msgstr "Ondeggiamento:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
msgid "Zoom factor:"
-msgstr "Moltiplicatore zoom:"
+msgstr "Fattore zoom:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
msgid "Zoom speed:"
msgstr "Schizzo del danno:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Applica immediatamente"
msgid "Draw 1st person weapon model"
msgstr "Mostra modello arma in 1ª persona"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Allinea a sinistra"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Allinea a destra"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Capovolgi la vista orizzontalmente"
#: qcsrc/menu/xonotic/dialog_quit.c:20
msgid "Yes"
-msgstr "Si"
+msgstr "Sì"
#: qcsrc/menu/xonotic/dialog_quit.c:21
msgid "No"
msgid "Music:"
msgstr "Musica:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "VOL^Ambiente:"
msgid "Info:"
msgstr "Info:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Oggetti:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Dolore:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Giocatore:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Spari:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Voce:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Armi:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frequenza:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Canali:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Scambia canali stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Modalità cuffie"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Voci spaziali:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "VOCS^Nessuna"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "VOCS^Insulti"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "VOCS^Tutte"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Range di insulti:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "RNG^Molto ristretto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "RNG^Ristretto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "RNG^Normale"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "RNG^Lungo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "RNG^Pieno"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Insulti automatici"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Avvertimento di tempo:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "WRN^Nessuno"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minuto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minuti"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "WNR^Entrambi"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Indicatore di colpo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Suoni del menu"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
msgid "Particle quality:"
-msgstr "Qualità dei particolari:"
+msgstr "Qualità particelle:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
msgid "Particle distance:"
-msgstr "Distanza dei particolari:"
+msgstr "Distanza particelle:"
#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
msgid "Decals"
-msgstr "Segni"
+msgstr "Decal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Decal sui modelli"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distanza:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Tempo:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
-msgstr "Usa lightmaps"
+msgstr "Usa mappe di luce"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Mappaggio Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Lucentezza"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Mappaggio in offset"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Mappaggio in rilievo"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Riflessioni:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Sfocate"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "REFL^Buone"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Nitide"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Mostra superfici"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Nessuna illuminazione dinamica"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Approssimazione Flash blend"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Illuminazione dinamica in tempo reale"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Ombre"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Illuminazione globale in tempo reale"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Usa mappe normali"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Ombre morbide"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Corone"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Usa le Occlusion Queries"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Bloom"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "High Dynamic Range (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
-msgstr "Sfocatura da movimento:"
+msgstr "Sfocatura movimento:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Sfocatura da danno:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Postprocessa per sfocatura e nitidezza"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Sensibilità:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Velocità UI mouse:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Filtro mouse"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Inverti mouse"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Usa joystick"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Disattiva l'accelerazione mouse dell'OS"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"apri console\" chiude anche"
msgstr "Mostra fotogrammi al secondo"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Tachimetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (nascosto)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nodi"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostra accelerometro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Scala accelerometro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimizza latenza in entrata"
#: qcsrc/menu/xonotic/dialog_settings_network.c:42
msgid "Input packets/s:"
-msgstr "Pacchetti/sec in entrata:"
+msgstr "Pacchetti/s in entrata:"
#: qcsrc/menu/xonotic/dialog_settings_network.c:46
msgid "HTTP downloads:"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Aumenta contrasto:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Saturazione:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "LIT^Ambiente:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensità:"
msgid "Singleplayer"
msgstr "Giocatore singolo"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Inizia ora! (mappa casuale con bot)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Inizia modalità Giocatore Singolo!"
msgid "Bookmark"
msgstr "Aggiungi tra i preferiti"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Nome dell'host"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Mappa"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Tipo"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Giocatori"
msgid "<AUTHOR>"
msgstr "<AUTORE>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "VOL^OFF"
msgid "Update to %s now!"
msgstr "Aggiorna a %s ora!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1ERRORE: La compressione texture è richiesta ma non supportata.\n"
"^1Previsti problemi visuali.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Assalto"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Capture The Flag"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Dominazione"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Key Hunt"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Last Man Standing"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Corsa"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Corsa CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Team Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba Throwing"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Sfondo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Predefinito"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Usa predefinito"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Colore Team:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Abilita pannello"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr "%s è riuscito ad autodistrugersi col Crylink"
+msgstr "%s è riuscito ad autodistruggersi col Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s non s'è potuto nascondere dal Crylink di %s"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s era troppo vicino al Crylink di %s"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s ha visto da vicino il Crylink di %s"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s non s'è ricordato dove aveva messo il plasma"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s ha giocato col plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s ha appena notato la palla blu di %s"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s è entrato in contatto con la palla blu di %s"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s ha sentito l'aria elettrificata della combo di %s"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s s'è avvicinato troppo al raggio blu di %s"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s è stato fatto saltare in aria dal raggio blu di %s"
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s ha provato da solo la propria granata"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s è detonato"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s non ha visto la granata di %s"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s ha quasi schivato la granata di %s"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s ha mangiato la granata di %s"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s ha giocato con piccoli razzi"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr "%s ha sperato che il missile di %s non rimbalzasse"
+msgstr "%s ha sperato che i missili di %s non rimbalzassero"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "%s è stato preso a pugni da %s"
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s ha fatto l'impossibile"
#: qcsrc/server/w_hook.qc:268
#, c-format
msgid "%s has run into %s's gravity bomb"
-msgstr "%s è corso nella bomba di gravità di %s"
+msgstr "%s si è imbattuto nella bomba di gravità di %s"
#: qcsrc/server/w_laser.qc:2
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s si è \"laserato\" all'inferno"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s è stato tagliato a metà dal guanto di %s"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
-msgstr "%s è stato \"laserato\" alla morte da %s"
+msgstr "%s è stato \"laserato\" a morte da %s"
#: qcsrc/server/w_minelayer.qc:2
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s è esploso"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s s'è avvicinato troppo alla mina di %s"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s ha quasi schivato la mina di %s"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s è passato sopra la mina di %s"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s sta ora pensando con i portali"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "%s è stato vaporizzato da %s"
msgid "%s felt %s doing the impossible to him"
msgstr "%s ha sentito %s fargli l'impossibile"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Fucile"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s si è sparato da solo automaticamente"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s si è fucilato da solo in qualche modo"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s è morto nella raffica di proiettili di %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s non è riuscito a nascondersi dal fucile di %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s ha preso un colpo in testa da %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s è stato fucilato da %s"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Rocket Launcher"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s s'è avvicinato troppo al razzo di %s"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s ha quasi schivato il razzo di %s"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s ha mangiato il razzo di %s"
msgid "Shotgun"
msgstr "Shotgun"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$s ^7ha schiaffeggiato %1$s ^7un pò con un grosso ^2shotgun"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "%s è stato sparato da %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s si è sparato da solo automaticamente"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s si è fucilato da solo in qualche modo"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s è morto nella raffica di proiettili di %s"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s non è riuscito a nascondersi dal fucile di %s"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s ha preso un colpo in testa da %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s è stato fucilato da %s"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr "%s s'è fatto male alle orecchie con la @!#%%'n Tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Tuba"
msgid "%s was riddled full of holes by %s"
msgstr "%s è stato riempito di buchi da %s"
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
+#~ msgid "Damage & water blur"
+#~ msgstr "Sfocatura da danno & acqua:"
+
+#~ msgid "Powerup sharpen"
+#~ msgstr "Powerup nitido"
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Impostazioni dei waypoint"
#~ msgid ""
#~ "Please answer a few initial questions to enhance the game experience."
#~ "Per favore rispondi a poche domande iniziali per migliorare l'esperienza "
#~ "di gioco."
-#~ msgid "Waypoint settings:"
-#~ msgstr "Impostazioni dei waypoint"
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Scala accelerometro:"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Mostra accelerometro"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (nascosto)"
+
+#~ msgid "Speedometer"
+#~ msgstr "Tachimetro"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "^4MQC Versie informatie: %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Laat alleen huidig ammunitietype zien"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Links"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Rechts"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+#, fuzzy
+msgid "Message duration:"
+msgstr "Verzadiging:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+#, fuzzy
+msgid "Fade time:"
+msgstr "Post vervaagtijd:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+#, fuzzy
+msgid "Flip messages order"
+msgstr "Notificatievolgorde omdraaien"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+#, fuzzy
+msgid "Text alignment:"
+msgstr "Icoon positie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+#, fuzzy
+msgid "Font scale:"
+msgstr "Wegwijzer schaal:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Chat Paneel"
msgid "Entry fadetime:"
msgstr "Post vervaagtijd:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Chat Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneel uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#, fuzzy
+msgid "Panel enabled"
+msgstr "Paneel uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled even observing"
+msgstr "Paneel activeren tijdens observeren"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#, fuzzy
+msgid "Panel enabled only in Race/CTS"
+msgstr "Paneel actief in teammodus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Activeer status balk"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Binnenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Buitenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Keer health en armor posities om"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Snelheid (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "knopen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Ammunitie tonen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Zoom snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Reflecties"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Powerups paneel"
msgid "Pressed Keys Panel"
msgstr "Ingedrukte Toetsen Paneel"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Paneel uitgeschakeld"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Paneel activeren tijdens observeren"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Alpha:"
msgid "Score Panel"
msgstr "Score Paneel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "VBO^Uit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Tijd Paneel"
msgid "Fade effect:"
msgstr "Vervagingseffect:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "EF^Geen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Schuiven"
msgid "Alpha"
msgstr "Alpha"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "WRN^Beiden"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Wapeniconen:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Toon wapen-ID als:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "SHOWAS^Geen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Nummer"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Binden"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Nauwkeurigheid tonen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Ammunitie tonen"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Ammunitie balk kleur:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Ammunitie alpha:"
msgid "Panel background defaults:"
msgstr "Paneel achtergrond standaards:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Achtergrond"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Uitschakelen"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Kleur:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Grootte rand:"
msgid "Team color:"
msgstr "Teamkleur:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Test teamkleur in aanpassingsmodus"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Opvulling:"
msgid "Player Setup"
msgstr "Speler Instellingen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Game modus"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Match instellingen:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Tijdslimiet:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Gebruik map specificaties"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Punten limiet:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Aantal spelers:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Aantal bots"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Bot vaardigheid"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Botlike"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Beginner"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Je zal winnen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Je kan winnen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Je zou kunnen winnen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Geavanceerd"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Expert"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Pro"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Sluipmoordenaar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Onmenselijk"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Goddelijk"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutaties..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Geavanceerde instellingen..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Map lijst:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Selecteer alles"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Selecteer niets"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Start Multiplayer!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Vlaggen limiet:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Levens:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Rondes:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Goals:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Frag limiet:"
msgid "Game types:"
msgstr "Game modus:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Dichtdoen"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#, fuzzy
+msgid "MAP^Play"
msgstr "Speel"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Benchmark demo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Speel"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Meedoen"
msgstr "Pijn spatten:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Meteen toepassen"
msgid "Draw 1st person weapon model"
msgstr "Wapen positie"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Links"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Rechts"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Spiegel zicht horizontaal"
msgid "Music:"
msgstr "Muziek:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "VOL^Achtergrond:"
msgid "Info:"
msgstr "Info:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Items:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Pijn:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Speler:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Schoten:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Spraak:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Wapens:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frequentie:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Kanalen:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Stereo omwisselen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Koptelefoon modus"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Ruimtelijke stemmen:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "VOCS^Geen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "VOCS^Honen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "VOCS^Alles"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Hoon afstand:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "RNG^Erg kort"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "RNG^Kort"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "RNG^Normaal"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "RNG^Lang"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "RNG^Vol"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Automatisch honen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Tijd notificatie:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "WRN^Geen"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minuut"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minuten"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "WRN^Beiden"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Tref indicator"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Menu geluiden"
msgid "Decals"
msgstr "Decals"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Afstand:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Tijd:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Gebuik "
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Deluxe mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Glans"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Offset mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Relief mapping"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Reflecties"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Vervaagd"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "REFL^Goed"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Scherp"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Laat oppervlaktes zien"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Geen dynamische verlichting"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Flash blend approximation"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Real-time dynamische verlichting"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Schaduwen"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Real-time wereld verlichting"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Gebruik normal maps"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Zachte schaduwen"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Coronas"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Gebruik Occlusion Queries"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Bloom"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "Hoog dynamisch bereik (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Bewegingsonscherpte:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Schadeonscherpte"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Gevoeligheid:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "UI muis snelheid:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Muis filter"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Invert muis"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Gebruik joystick input"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Gebruik joystick input"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"console activeren\" sluit deze ook weer"
msgstr "Laat frames per seconde zien"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Snelheidsmeter"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (verborgen)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "knopen"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Laat versnellingsmeter zien"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Versnellingsmeter schaal"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimaliseer input latentie"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Verhoog contrast:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Verzadiging:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "LIT^Omgevingslicht"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensiteit:"
msgid "Singleplayer"
msgstr "Singleplayer"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Instant actie! (random map met bots)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Start Singleplayer!"
msgid "Bookmark"
msgstr "Bookmark"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Server naam"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Map"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Type"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Spelers"
msgid "<AUTHOR>"
msgstr "<AUTEUR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "VOL^UIT"
msgid "Update to %s now!"
msgstr "Update nu naar %s!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1ERROR: Textuurcompressie is nodig maar niet ondersteund.\n"
"^1Verwacht grafische problemen.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Assault"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Capture The Flag"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Domination"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Key Hunt"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Last Man Standing"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Race"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Race CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Team Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba Smijten"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Achtergrond"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Standaard"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Gebruik standaard"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Team Kleur:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Activeer paneel"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr ""
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
msgid "%s felt %s doing the impossible to him"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
#, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
#, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
#, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
-
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:244
#, c-format
-msgid "%s was tagged by %s"
+msgid "%s died in %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:251
#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s failed to hide from %s's rifle"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:256
#, c-format
-msgid "%s was gunned by %s"
+msgid "%s got hit in the head by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
#, c-format
-msgid "%s shot themself automatically"
+msgid "%s was sniped by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:247
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:659
#, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
msgstr ""
#: qcsrc/server/w_tuba.qc:2
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
msgid "%s was riddled full of holes by %s"
msgstr ""
+#, fuzzy
+#~ msgid "Damage & water blur"
+#~ msgstr "Schadeonscherpte"
+
+#, fuzzy
+#~ msgid "Powerup sharpen"
+#~ msgstr "Powerups paneel"
+
+#~ msgid "Speedometer"
+#~ msgstr "Snelheidsmeter"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (verborgen)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Laat versnellingsmeter zien"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Versnellingsmeter schaal"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
#~ msgid "Waypoint settings:"
#~ msgstr "Wegwijzer instellingen"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "Gamma:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
+#: qcsrc/menu/xonotic/dialog_settings_input.c:74
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
msgid "Apply immediately"
msgstr ""
msgid "Panel background defaults:"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
+msgid "Background:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
msgid "Disable"
msgstr ""
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
msgid "Color:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
msgid "Border size:"
msgstr ""
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:612
msgid "Alpha:"
msgstr ""
msgid "Team color:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
msgid "Test team color in configure mode"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
msgid "Padding:"
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
msgid "OK"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
msgid "Panel disabled"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
msgid "???"
msgstr ""
msgid "Sensitivity:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_settings_input.c:72
+msgid "Holding jump key keeps jumping"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
msgid "Weapons Panel"
msgstr ""
msgid "Fade effect:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr ""
msgid "Alpha"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Show weapon ID as:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
msgid "SHOWAS^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
msgid "Number"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Bind"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
msgid "Show Accuracy"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Show Ammo"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
msgid "Ammo bar color:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
msgid "Ammo bar alpha:"
msgstr ""
msgid "Use an averaging algorithm for fps"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_quit.c:4
msgid "Quit"
msgstr ""
msgid "Entry fadetime:"
msgstr ""
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
msgid "Advanced settings..."
msgstr ""
msgid "Singleplayer"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
msgid "Instant action! (random map with bots)"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
msgid "Start Singleplayer!"
msgstr ""
msgid "<AUTHOR>"
msgstr ""
-#: qcsrc/menu/xonotic/skinlist.c:163
+#: qcsrc/menu/xonotic/skinlist.c:163 qcsrc/common/mapinfo.qc:1092
#, c-format
msgid "%s: %s"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
msgid "Close"
msgstr ""
msgid "Create"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr ""
msgid "read only"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+msgid "Left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+msgid "Right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
msgid "Score Panel"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr ""
msgid "Game types:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
msgid "Simple majority wins vcall"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:270
+#: qcsrc/menu/xonotic/util.qc:271
#, c-format
msgid "Received HTTP request data for an invalid id %d.\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:285
+#: qcsrc/menu/xonotic/util.qc:286
#, c-format
msgid "error receiving update notification: status is %d\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:290
+#: qcsrc/menu/xonotic/util.qc:291
msgid "error: received HTML instead of an update notification\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:295
+#: qcsrc/menu/xonotic/util.qc:296
msgid "error: received carriage returns from update notification server\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:316
+#: qcsrc/menu/xonotic/util.qc:317
#, c-format
msgid ""
"Update can be downloaded at:\n"
"%s\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:337
+#: qcsrc/menu/xonotic/util.qc:340
msgid "Autogenerating mapinfo for newly added maps..."
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:367
+#: qcsrc/menu/xonotic/util.qc:370
#, c-format
msgid "^1%s TEST BUILD"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:432
+#: qcsrc/menu/xonotic/util.qc:428
#, c-format
msgid "Update to %s now!"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:513
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Arena"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Assault"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Capture The Flag"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Clan Arena"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:539
msgid "Deathmatch"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:540
msgid "Domination"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:541
msgid "Freeze Tag"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:542
msgid "Keepaway"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:543
msgid "Key Hunt"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:544
msgid "Last Man Standing"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:545
msgid "Nexball"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:546
msgid "Onslaught"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:547
msgid "Race"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:548
msgid "Race CTS"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:549
msgid "Runematch"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:550
msgid "Team Deathmatch"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:569
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:634
msgid "Default"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Use default"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:620
msgid "Team Color:"
msgstr ""
msgid "Show only current ammo type"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
-msgid "Left"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
-msgid "Right"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
msgid "Draw 1st person weapon model"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr ""
msgid "Decals"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_network.c:26
msgid "Bookmark"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr ""
msgid "Timedemo"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr ""
msgid "Music:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr ""
msgid "Info:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr ""
msgid "Nex"
msgstr ""
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_shotgun.qc:203
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_shotgun.qc:215
+#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:293
#, c-format
-msgid "%s did the impossible"
+msgid "%s is now thinking with portals"
msgstr ""
-#: qcsrc/server/w_nex.qc:269 qcsrc/server/w_minstanex.qc:292
+#: qcsrc/server/w_nex.qc:255 qcsrc/server/w_minstanex.qc:295
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
msgid "Laser"
msgstr ""
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
msgid "Shotgun"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr ""
msgid "Machine Gun"
msgstr ""
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:254
+#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:258
#, c-format
msgid "%s was sniped by %s"
msgstr ""
msgid "%s was riddled full of holes by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr ""
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr ""
-
#: qcsrc/server/w_minstanex.qc:2
msgid "MinstaNex"
msgstr ""
msgid "Electro"
msgstr ""
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "@!#%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
msgid "Port-O-Launch"
msgstr ""
+#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
#: qcsrc/server/w_porto.qc:298
#, c-format
msgid "%s felt %s doing the impossible to him"
msgid "Hagar"
msgstr ""
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
msgid "Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
msgid "Rocket Launcher"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:500 qcsrc/server/w_minelayer.qc:495
+#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr ""
msgid "Mine Layer"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
#: qcsrc/server/w_seeker.qc:2
msgid "T.A.G. Seeker"
msgstr ""
msgid "Mortar"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
msgstr ""
"Project-Id-Version: Xontoic 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ricardo 'Hellgardia' Silva <ricardo.mccs@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "modificado"
#: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
msgid "^4MQC Build information: ^1%s\n"
msgstr "^4MQC Informação da Build %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Mostrar apenas o tipo de munição actual"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Alinhar icones"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Esquerda"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Direita"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Duração da mensagem:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Desaparecimento de cada entrada:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Trocar ordem de notificações"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alinhamento do Texto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Tamanho de letra:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Painel de Conversa"
msgid "Entry fadetime:"
msgstr "Desaparecimento de cada entrada:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Painel de Física"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Painel desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Painel activado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Painel activado quando espectador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Painel activo apenas em jogos de Corrida/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barra de estado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Alinhamento à esquerda"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Alinhamento à direita"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Para Dentro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Para Fora"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Trocar posição da velocidade e aceleração"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Velocidade:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Incluir velocidade vertical"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unidade de velocidade:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "nós"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Mostrar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Velocidade Máxima:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Aceleração:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Incluir aceleração vertical"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Painel de Powerups"
msgid "Pressed Keys Panel"
msgstr "Painel das Teclas Pressionadas"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Painel desactivado"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Painel activado quando espectador"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Alfa:"
msgid "Score Panel"
msgstr "Painel de Pontos"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Pontuação:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Tabela Classficativa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "E eu"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Puro"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Painel Temporizador"
msgid "Fade effect:"
msgstr "Efeito de desaparecimento"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "Nenhum"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Deslocador"
msgid "Alpha"
msgstr "Alfa"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Ambos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Icones das armas"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Mostra o ID da arma como:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "Nenhum"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Número"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Ligar"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Mostrar Pontaria"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Mostrar Munições"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Cor da barra de munições:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Cor da barra alfa:"
msgid "Panel background defaults:"
msgstr "Fundo do painel por defeito:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fundo:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Desactivar"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Cor:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Tamanho do limite:"
msgid "Team color:"
msgstr "Cor da Equipa:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Testa cor da equipa no modo de configuração"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Padding:"
msgid "Player Setup"
msgstr "Configuração do Jogador"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Tipo de jogo:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Definições de jogo:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Tempo limite:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Usar definição específica do mapa"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Limite de pontos:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Slots para Jogadores:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Número de jogadores controlados pelo computador:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Nível de dificuldade:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Bot"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Iniciado"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Vais ganhar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Podes ganhar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Talvez ganhes"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Avançado"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Perito"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Profissional"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Assassino"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Desumano"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Divinal"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Mutators..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Definições avançadas..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Lista de mapas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Seleccionar todos"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Seleccionar nenhum"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Começar Multijogador!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Limite de capturas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Vidas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Voltas:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Golos:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Limite de Frags:"
msgid "Game types:"
msgstr "Modos de jogo:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Fechar"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Jogar"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Demo temporizado"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Jogar"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Juntar"
msgstr "Dano Colateral:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Aplicar imediatamente"
msgid "Draw 1st person weapon model"
msgstr "Desenhar modelo da arma na 1a pessoa"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Alinhamento à esquerda"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Alinhamento à direita"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Trocar vista horizontal"
msgid "Music:"
msgstr "Música:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Som Ambiente:"
msgid "Info:"
msgstr "Informação:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Items:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Dor:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Jogador:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Tiros:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Voz:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Armas:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frequência:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Canais:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Trocar Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Modo de Headphones"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Vozes espaciais:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "Nenhum"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "Taunts"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "Todos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Nível dos taunts:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "Muito baixo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Baixo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Normal"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Alto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Total"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Taunts Automáticos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Aviso de tempo:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Nenhum"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minuto"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minutos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "Ambos"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Indicador de tiro acertado"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Sons do menu"
msgid "Decals"
msgstr "Símbolos"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Marcas nos modelos"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distância:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Tempo:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Usar lightmaps"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Mapeamento Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Lustro"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Mapeamento Offset"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Mapeamento Relief"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Reflexos:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Grau de Blur"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Bom"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Grau de Definição"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Mostrar superfícies"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Iluminação dinâmica desligada"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Aproximação Flash Blend"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Iluminação dinâmica em tempo real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Sombras"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Iluminação do mundo em tempo real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Usar mapas normais"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Sombras Suaves"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Coronas"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Usar Consultas Oclusão"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Bloom"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "High Dynamic Range (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Distorção por movimento:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Distorção por dano:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Blur e postprocessing"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Sensibilidade:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Velocidade do rato:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Filtro do Rato"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Inverter Rato"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Usar input do joystick"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Desligar aceleração de Rato do SO"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"entrar na consola\" também fecha"
msgstr "Mostrar Frames por Segundo"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Medidor de Velocidade"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (escondido)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nós"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostrar accelerómetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Escala do accelerómetro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimizar latência de entrada"
msgid "Gamma:"
msgstr "Gamma:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Contraste - Boost"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Saturação da Cor:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Som Ambiente:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensidade:"
msgid "Singleplayer"
msgstr "Um Jogador"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Acção Instantânea! (Mapa ao acaso contra o computador)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Começar Um só Jogador!"
msgid "Bookmark"
msgstr "Marcar"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Ping"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Nome do Host"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Mapa"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Tipo"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Jogadores"
msgid "<AUTHOR>"
msgstr "<AUTOR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "DESLIGADO"
#: qcsrc/menu/xonotic/util.qc:367
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s VERSAO DE TESTE"
#: qcsrc/menu/xonotic/util.qc:432
#, c-format
msgid "Update to %s now!"
msgstr "Actualize para %s agora!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1ERRO: A compressão de texturas é necessária mas não é suportada.\n"
"^1Possíveis problemas visuais.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Assalto"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Captura a Bandeira"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Combate até à Morte"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Domínio"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Procura da Chave"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "O Ultimo a Cair"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Investida"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Corrida"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Corrida CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Luta de Runas"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Combate até à Morte por Equipas"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tuba Throwing"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fundo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Por Defeito"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Usar defeito"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Cor da Equipa:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Actival painel"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s conseguiu auto-destruir-se com a Crylink"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s não se conseguiu esconder da Crylink do %s"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s estava demasiado perto da Crylink do %s"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s pode ver de perto a Crylink do %s"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s não se conseguiu lembrar onde pôs a plasma"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s brincou com plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s acabou de reparar na bola azul de %s"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s esteve em contacto com a bola azul de %s"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s sentiu o ar electrizante do combo de %s"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s estava perto demais do raio azul de %s"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s foi atingido pelo raio azul de %s"
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s experimentou a sua própria granada"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s foi detonado"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s não viu a granada de %s"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s quase se desviou da granada de %s"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s comeu a granada de %s"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s brincou com pequenos foguetes"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s rezou para que os misseis de %s não resaltassem"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "%s foi serrado por %s"
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s fez o impossível"
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s laserou-se até à morte"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s foi cortado ao meio pela gauntlet de %s"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "%s foi lasereado até à morte por %s"
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s explodiu"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s estava perto demais da mina de %s"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s quase se desviou da mina de %s"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s pisou a mina de %s"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s está agora a pensar com portais"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "%s foi vaporizado por %s"
msgid "%s felt %s doing the impossible to him"
msgstr "%s sentiu %s fazer-lhe o impossível"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Espingarda"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s disparou em si próprio"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s snipou-se de alguma forma..."
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s não se conseguiu esconder da chuva de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s morreu na chuva de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s não se conseguiu esconder da espingarda de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s foi atingido na cabeça por %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s foi snipado por %s"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Rocket Launcher"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s estava demasiado perto do foguete de %s"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s quase se desviou do foguete de %s"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s comeu o foguete de %s"
msgid "Shotgun"
msgstr "Shotgun"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$s ^7maltratou %1$s ^7com uma grande ^2caçadeira"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "%s foi atingido por %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s disparou em si próprio"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s snipou-se de alguma forma..."
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s não se conseguiu esconder da chuva de balas de %s"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s morreu na chuva de balas de %s"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s não se conseguiu esconder da espingarda de %s"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s foi atingido na cabeça por %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s foi snipado por %s"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr "%s magoou-se a si próprio com a Tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr "%s morreu por causa da grande actuação de %s"
#, c-format
msgid "%s was riddled full of holes by %s"
msgstr "%s foi enchido de buracos por %s"
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Definições dos caminhos:"
msgstr ""
"Project-Id-Version: Xonotic 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: 2011-01-18 11:53+0100\t\n"
"Last-Translator: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "^4MQC Informatii compilare: %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Afiseaza numai munitia armei selectate"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Aliniere icon:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Stanga"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Dreapta"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Text centru"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Durata mesaj:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Durata atenuare:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Inversare ordine mesaje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Aliniere text:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centru:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Marime font:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Fereastra Chat"
msgid "Entry fadetime:"
msgstr "Durata atenuare notificatie:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Panou Fizici"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Dezactivata"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panou activ"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panou activ si spectatorilor"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panou activ numai in Cursa/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Bara statut"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Aliniere stanga"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Aliniere dreapta"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Aliniere interioara"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Aliniere exterioara"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Inversare pozitie viteza/acceleratie"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Viteza:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Include viteza verticala"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unitate viteza"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "noduri"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Afiseaza"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Viteza maxima:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Acceleratie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Include acceleratia verticala"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Fereastra Powerup"
msgid "Pressed Keys Panel"
msgstr "Fereastra Taste Apasate"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Dezactivata"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Activa pentru spectatori"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Opacitate:"
msgid "Score Panel"
msgstr "Fereastra Scor"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Scor:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Clasificari:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Si eu"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Pur"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Fereastra Timp"
msgid "Fade effect:"
msgstr "Atenuare opacitate:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "Nici una"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Glisare"
msgid "Alpha"
msgstr "Opacitate"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Ambele"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Iconuri arme:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Afisaj ID arme ca:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "Nici una"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Numar"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Tasta"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Afisaj Acuratete"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Afisaj Munitie"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Culoare bara munitie:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Opacitate bara munitie:"
msgid "Panel background defaults:"
msgstr "Setari normale fond:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fundal:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Dezactivat"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Culoare:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Marime borduri:"
msgid "Team color:"
msgstr "Culoare echipa:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Testare culoare echipa in timpul configurarii"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Ajustare:"
msgid "Player Setup"
msgstr "Setari Jucator"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Mod joc:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Setari meci:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Limita de timp:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Utilizare setari harta"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Limita de puncte:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Numar maxim jucatori:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Numar boti:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Dificultate boti:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Nula"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Incepator"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Vei castiga"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Poti castiga"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Ai putea castiga"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Avansat"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Expert"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Profesional"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Asasin"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Inuman"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Dumnezeiesc"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Modificari speciale..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Setari avansate..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Lista harti:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Selecteaza totul"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Golire selectie"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Pornire Joc Multiplayer!"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Limita de capturi:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Vieti:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Ture:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Goluri:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Limita de omoruri:"
msgid "Game types:"
msgstr "Moduri de joc:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Inchidere"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
msgstr "Joaca"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Timedemo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Vizualizare"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Alaturare"
msgstr "Efect ranire:"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Aplica imediat"
msgid "Draw 1st person weapon model"
msgstr "Afisaj model 1st person"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Aliniere stanga"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Aliniere dreapta"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Oglindire orizontala ecran"
msgid "Music:"
msgstr "Muzica:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Ambianta:"
msgid "Info:"
msgstr "Informatii:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Obiecte:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Durere:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Jucator:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Focuri de arma:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Voci:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Arme:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frecventa:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 kHz"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Canale:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Mono"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Inversare canale stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Mod casti audio"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Voci spatializate:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "Nici una"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "Glume"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "Toate"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Distanta voci:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "Foarte scurta"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Scurta"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Normala"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Lunga"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Toate"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Glume automate"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Avertisment timp:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Nici una"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minut"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minute"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "Ambele"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Indicator lovituri"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Sunete meniu"
msgid "Decals"
msgstr "Semne"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Semne pe modele"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Distanta:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Durata:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Utilizare lightmap"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Texturi Deluxe"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Suprafete lucioase"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Relief"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Detaliu relief"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Reflectii:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Blurate"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Bune"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Ascutite"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Afisaj suprafete"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Luminozitate dinamica dezactivata"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Luminozitate dinamica rapida"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Luminozitate dinamica in timp real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Umbre"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Luminozitate ambienta in timp real"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Utilizare texturi normale"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Umbre fine"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Coroane lumini"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Utilizare Ocluzii"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Luminozitate moale"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "Distanta Dinamica Inalta (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Blurare viteza:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Blurare ranire:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Postprocesare blurare si ascutire"
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Sensitivitate:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Viteza mouse in meniu:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Filtrare mouse"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Inversare mouse"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Utilizare joystick"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Dezactivare acceleratie mouse din OS"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"enter\" inchide si consola"
msgstr "Afisaj cadre pe secunda"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Vitezometru"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (ascuns)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "noduri"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Afisaj metru acceleratie"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Marime metru acceleratie:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Minimizare latenta control"
msgid "Gamma:"
msgstr "Gama:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Exagerare contrast:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Saturatie:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Ambianta:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Intensitate:"
msgid "Singleplayer"
msgstr "Joc singular"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Actiune instanta! (harta aleatorie cu boti)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Pornire Joc Singular!"
msgid "Bookmark"
msgstr "Favorit"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Latenta"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Nume server"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Harta"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Mod"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Jucatori"
msgid "<AUTHOR>"
msgstr "<AUTOR>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "OPRIT"
#: qcsrc/menu/xonotic/util.qc:367
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s VERSIUNE TESTARE"
#: qcsrc/menu/xonotic/util.qc:432
#, c-format
msgid "Update to %s now!"
msgstr "Updatati la %s acum!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1EROARE: Comprimarea texturilor este necesara dar nu si suportata.\n"
"^1Asteptati-va la probleme vizuale.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Asalt"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Captureaza Steagul"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Meciul Mortii"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Dominatie"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Inghet"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Vanatoarea Cheilor"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Ultimul Supravietuitor"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Cursa"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Cursa CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Meciul Mortii (in echipa)"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "Arunca @!#%'n Tuba"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fundal:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Setare normala"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Utilizare setare normala"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Culoare echipa:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Activare panou"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr "%s a reusit sa se auto-distruga cu Crylink-ul"
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr "%s nu s-a putut ascunde de Crylink-ul lui %s"
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr "%s s-a apropiat prea mult de Crylink-ul lui %s"
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr "%s s-a uitat in deaproape la Crylink-ul lui %s"
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr "%s a uitat unde a pus plasma"
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr "%s s-a jucat cu plasma"
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr "%s tocmai a observat bilele albastre ale lui %s"
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr "%s a intrat in contact cu bila albastra a lui %s"
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr "%s a simtit forta electrica a combinatiei lui %s"
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr "%s s-a apropiat prea mult de raza albastra a lui %s"
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr "%s a fost lovit de raza albastra a lui %s"
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr "%s si-a incercat propria grenada"
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr "%s a detonat"
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr "%s nu a vazut grenada lui %s"
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr "%s aproape ca s-a ferit de grenada lui %s"
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr "%s a mancat grenada lui %s"
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr "%s s-a jucat cu rachete"
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr "%s a sperat ca rachetele lui %s nu vor ricosa"
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr "%s a fost batut mar de %s"
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr "%s a reusit imposibilul"
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr "%s s-a lovit prea mult cu laserul"
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr "%s a fost taiat in doua de socul lui %s"
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr "%s a fost omorat cu laser de %s"
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr "%s a explodat"
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr "%s s-a apropiat prea mult de mina lui %s"
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr "%s aproape ca s-a ferit de mina lui %s"
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr "%s a calcat pe mina lui %s"
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s gandeste acum cu portaluri"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr "%s a fost vaporizat de %s"
msgid "%s felt %s doing the impossible to him"
msgstr "%s a simtit cum %s a reusit imposibilul"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Luneta"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s s-a impuscat automat"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s s-a impuscat oarecum cu luneta"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s nu a reusit sa se ascunda de ploaia de gloante a lui %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s a murit in ploaia de gloante a lui %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s nu a reusit sa se ascunda de luneta lui %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s a fost lovit in cap de %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s a fost nimerit cu luneta de %s"
+
#: qcsrc/server/w_rocketlauncher.qc:2
msgid "Rocket Launcher"
msgstr "Rocket Launcher"
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
msgid "%s got too close to %s's rocket"
msgstr "%s s-a apropiat prea mult de racheta lui %s"
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
msgid "%s almost dodged %s's rocket"
msgstr "%s aproape ca s-a ferit de racheta lui %s"
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
msgid "%s ate %s's rocket"
msgstr "%s a mancat racheta lui %s"
msgid "Shotgun"
msgstr "Shotgun"
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr "%2$s ^7l-a plesnit pe %1$s ^7cu o ^2Pusca ^7foarte mare"
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
msgid "%s was gunned by %s"
msgstr "%s a fost impuscat de %s"
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s s-a impuscat automat"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s s-a impuscat oarecum cu luneta"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s nu a reusit sa se ascunda de ploaia de gloante a lui %s"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s a murit in ploaia de gloante a lui %s"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s nu a reusit sa se ascunda de luneta lui %s"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s a fost lovit in cap de %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s a fost nimerit cu luneta de %s"
-
#: qcsrc/server/w_tuba.qc:2
#, c-format
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr "%s si-a spart urechile cu propria @!#%%'n Tuba"
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr "%s a murit de la cantecul lui %s cu @!#%%'n Tuba"
msgid "%s was riddled full of holes by %s"
msgstr "%s a fost gaurit de %s"
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
+
#~ msgid "Waypoint settings:"
#~ msgstr "Setari indicatoare:"
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Marime metru acceleratie:"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Afisaj metru acceleratie"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (ascuns)"
+
+#~ msgid "Speedometer"
+#~ msgstr "Vitezometru"
+
+#~ msgid "Damage & water blur"
+#~ msgstr "Blurare ranire & apa:"
+
+#~ msgid "Powerup sharpen"
+#~ msgstr "Ascutire powerup"
+
+#, fuzzy
+#~ msgid "Panel enabled if not observing"
+#~ msgstr "Activa pentru spectatori"
msgstr ""
"Project-Id-Version: 0.1preview\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: 2011-01-20 13:16+0300\n"
"Last-Translator: Nikoli <nikoli@lavabit.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr "^4Сведения о сборке MQC: %s\n"
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr "???"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr "Показывать только текущий вид боеприпасов"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr "Слева"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr "Справа"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+#, fuzzy
+msgid "Message duration:"
+msgstr "Насыщенность:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+#, fuzzy
+msgid "Fade time:"
+msgstr "Время исчезновения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+#, fuzzy
+msgid "Flip messages order"
+msgstr "Обратить порядок уведомлений"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+#, fuzzy
+msgid "Text alignment:"
+msgstr "Выравнивание иконок:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+#, fuzzy
+msgid "Font scale:"
+msgstr "Размер отметок:"
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr "Панель чата"
msgid "Entry fadetime:"
msgstr "Время исчезновения:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Панель чата"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#, fuzzy
+msgid "Panel enabled"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled even observing"
+msgstr "Включена при наблюдении"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#, fuzzy
+msgid "Panel enabled only in Race/CTS"
+msgstr "Панель включена в командных играх"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Включить полосу состояния"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Слева"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Справа"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Внутрь"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Наружу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Поменять местами здоровье и броню"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Скорость (кБ/с):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "м/с"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "км/ч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "м/ч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "узлы"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Показывать Боеприпасы"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Скорость увеличения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Отражения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr "Панель бонусов"
msgid "Pressed Keys Panel"
msgstr "Панель нажатых кнопок"
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Отключена"
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr "Включена при наблюдении"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Прозрачность:"
msgid "Score Panel"
msgstr "Таблица Очков"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr "Панель таймера"
msgid "Fade effect:"
msgstr "Эффект исчезновения:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr "Отсутствует"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Скольжение"
msgid "Alpha"
msgstr "Исчезновение"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "1 и 5 минут"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Иконки оружия:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Показывать ID оружия как:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr "Не показывать"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Число"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Привязка"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Показывать Точность"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Показывать Боеприпасы"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Цвет полосы боеприпасов"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Прозрачность полосы боеприпасов:"
msgid "Panel background defaults:"
msgstr "Фон по умолчанию:"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Фон:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Отключить"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Цвет:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Ширина краёв:"
msgid "Team color:"
msgstr "Цвет команды:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Проверить цвет команды в режиме настройки"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Промежуток:"
msgid "Player Setup"
msgstr "Настройки игрока"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr "Вид игры:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr "Настройки состязания:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr "Предел времени:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr "Исп. предел карты"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr "Предел очков:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr "Кол-во игроков:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr "Кол-во ботов:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr "Уровень ботов:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr "Ботоподобный"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr "Новичок"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr "Легко победить"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr "Можно победить"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr "Возможно победить"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr "Продвинутый"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr "Опытный"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr "Профессионал"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr "Убийца"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr "Сверхчеловек"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr "Богоподобный"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr "Мутаторы..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr "Доп. настройки..."
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr "Список карт:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr "Выбрать все"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr "Снять выделение"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr "Начать игру по сети"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr "Предел захватов:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr "Жизни:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr "Круги:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr "Цели:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr "Предел убийств:"
msgid "Game types:"
msgstr "Режимы игры:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Закрыть"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#, fuzzy
+msgid "MAP^Play"
msgstr "Играть"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr "Проверка производительности"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Играть"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr "Присоединиться"
msgstr "Изображ. урона"
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Применить"
msgid "Draw 1st person weapon model"
msgstr "Показывать модель оружия в руках"
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Слева"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Справа"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr "Перевернуть изображение по горизонтали"
msgid "Music:"
msgstr "Музыка:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
msgid "VOL^Ambient:"
msgstr "Фоновые звуки:"
msgid "Info:"
msgstr "Инфо:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Предметы:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Боль:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Игрок:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Выстрелы:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Голос:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Оружие:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Частота:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr "8 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr "11.025 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr "16 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr "22.05 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr "24 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr "32 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr "44.1 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr "48 кГц"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Каналы:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr "Моно"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr "Стерео"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr "2.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr "4"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr "5"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr "5.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr "6.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr "7.1"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Обмен местами каналов"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Ориентированный на наушники режим"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Объёмные голоса:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr "Отключены"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
msgid "VOCS^Taunts"
msgstr "Насмешки"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr "Все"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Радиус насмешек:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
msgid "RNG^Very short"
msgstr "Очень маленький"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
msgid "RNG^Short"
msgstr "Маленький"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
msgid "RNG^Normal"
msgstr "Обычный"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
msgid "RNG^Long"
msgstr "Большой"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
msgid "RNG^Full"
msgstr "Полный"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Автоматические насмешки"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Предупреждение о таймауте за:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr "Нет"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 минуту"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 минут"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
msgid "WRN^Both"
msgstr "1 и 5 минут"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Оповещать о попадании"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Звуки меню"
msgid "Decals"
msgstr "Декали:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr "Дальность:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr "Время:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr "Использовать карты освещения"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr "Особое качество"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr "Блеск"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr "Офсетное текстурирование"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr "Рельефное текстурирование"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr "Отражения:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr "Размытые"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr "Хорошие"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr "Резкие"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr "Показывать поверхности"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr "Без динамического освещения"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr "Грубая имитация"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr "Дин. освещение в реальном времени"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr "Тени"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr "Дин. освещение мира в реальном времени"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr "Использовать карты нормалей"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr "Мягкие тени"
# Перевод может быть неверным.
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr "Короны"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr "Использовать Occlusion Queries (Проверка видимости)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr "Свечение"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr "High Dynamic Range (HDR)"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr "Размытие от движения:"
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Размытие от урона:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Key bindings:"
msgid "Sensitivity:"
msgstr "Чувствительность:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr "Скорость мыши в UI:"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr "Фильтр мыши"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr "Обратить мышь"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr "Использовать ввод с джойстика"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr "Отключить ускорение OS мыши"
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr "\"открыть консоль\" также закрывает"
msgstr "Показывать кадры/с (FPS)"
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Спидометр"
-
-# "quake units per second"
-# you can also translate it as inch/second
-# as it is roughly the same
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (без назв.)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "м/с"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "км/ч"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "м/ч"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "узлы"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Показывать акселерометр"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Размер акселерометра:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr "Уменьшить задержку ввода"
msgid "Gamma:"
msgstr "Гамма:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr "Усиление контраста:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr "Насыщенность:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
msgid "LIT^Ambient:"
msgstr "Окружающее освещение:"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr "Мощность:"
msgid "Singleplayer"
msgstr "Одиночная игра"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr "Быстрая игра (случайная карта с ботами)"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr "Начать одиночную игру"
msgid "Bookmark"
msgstr "В закладки"
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr "Пинг"
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr "Имя сервера"
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr "Карта"
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr "Вид"
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr "Игроки"
msgid "<AUTHOR>"
msgstr "<АВТОР>"
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr "Отключено"
msgid "Update to %s now!"
msgstr "Обновитесь до %s сейчас же!"
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"1^ОШИБКА: Сжатие текстур требуется, но не поддерживается.\n"
"1^Ожидайте проблемы с отображением.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Assault"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Capture The Flag"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Clan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Domination"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Freeze Tag"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Keepaway"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Key Hunt"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Last Man Standing"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexball"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Onslaught"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Race"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr "Race CTS"
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr "Runematch"
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Team Deathmatch"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Швыряние Тубой"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Фон:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "По умолчанию"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Исп. настройки по умолчанию"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Цвет команды:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr "Включить панель"
msgid "Crylink"
msgstr "Crylink"
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
msgid "Electro"
msgstr "Electro"
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "Mortar"
msgstr "Mortar"
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
msgid "Hagar"
msgstr "Hagar"
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
msgid "Grappling Hook"
msgstr "Grappling Hook"
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr ""
msgid "Laser"
msgstr "Laser"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
msgid "Mine Layer"
msgstr "Mine Layer"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
msgid "MinstaNex"
msgstr "MinstaNex"
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
msgid "%s felt %s doing the impossible to him"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
#, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
#, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
#, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
-
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:244
#, c-format
-msgid "%s was tagged by %s"
+msgid "%s died in %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:251
#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s failed to hide from %s's rifle"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:256
#, c-format
-msgid "%s was gunned by %s"
+msgid "%s got hit in the head by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
#, c-format
-msgid "%s shot themself automatically"
+msgid "%s was sniped by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:247
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:659
#, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
msgstr ""
#: qcsrc/server/w_tuba.qc:2
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tuba"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
msgid "%s was riddled full of holes by %s"
msgstr ""
+#, fuzzy
+#~ msgid "Damage & water blur"
+#~ msgstr "Размытие от урона:"
+
+#, fuzzy
+#~ msgid "Powerup sharpen"
+#~ msgstr "Панель бонусов"
+
+#~ msgid "Speedometer"
+#~ msgstr "Спидометр"
+
+# "quake units per second"
+# you can also translate it as inch/second
+# as it is roughly the same
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (без назв.)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Показывать акселерометр"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Размер акселерометра:"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
#~ msgid "Waypoint settings:"
#~ msgstr "Настройки отметок:"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:06+0200\n"
+"POT-Creation-Date: 2011-09-02 07:51+0200\n"
"PO-Revision-Date: 2011-01-11 22:51+ZONE\n"
"Last-Translator: marcus256 <marcus256@users.sourceforge.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr ""
+
#: qcsrc/menu/gamecommand.qc:47
#, c-format
msgid "error: status is %d\n"
msgstr ""
#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
msgid "???"
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
msgid "OK"
msgid "Show only current ammo type"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
msgstr ""
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
msgid "Right"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+#, fuzzy
+msgid "Fade time:"
+msgstr "Tona ut efter:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+#, fuzzy
+msgid "Text alignment:"
+msgstr "Avstånd för pikar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
msgid "Chat Panel"
msgstr ""
msgid "Entry fadetime:"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Hastighet (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Visa Ammunition"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Nätverkshastighet:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
msgid "Powerups Panel"
msgstr ""
msgid "Pressed Keys Panel"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr ""
-
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
msgid "Panel enabled when spectating"
msgstr ""
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
msgid "Alpha:"
msgstr "Alfa:"
msgid "Score Panel"
msgstr "Poängpanel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
msgid "Timer Panel"
msgstr ""
msgid "Fade effect:"
msgstr "Uttoningseffekt:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
msgid "EF^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
msgid "Slide"
msgstr "Ingen"
msgid "Alpha"
msgstr "Alfa"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "Både och"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
msgid "Weapon icons:"
msgstr "Vapenikoner:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
msgid "Show weapon ID as:"
msgstr "Visa vapen-ID som:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
msgid "SHOWAS^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
msgid "Number"
msgstr "Nummer"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
msgid "Bind"
msgstr "Koppla"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
msgid "Show Accuracy"
msgstr "Visa Noggrannhet"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
msgid "Show Ammo"
msgstr "Visa Ammunition"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
msgid "Ammo bar color:"
msgstr "Färg på ammoraden:"
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
msgid "Ammo bar alpha:"
msgstr "Alfa på ammoraden:"
msgid "Panel background defaults:"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Bakgrund:"
+
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
msgid "Disable"
msgstr "Inaktivera"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
msgid "Color:"
msgstr "Färg:"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
msgid "Border size:"
msgstr "Ramstorlek:"
msgid "Team color:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
msgid "Test team color in configure mode"
msgstr "Testa lagfärg i konfigureringsläge"
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
msgid "Padding:"
msgstr "Utfyllnad:"
msgid "Player Setup"
msgstr "Spelarinställning"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
msgid "Game type:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
msgid "Match settings:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
msgid "Time limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
msgid "Use map specified default"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Point limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
msgid "Player slots:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
msgid "Number of bots:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
msgid "Bot skill:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
msgid "Botlike"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
msgid "Beginner"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
msgid "You will win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
msgid "You can win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
msgid "You might win"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
msgid "Advanced"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
msgid "Expert"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
msgid "Pro"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
msgid "Assassin"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
msgid "Unhuman"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
msgid "Godlike"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
msgid "Mutators..."
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
msgid "Advanced settings..."
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
msgid "Map list:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
msgid "Select all"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
msgid "Select none"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
msgid "Start Multiplayer!"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
msgid "Capture limit:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
msgid "Lives:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
msgid "Laps:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
msgid "Goals:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
msgid "Frag limit:"
msgstr ""
msgid "Game types:"
msgstr "Speltyper:"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
msgid "Close"
msgstr "Stäng"
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#, fuzzy
+msgid "MAP^Play"
msgstr "Spela"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
msgid "Timedemo"
msgstr ""
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Spela"
+
#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
msgid "Join"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
msgid "Apply immediately"
msgstr "Tillämpa nu"
msgid "Draw 1st person weapon model"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
msgid "Flip view horizontally"
msgstr ""
msgid "Music:"
msgstr "Musik:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
#, fuzzy
msgid "VOL^Ambient:"
msgstr "Bakgrund"
msgid "Info:"
msgstr "Info:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
msgid "Items:"
msgstr "Saker:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
msgid "Pain:"
msgstr "Smärta:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
msgid "Player:"
msgstr "Spelare:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
msgid "Shots:"
msgstr "Skott:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
msgid "Voice:"
msgstr "Röst:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
msgid "Weapons:"
msgstr "Vapen:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
msgid "Frequency:"
msgstr "Frekvens:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
msgid "8 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
msgid "11.025 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
msgid "16 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
msgid "22.05 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
msgid "24 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
msgid "32 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
msgid "44.1 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
msgid "48 kHz"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
msgid "Channels:"
msgstr "Kanaler."
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
msgid "Mono"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
msgid "Stereo"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
msgid "2.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
msgid "4"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
msgid "5"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
msgid "5.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
msgid "6.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
msgid "7.1"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
msgid "Swap Stereo"
msgstr "Växla Stereo"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
msgid "Headphone friendly mode"
msgstr "Hörlursvänligt läge"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
msgid "Spatial voices:"
msgstr "Spatiala kanaler:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
msgid "VOCS^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
#, fuzzy
msgid "VOCS^Taunts"
msgstr "Pikar"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
msgid "VOCS^All"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
msgid "Taunt range:"
msgstr "Avstånd för pikar:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
#, fuzzy
msgid "RNG^Very short"
msgstr "Väldigt kort"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
#, fuzzy
msgid "RNG^Short"
msgstr "Kort"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
#, fuzzy
msgid "RNG^Normal"
msgstr "Normalt"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
#, fuzzy
msgid "RNG^Long"
msgstr "Långt"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
#, fuzzy
msgid "RNG^Full"
msgstr "Fullt"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
msgid "Automatic taunts"
msgstr "Automatiska pikar"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
msgid "Time warning:"
msgstr "Tidsvarning:"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
msgid "WRN^None"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
msgid "1 minute"
msgstr "1 minut"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
msgid "5 minutes"
msgstr "5 minuter"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
#, fuzzy
msgid "WRN^Both"
msgstr "Både och"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
msgid "Hit indicator"
msgstr "Skadoindikator"
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
msgid "Menu sounds"
msgstr "Menyljud"
msgid "Decals"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
msgid "Distance:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
msgid "Time:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
msgid "Use lightmaps"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
msgid "Deluxe mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
msgid "Gloss"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
msgid "Offset mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
msgid "Relief mapping"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
msgid "Reflections:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
msgid "Blurred"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
msgid "REFL^Good"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
msgid "Sharp"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
msgid "Show surfaces"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
msgid "No dynamic lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
msgid "Flash blend approximation"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
msgid "Realtime dynamic lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
msgid "Shadows"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
msgid "Realtime world lighting"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
msgid "Use normal maps"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
msgid "Soft shadows"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
msgid "Coronas"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
msgid "Use Occlusion Queries"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
msgid "Bloom"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
msgid "High Dynamic Range (HDR)"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
msgid "Motion blur:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_input.c:26
msgid "Sensitivity:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
msgid "UI mouse speed:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
msgid "Mouse filter"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
msgid "Invert mouse"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
msgid "Use joystick input"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
msgid "Turn off OS mouse acceleration"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
msgid "\"enter console\" also closes"
msgstr ""
msgstr ""
#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
msgid "Minimize input latency"
msgstr ""
msgid "Gamma:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
msgid "Contrast boost:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
msgid "Saturation:"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
#, fuzzy
msgid "LIT^Ambient:"
msgstr "Bakgrund"
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
msgid "Intensity:"
msgstr ""
msgid "Singleplayer"
msgstr "En Spelare"
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
msgid "Instant action! (random map with bots)"
msgstr ""
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
msgid "Start Singleplayer!"
msgstr ""
msgid "Bookmark"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:523
+#: qcsrc/menu/xonotic/serverlist.c:527
msgid "Ping"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:524
+#: qcsrc/menu/xonotic/serverlist.c:528
msgid "Host name"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:525
+#: qcsrc/menu/xonotic/serverlist.c:529
msgid "Map"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:526
+#: qcsrc/menu/xonotic/serverlist.c:530
msgid "Type"
msgstr ""
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:531
msgid "Players"
msgstr ""
msgid "<AUTHOR>"
msgstr ""
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr ""
-
#: qcsrc/menu/xonotic/slider_decibels.c:50
msgid "VOL^OFF"
msgstr ""
msgid "Update to %s now!"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
"^1FEL: Texturkompression krävs men stöds ej.\n"
"^1Räkna med visuella problem.\n"
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
msgid "Arena"
msgstr "Arena"
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
msgid "Assault"
msgstr "Anfall"
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
msgid "Capture The Flag"
msgstr "Erövra Flaggan"
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
msgid "Clan Arena"
msgstr "Klan Arena"
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
msgid "Deathmatch"
msgstr "Dödsmatch"
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
msgid "Domination"
msgstr "Dominering"
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
msgid "Freeze Tag"
msgstr "Frys-Kull"
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
msgid "Keepaway"
msgstr "Håll Dig Undan"
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
msgid "Key Hunt"
msgstr "Nyckeljakt"
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
msgid "Last Man Standing"
msgstr "Herre På Täppan"
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
msgid "Nexball"
msgstr "Nexboll"
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
msgid "Onslaught"
msgstr "Stormning"
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
msgid "Race"
msgstr "Lopp"
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
msgid "Race CTS"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
msgid "Runematch"
msgstr ""
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
msgid "Team Deathmatch"
msgstr "Dödsmatch i Lag"
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "@!#%'n Tuba Throwing"
msgstr "@!#%'n Tubakastning"
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Bakgrund:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
msgid "Default"
msgstr "Standard"
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
msgid "Use default"
msgstr "Använd standard"
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
msgid "Team Color:"
msgstr "Lagfärg:"
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
msgid "Enable panel"
msgstr ""
msgid "Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:664
+#: qcsrc/server/w_crylink.qc:666
#, c-format
msgid "%s succeeded at self-destructing themself with the Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:669
+#: qcsrc/server/w_crylink.qc:671
#, c-format
msgid "%s could not hide from %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_crylink.qc:673
#, c-format
msgid "%s was too close to %s's Crylink"
msgstr ""
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_crylink.qc:675
#, c-format
msgid "%s took a close look at %s's Crylink"
msgstr ""
msgid "Electro"
msgstr ""
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
#, c-format
msgid "%s could not remember where they put plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
#, c-format
msgid "%s played with plasma"
msgstr ""
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
#, c-format
msgid "%s just noticed %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
#, c-format
msgid "%s got in touch with %s's blue ball"
msgstr ""
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
#, c-format
msgid "%s felt the electrifying air of %s's combo"
msgstr ""
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
#, c-format
msgid "%s got too close to %s's blue beam"
msgstr ""
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
#, c-format
msgid "%s was blasted by %s's blue beam"
msgstr ""
msgid "Mortar"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
#, c-format
msgid "%s tried out his own grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
#, c-format
msgid "%s detonated"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
#, c-format
msgid "%s didn't see %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
#, c-format
msgid "%s almost dodged %s's grenade"
msgstr ""
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
#, c-format
msgid "%s ate %s's grenade"
msgstr ""
msgid "Hagar"
msgstr ""
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
#, c-format
msgid "%s played with tiny rockets"
msgstr ""
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:399
#, c-format
msgid "%s hoped %s's missiles wouldn't bounce"
msgstr ""
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
#, c-format
msgid "%s was pummeled by %s"
msgstr ""
msgid "Grappling Hook"
msgstr ""
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
#, c-format
msgid "%s did the impossible"
msgstr ""
msgid "Laser"
msgstr "Master:"
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
#, c-format
msgid "%s lasered themself to hell"
msgstr ""
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
#, c-format
msgid "%s was cut in half by %s's gauntlet"
msgstr ""
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
#, c-format
msgid "%s was lasered to death by %s"
msgstr ""
msgid "Mine Layer"
msgstr "En Spelare"
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
#, c-format
msgid "%s exploded"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
#, c-format
msgid "%s got too close to %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
#, c-format
msgid "%s almost dodged %s's mine"
msgstr ""
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
#, c-format
msgid "%s stepped on %s's mine"
msgstr ""
msgid "MinstaNex"
msgstr ""
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
#, c-format
msgid "%s has been vaporized by %s"
msgstr ""
msgid "%s felt %s doing the impossible to him"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
#, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
#, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
msgstr ""
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
#, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
msgstr ""
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:251
#, c-format
-msgid "%s was tagged by %s"
+msgid "%s failed to hide from %s's rifle"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Kort"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
msgstr ""
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
#, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
msgstr ""
-#: qcsrc/server/w_rifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
#, c-format
-msgid "%s shot themself automatically"
+msgid "%s got too close to %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
#, c-format
-msgid "%s sniped themself somehow"
+msgid "%s almost dodged %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
#, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s ate %s's rocket"
msgstr ""
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
msgstr ""
-#: qcsrc/server/w_rifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
#, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
msgstr ""
-#: qcsrc/server/w_rifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Kort"
+
+#: qcsrc/server/w_shotgun.qc:219
#, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
msgstr ""
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:221
#, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
msgstr ""
#: qcsrc/server/w_tuba.qc:2
msgid "@!#%'n Tuba"
msgstr "@!#%'n Tubakastning"
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
#, c-format
msgid "%s hurt his own ears with the @!#%%'n Tuba"
msgstr ""
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
#, c-format
msgid "%s died of %s's great playing on the @!#%%'n Tuba"
msgstr ""
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
71 20 15.000000 1 // duck
91 21 30.000000 1 // duckwalk
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
71 20 15.000000 1 // duck
91 21 30.000000 1 // duckwalk
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
71 20 15.000000 1 // duck
91 21 30.000000 1 // duckwalk
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
--- /dev/null
+erebus,erebusfullbright
+erebus.001,shadowhead
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
--- /dev/null
+erebus,erebusfullbright
+erebus.001,shadowhead
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
112 16 15.000000 0 // duckjump
128 15 5.000000 1 // duckidle
143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
109 16 15.000000 0 // duckjump
125 15 5.000000 1 // duckidle
140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
-1 30 20 1 // forward
-32 30 20 1 // backward
-63 30 20 1 // left
-94 30 20 1 // right
-125 30 20 0 // jump
-0 1 20 0 // idle
+/*
+Generated framegroups file for spiderbot
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 31 30 1 // spiderbot forward
+32 31 30 1 // spiderbot backwards
+63 31 20 1 // spiderbot left
+94 31 20 1 // spiderbot right
+125 31 20 0 // spiderbot jump
+156 1 1 0 // spiderbot idle
+157 12 20 0 // spiderbot jump2
+169 7 20 0 // spiderbot jump_charge
+176 11 15 0 // spiderbot jump_fly
+187 21 20 0 // spiderbot jump_land
+208 51 15 0 // spiderbot death
+259 3 1 0 // spiderbot dead
// actually, what we want is 266.6666 for 180bpm
// but 260 takes same amount of frames and is nicer to mappers
+// jump height == sv_jumpvelocity^2 / (2*sv_gravity)
+// in this case: 42.25 qu
+// player: 24+45 qu
+// total: 111.25qu
+// this is smaller than 112 qu, so a 112 qu high corridor (7 of 8 grid units in
+// the 16 grid, and the 8th unit used for wall/floor) just lets a player jump!
sv_jumpvelocity 260
sv_wateraccelerate -1
sv_waterfriction -1
--- /dev/null
+SCM := $(shell if [ -d .svn ]; then echo svn; elif [ -d ../.git ]; then echo git; fi)
+FTEQCC ?= fteqcc
+PERL ?= perl
+
+FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"$(shell git describe)"' -DCVAR_POPCON
+FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
+FTEQCCFLAGS_PROGS ?=
+FTEQCCFLAGS_MENU ?=
+
+# NOTE: use -DUSE_FTE instead of -TFTE here!
+# It will automagically add an engine check with -TID and then change back to -TFTE
+FTEQCCFLAGS_CSPROGS ?=
+
+# xonotic build system overrides this by command line argument to turn off the update-cvarcount step
+XON_BUILDSYSTEM =
+
+all: qc
+
+.PHONY: qc
+qc:
+ $(MAKE) qc-recursive
+
+.PHONY: qc-recursive
+qc-recursive: ../menu.dat ../progs.dat ../csprogs.dat
+
+.PHONY: clean
+clean:
+ rm -f ../progs.dat ../menu.dat ../csprogs.dat
+
+FILES_CSPROGS = $(shell find client common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) server/w_*.qc
+../csprogs.dat: $(FILES_CSPROGS)
+ @echo make[1]: Entering directory \`$(PWD)/client\'
+ cd client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
+
+FILES_PROGS = $(shell find server common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) server/w_*.qc
+../progs.dat: $(FILES_PROGS)
+ @echo make[1]: Entering directory \`$(PWD)/server\'
+ cd server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
+
+FILES_MENU = $(shell find menu common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) server/w_*.qc
+../menu.dat: $(FILES_MENU)
+ @echo make[1]: Entering directory \`$(PWD)/menu\'
+ cd menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
+
+.PHONY: testcase
+testcase:
+ cd testcase && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS) -DTESTCASE="$$TESTCASE"
void CSQC_Init(void)
{
prvm_language = cvar_string("prvm_language");
-
+
#ifdef USE_FTE
#pragma target ID
__engine_check = checkextension("DP_SV_WRITEPICTURE");
GibSplash_Precache();
Casings_Precache();
DamageInfo_Precache();
+ Vehicles_Precache();
+ turrets_precache();
+
if(autocvar_cl_announcer != cl_announcer_prev) {
Announcer_Precache();
if(cl_announcer_prev)
if(newspectatee_status != spectatee_status)
{
- float i;
-
// clear race stuff
race_laptime = 0;
race_checkpointtime = 0;
{
float nags, i, j, b, f;
- nags = ReadByte();
+ nags = ReadByte(); // NAGS NAGS NAGS NAGS NAGS NAGS NADZ NAGS NAGS NAGS
+
+ if(!(nags & 4))
+ {
+ if(vote_called_vote)
+ strunzone(vote_called_vote);
+ vote_called_vote = string_null;
+ vote_active = 0;
+ }
+ else
+ {
+ vote_active = 1;
+ }
+
+ if(nags & 64)
+ {
+ vote_yescount = ReadByte();
+ vote_nocount = ReadByte();
+ vote_needed = ReadByte();
+ vote_highlighted = ReadChar();
+ }
if(nags & 128)
{
weapon_accuracy[w] = -1;
return;
}
-
+
for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
{
if(sf & f)
case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
+ case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
+ case ENT_CLIENT_TURRET: ent_turret(); break;
default:
//error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
playerslots[e].ping_movementloss = ml / 255.0;
}
-void Net_VoteDialog(float highlight) {
- if(highlight) {
- vote_highlighted = ReadByte();
- return;
- }
-
- vote_yescount = ReadByte();
- vote_nocount = ReadByte();
- vote_needed = ReadByte();
- vote_active = 1;
-}
-
-void Net_VoteDialogReset() {
- vote_active = 0;
-}
-
-void Net_Notify() {
- float type;
- type = ReadByte();
-
- if(type == CSQC_KILLNOTIFY)
- {
- HUD_KillNotify(ReadString(), ReadString(), ReadString(), ReadShort(), ReadByte());
- }
- else if(type == CSQC_CENTERPRINT)
- {
- HUD_Centerprint(ReadString(), ReadString(), ReadShort(), ReadByte());
- }
-}
-
void Net_WeaponComplain() {
complain_weapon = ReadByte();
Net_TeamNagger();
bHandled = true;
break;
- case TE_CSQC_VOTE:
- Net_VoteDialog(ReadByte());
- bHandled = true;
- break;
- case TE_CSQC_VOTERESET:
- Net_VoteDialogReset();
- bHandled = true;
- break;
case TE_CSQC_LIGHTNINGARC:
Net_ReadLightningarc();
bHandled = true;
announce_snd = strzone(ReadString());
bHandled = true;
break;
- case TE_CSQC_NOTIFY:
- Net_Notify();
+ case TE_CSQC_KILLNOTIFY:
+ HUD_KillNotify(ReadString(), ReadString(), ReadString(), ReadShort(), ReadByte());
+ bHandled = true;
+ break;
+ case TE_CSQC_KILLCENTERPRINT:
+ HUD_KillCenterprint(ReadString(), ReadString(), ReadShort(), ReadByte());
+ bHandled = true;
+ break;
+ case TE_CSQC_CENTERPRINT_GENERIC:
+ float id;
+ string s;
+ id = ReadByte();
+ s = ReadString();
+ if (id != 0 && s != "")
+ centerprint_generic(id, s, ReadByte(), ReadByte());
+ else
+ centerprint_generic(id, s, 0, 0);
bHandled = true;
break;
case TE_CSQC_WEAPONCOMPLAIN:
Net_WeaponComplain();
bHandled = true;
break;
+ case TE_CSQC_VEHICLESETUP:
+ Net_VehicleSetup();
+ bHandled = true;
+ break;
default:
// No special logic for this temporary entity; return 0 so the engine can handle it
bHandled = false;
-#define spider_rocket_icon "gfx/vehicles/rocket_ico.tga"
-#define spider_rocket_targ "gfx/vehicles/target.tga"
-#define SPIDER_CROSS "textures/spiderbot/cross.tga"
-#define rkt_size 32
-#define rld_size_x 256
-#define rld_size_y 16
-
-void CSQC_WAKIZASHI_HUD();
-
entity porto;
vector polyline[16];
-float trace_dphitcontents;
-float trace_networkentity;
float Q3SURFACEFLAG_SLICK = 2; // low friction surface
float DPCONTENTS_SOLID = 1; // blocks player movement
float DPCONTENTS_BODY = 32; // blocks player movement
if (previous_game_starttime != startTime) {
if ((time + 5.0) < startTime) {
//if connecting to server while restart was active don't always play prepareforbattle
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
}
if (time < startTime) {
restartAnnouncer = spawn();
zoomspeed = 3.5;
zoomdir = button_zoom;
- if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here
+ if(hud == HUD_NORMAL)
+ if((activeweapon == WEP_NEX && nex_scope) || (activeweapon == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here
zoomdir += button_attack2;
if(spectatee_status > 0 || isdemo())
{
if(spectatorbutton_zoom)
- zoomdir = 0 + !zoomdir;
- // do not even THINK about removing this 0
- // _I_ know what I am doing
- // fteqcc does not
+ {
+ if(zoomdir)
+ zoomdir = 0;
+ else
+ zoomdir = 1;
+ }
+ // fteqcc failed twice here already, don't optimize this
}
if(zoomdir)
else
setsensitivityscale(1);
- velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
- avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
- velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
-
- //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+ if (autocvar_cl_velocityzoom)
+ {
+ velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
+ avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
+ velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
+ //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+ }
+ else
+ velocityzoom = 1;
float frustumx, frustumy, fovx, fovy;
frustumy = tan(fov * M_PI / 360.0) * 0.75 * current_viewzoom * velocityzoom;
vector freeze_org, freeze_ang;
entity nightvision_noise, nightvision_noise2;
+#define MAX_TIME_DIFF 5
float pickup_crosshair_time, pickup_crosshair_size;
float hit_time, typehit_time;
float nextsound_hit_time, nextsound_typehit_time;
float myhealth, myhealth_prev;
float myhealth_flash;
+float old_blurradius, old_bluralpha;
+float old_sharpen_intensity;
+
vector myhealth_gentlergb;
float contentavgalpha, liquidalpha_prev;
float eventchase_current_distance;
+vector damage_blurpostprocess, content_blurpostprocess;
+
float checkfail[16];
void CSQC_UpdateView(float w, float h)
entity e;
float fov;
float f, i, j;
- vector v, vo;
+ vector v;
vector vf_size, vf_min;
float a;
+ hud = getstati(STAT_HUD);
button_attack2 = (input_buttons & BUTTON_3);
button_zoom = (input_buttons & BUTTON_4);
+ // FIXME do we need this hack?
+ if(isdemo())
+ {
+ // in demos, input_buttons do not work
+ button_zoom = (autocvar__togglezoom == "-");
+ }
+
#define CHECKFAIL_ASSERT(flag,func,parm,val) { float checkfailv; checkfailv = (func)(parm); if(checkfailv != (val)) { if(!checkfail[(flag)]) localcmd(sprintf("\ncmd checkfail %s %s %d %d\n", #func, parm, val, checkfailv)); checkfail[(flag)] = 1; } } ENDS_WITH_CURLY_BRACE
CHECKFAIL_ASSERT(0, cvar_type, "\{100}\{105}\{118}\{48}\{95}\{101}\{118}\{97}\{100}\{101}", 0);
CHECKFAIL_ASSERT(1, cvar_type, "\{97}\{97}\{95}\{101}\{110}\{97}\{98}\{108}\{101}", 0);
myteam = GetPlayerColor(player_localentnum - 1);
ticrate = getstatf(STAT_MOVEVARS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
- vo = '0 0 1' * getstati(STAT_VIEWHEIGHT);
-
- if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
- {
- R_SetView(VF_ORIGIN, freeze_org);
- R_SetView(VF_ANGLES, freeze_ang);
- }
- else
- {
- freeze_org = R_SetView3fv(VF_ORIGIN);
- freeze_ang = R_SetView3fv(VF_ANGLES);
- }
// event chase camera
if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
{
if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || intermission)
{
+ // make special vector since we can't use view_origin (It is one frame old as of this code, it gets set later with the results this code makes.)
+ vector current_view_origin = R_SetView3fv(VF_ORIGIN);
+
// We must enable chase_active to get a third person view (weapon viewmodel hidden and own player model showing).
// Ideally, there should be another way to enable third person cameras, such as through R_SetView()
if(!autocvar_chase_active)
vector eventchase_target_origin;
makevectors(view_angles);
// pass 1, used to check where the camera would go and obtain the trace_fraction
- eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance;
-
- WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+ eventchase_target_origin = current_view_origin - v_forward * eventchase_current_distance;
+ WarpZone_TraceLine(current_view_origin, eventchase_target_origin, MOVE_WORLDONLY, self);
// pass 2, also multiplying view_forward with trace_fraction, to prevent the camera from going through walls
// The 0.1 subtraction is to not limit the camera precisely at the wall surface, as that allows the view to poke through
- eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
- WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+ eventchase_target_origin = current_view_origin - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+ WarpZone_TraceLine(current_view_origin, eventchase_target_origin, MOVE_WORLDONLY, self);
R_SetView(VF_ORIGIN, trace_endpos);
R_SetView(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles));
eventchase_current_distance = 0; // start from 0 next time
}
}
+
+ // do lockview after event chase camera so that it still applies whenever necessary.
+ if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
+ {
+ R_SetView(VF_ORIGIN, freeze_org);
+ R_SetView(VF_ANGLES, freeze_ang);
+ }
+ else
+ {
+ freeze_org = R_SetView3fv(VF_ORIGIN);
+ freeze_ang = R_SetView3fv(VF_ANGLES);
+ }
WarpZone_FixView();
//WarpZone_FixPMove();
TargetMusic_Advance();
Fog_Force();
- drawframetime = max(0.000001, time - drawtime);
+ if(drawtime == 0)
+ drawframetime = 0.01666667; // when we don't know fps yet, we assume 60fps
+ else
+ drawframetime = bound(0.000001, time - drawtime, 1);
drawtime = time;
// watch for gametype changes here...
}
ColorTranslateMode = autocvar_cl_stripcolorcodes;
- activeweapon = getstati(STAT_SWITCHWEAPON);
+
+ // next WANTED weapon (for HUD)
+ switchweapon = getstati(STAT_SWITCHWEAPON);
+
+ // currently switching-to weapon (for crosshair)
+ switchingweapon = getstati(STAT_SWITCHINGWEAPON);
+
+ // actually active weapon (for zoom)
+ activeweapon = getstati(STAT_ACTIVEWEAPON);
+
f = (serverflags & SERVERFLAG_TEAMPLAY);
if(f != teamplay)
{
HUD_InitScores();
}
- if(last_weapon != activeweapon) {
+ if(last_switchweapon != switchweapon) {
weapontime = time;
- last_weapon = activeweapon;
+ last_switchweapon = switchweapon;
+ }
+ if(last_activeweapon != activeweapon) {
+ last_activeweapon = activeweapon;
e = get_weaponinfo(activeweapon);
if(e.netname != "")
// ALWAYS Clear Current Scene First
R_ClearScene();
+#ifdef WORKAROUND_XON010
+ if(checkextension("DP_CSQC_ROTATEMOVES"))
+ {
+#endif
R_SetView(VF_ORIGIN, view_origin);
R_SetView(VF_ANGLES, view_angles);
+#ifdef WORKAROUND_XON010
+ }
+#endif
// FIXME engine bug? VF_SIZE and VF_MIN are not restored to sensible values by this
R_SetView(VF_SIZE, vf_size);
R_PolygonVertex(autocvar_vid_conheight * '0 1 0', tc_01, rgb, a);
R_EndPolygon();
}
-
+
// Draw the aiming reticle for weapons that use it
// reticle_type is changed to the item we are zooming / aiming with, to decide which reticle to use
// It must be a persisted float for fading out to work properly (you let go of the zoom button for
// the view to go back to normal, so reticle_type would become 0 as we fade out)
- if(spectatee_status || getstati(STAT_HEALTH) <= 0)
+ if(spectatee_status || getstati(STAT_HEALTH) <= 0 || hud != HUD_NORMAL)
reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
reticle_type = 2; // nex zoom
reticle_type = 1; // normal zoom
else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_RIFLE && button_attack2)
reticle_type = 2; // nex zoom
-
+
if (reticle_type)
{
if(autocvar_cl_reticle_stretch)
{
float contentalpha_temp, incontent, liquidalpha, contentfadetime;
vector liquidcolor;
-
+
switch(pointcontents(view_origin))
{
case CONTENT_WATER:
liquidcolor = stov(autocvar_hud_contents_water_color);
incontent = 1;
break;
-
+
case CONTENT_LAVA:
liquidalpha = autocvar_hud_contents_lava_alpha;
liquidcolor = stov(autocvar_hud_contents_lava_color);
incontent = 1;
- break;
-
+ break;
+
case CONTENT_SLIME:
liquidalpha = autocvar_hud_contents_slime_alpha;
liquidcolor = stov(autocvar_hud_contents_slime_color);
incontent = 1;
break;
-
+
default:
liquidalpha = 0;
liquidcolor = '0 0 0';
incontent = 0;
break;
}
-
+
if(incontent) // fade in/out at different speeds so you can do e.g. instant fade when entering water and slow when leaving it.
{ // also lets delcare previous values for blending properties, this way it isn't reset until after you have entered a different content
contentfadetime = autocvar_hud_contents_fadeintime;
}
else
contentfadetime = autocvar_hud_contents_fadeouttime;
-
+
contentalpha_temp = bound(0, drawframetime / max(0.0001, contentfadetime), 1);
contentavgalpha = contentavgalpha * (1 - contentalpha_temp) + incontent * contentalpha_temp;
-
+
if(contentavgalpha)
drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, liquidcolor_prev, contentavgalpha * liquidalpha_prev, DRAWFLAG_NORMAL);
+
+ if(autocvar_hud_postprocessing)
+ {
+ if(autocvar_hud_contents_blur && contentavgalpha)
+ {
+ content_blurpostprocess_x = 1;
+ content_blurpostprocess_y = contentavgalpha * autocvar_hud_contents_blur;
+ content_blurpostprocess_z = contentavgalpha * autocvar_hud_contents_blur_alpha;
+ }
+ else
+ {
+ content_blurpostprocess_x = 0;
+ content_blurpostprocess_y = 0;
+ content_blurpostprocess_z = 0;
+ }
+ }
}
if(autocvar_hud_damage && !autocvar_chase_active)
}
else
drawpic(splash_pos, "gfx/blood", splash_size, stov(autocvar_hud_damage_color), bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
+
+ if(autocvar_hud_postprocessing)
+ {
+ if(autocvar_hud_damage_blur && myhealth_flash_temp)
+ {
+ damage_blurpostprocess_x = 1;
+ damage_blurpostprocess_y = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur;
+ damage_blurpostprocess_z = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur_alpha;
+ }
+ else
+ {
+ damage_blurpostprocess_x = 0;
+ damage_blurpostprocess_y = 0;
+ damage_blurpostprocess_z = 0;
+ }
+ }
+ }
+
+ if(autocvar_hud_postprocessing) // TODO: Remove this code and re-do the postprocess handling in the engine, where it properly belongs.
+ {
+ // enable or disable rendering types if they are used or not
+ if(cvar("r_glsl_postprocess_uservec1_enable") != (autocvar_hud_postprocessing_maxbluralpha != 0)) { cvar_set("r_glsl_postprocess_uservec1_enable", ftos(autocvar_hud_postprocessing_maxbluralpha != 0)); }
+ if(cvar("r_glsl_postprocess_uservec2_enable") != (autocvar_hud_powerup != 0)) { cvar_set("r_glsl_postprocess_uservec2_enable", ftos(autocvar_hud_powerup != 0)); }
+
+ // blur postprocess handling done first (used by hud_damage and hud_contents)
+ if((damage_blurpostprocess_x || content_blurpostprocess_x) && autocvar_chase_active >= 0) // not while the event chase camera is active
+ {
+ float blurradius = bound(0, damage_blurpostprocess_y + content_blurpostprocess_y, autocvar_hud_postprocessing_maxblurradius);
+ float bluralpha = bound(0, damage_blurpostprocess_z + content_blurpostprocess_z, autocvar_hud_postprocessing_maxbluralpha);
+ if(blurradius != old_blurradius || bluralpha != old_bluralpha) // reduce cvar_set spam as much as possible
+ {
+ cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(blurradius), " ", ftos(bluralpha), " 0 0"));
+ old_blurradius = blurradius;
+ old_bluralpha = bluralpha;
+ }
+ }
+ else if(cvar_string("r_glsl_postprocess_uservec1") != "0 0 0 0") // reduce cvar_set spam as much as possible
+ {
+ cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0");
+ old_blurradius = 0;
+ old_bluralpha = 0;
+ }
+
+ // edge detection postprocess handling done second (used by hud_powerup)
+ float sharpen_intensity, strength_finished = getstatf(STAT_STRENGTH_FINISHED), invincible_finished = getstatf(STAT_INVINCIBLE_FINISHED);
+ if (strength_finished - time > 0) { sharpen_intensity += (strength_finished - time); }
+ if (invincible_finished - time > 0) { sharpen_intensity += (invincible_finished - time); }
+
+ sharpen_intensity = bound(0, ((getstati(STAT_HEALTH) > 0) ? sharpen_intensity : 0), 5); // Check to see if player is alive (if not, set 0) - also bound to fade out starting at 5 seconds.
+
+ if(autocvar_hud_powerup && sharpen_intensity > 0 && autocvar_chase_active >= 0) // not while the event chase camera is active
+ {
+ if(sharpen_intensity != old_sharpen_intensity) // reduce cvar_set spam as much as possible
+ {
+ cvar_set("r_glsl_postprocess_uservec2", strcat(ftos((sharpen_intensity / 5) * autocvar_hud_powerup), " ", ftos(-sharpen_intensity * autocvar_hud_powerup), " 0 0"));
+ old_sharpen_intensity = sharpen_intensity;
+ }
+ }
+ else if(cvar_string("r_glsl_postprocess_uservec2") != "0 0 0 0") // reduce cvar_set spam as much as possible
+ {
+ cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0");
+ old_sharpen_intensity = 0;
+ }
}
if(menu_visible)
hit_time = getstatf(STAT_HIT_TIME);
if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
{
- sound(world, CHAN_AUTO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+ if(time - hit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+ sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+
nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
}
typehit_time = getstatf(STAT_TYPEHIT_TIME);
- if(typehit_time > nextsound_typehit_time)
+ if(typehit_time > nextsound_typehit_time)
{
- sound(world, CHAN_AUTO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+ if(time - typehit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+ sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+
nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
}
- float hud;
- hud = getstati(STAT_HUD);
- if(hud == HUD_SPIDERBOT)
- CSQC_SPIDER_HUD();
- else if(hud == HUD_WAKIZASHI)
- CSQC_WAKIZASHI_HUD();
- else if(hud == HUD_RAPTOR)
- CSQC_RAPTOR_HUD();
- else
+ //else
{
if(gametype == GAME_FREEZETAG)
{
CSQC_common_hud();
// crosshair goes VERY LAST
- if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1) {
+ if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL) {
string wcross_style;
float wcross_alpha, wcross_resolution;
wcross_style = autocvar_crosshair;
float wcross_scale, wcross_blur;
if (autocvar_crosshair_per_weapon || autocvar_crosshair_color_per_weapon) {
- e = get_weaponinfo(activeweapon);
+ e = get_weaponinfo(switchingweapon);
if (e && e.netname != "")
{
wcross_wep = e.netname;
else if(autocvar_crosshair_color_by_health)
{
local float x = getstati(STAT_HEALTH);
-
+
//x = red
//y = green
//z = blue
-
+
wcross_color_z = 0;
-
+
if(x > 200)
{
wcross_color_x = 0;
{
wcross_color_x = 1;
wcross_color_y = 1;
- wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+ wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
}
else if(x > 20)
{
if(autocvar_crosshair_pickup)
{
- if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP))
+ float stat_pickup_time = getstatf(STAT_LAST_PICKUP);
+
+ if(pickup_crosshair_time < stat_pickup_time)
{
- pickup_crosshair_size = 1;
- pickup_crosshair_time = getstatf(STAT_LAST_PICKUP);
+ if(time - stat_pickup_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+ pickup_crosshair_size = 1;
+
+ pickup_crosshair_time = stat_pickup_time;
}
if(pickup_crosshair_size > 0)
wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
}
-
- vector hitindication_color;
+
if(autocvar_crosshair_hitindication)
{
- hitindication_color = stov(autocvar_crosshair_hitindication_color);
+ vector hitindication_color = stov(autocvar_crosshair_hitindication_color);
if(hitindication_crosshair_time < hit_time)
{
- hitindication_crosshair_size = 1;
+ if(time - hit_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+ hitindication_crosshair_size = 1;
+
hitindication_crosshair_time = hit_time;
}
f = autocvar_crosshair_effect_speed;
if(f < 0)
- f *= -2 * g_weaponswitchdelay;
+ f *= -2 * g_weaponswitchdelay; // anim starts when weapon has been lowered and new weapon comes up
if(wcross_scale != wcross_scale_goal_prev || wcross_alpha != wcross_alpha_goal_prev || wcross_color != wcross_color_goal_prev)
{
wcross_changedonetime = time + f;
wcross_alpha *= 1 - autocvar__menu_alpha;
wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
- // crosshair rings for weapon stats
- if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
+ if(wcross_scale >= 0.001 && wcross_alpha >= 0.001)
{
- // declarations and stats
- float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
- string ring_image, ring_inner_image;
- vector ring_rgb, ring_inner_rgb;
-
- ring_scale = autocvar_crosshair_ring_size;
+ // crosshair rings for weapon stats
+ if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
+ {
+ // declarations and stats
+ float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
+ string ring_image, ring_inner_image;
+ vector ring_rgb, ring_inner_rgb;
- float weapon_clipload, weapon_clipsize;
- weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
- weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
+ ring_scale = autocvar_crosshair_ring_size;
- float nex_charge, nex_chargepool;
- nex_charge = getstatf(STAT_NEX_CHARGE);
- nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
+ float weapon_clipload, weapon_clipsize;
+ weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
+ weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
- if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
- nex_charge_movingavg = nex_charge;
-
+ float nex_charge, nex_chargepool;
+ nex_charge = getstatf(STAT_NEX_CHARGE);
+ nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
- // handle the values
- if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
- {
- if (nex_chargepool || use_nex_chargepool) {
- use_nex_chargepool = 1;
- ring_inner_value = nex_chargepool;
- } else {
- nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
- ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1);
- }
-
- ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
- ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
- ring_inner_image = "gfx/crosshair_ring_inner.tga";
-
- // draw the outer ring to show the current charge of the weapon
- ring_value = nex_charge;
- ring_alpha = autocvar_crosshair_ring_nex_alpha;
- ring_rgb = wcross_color;
- ring_image = "gfx/crosshair_ring_nexgun.tga";
- }
- else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer)
- {
- ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
- ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
- ring_rgb = wcross_color;
- ring_image = "gfx/crosshair_ring.tga";
- }
- else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
- {
- ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
- ring_alpha = autocvar_crosshair_ring_hagar_alpha;
- ring_rgb = wcross_color;
- ring_image = "gfx/crosshair_ring.tga";
- }
+ if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
+ nex_charge_movingavg = nex_charge;
- if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
- {
- ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
- ring_scale = autocvar_crosshair_ring_reload_size;
- ring_alpha = autocvar_crosshair_ring_reload_alpha;
- ring_rgb = wcross_color;
-
- // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
- // if a new image for another weapon is added, add the code (and its respective file/value) here
- if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
- ring_image = "gfx/crosshair_ring_rifle.tga";
- else
+
+ // handle the values
+ if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
+ {
+ if (nex_chargepool || use_nex_chargepool) {
+ use_nex_chargepool = 1;
+ ring_inner_value = nex_chargepool;
+ } else {
+ nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
+ ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1);
+ }
+
+ ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
+ ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+ ring_inner_image = "gfx/crosshair_ring_inner.tga";
+
+ // draw the outer ring to show the current charge of the weapon
+ ring_value = nex_charge;
+ ring_alpha = autocvar_crosshair_ring_nex_alpha;
+ ring_rgb = wcross_color;
+ ring_image = "gfx/crosshair_ring_nexgun.tga";
+ }
+ else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer)
+ {
+ ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
+ ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
+ ring_rgb = wcross_color;
ring_image = "gfx/crosshair_ring.tga";
- }
+ }
+ else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
+ {
+ ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
+ ring_alpha = autocvar_crosshair_ring_hagar_alpha;
+ ring_rgb = wcross_color;
+ ring_image = "gfx/crosshair_ring.tga";
+ }
- if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
+ if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
+ {
+ ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
+ ring_scale = autocvar_crosshair_ring_reload_size;
+ ring_alpha = autocvar_crosshair_ring_reload_alpha;
+ ring_rgb = wcross_color;
+
+ // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
+ // if a new image for another weapon is added, add the code (and its respective file/value) here
+ if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
+ ring_image = "gfx/crosshair_ring_rifle.tga";
+ else
+ ring_image = "gfx/crosshair_ring.tga";
+ }
- if (ring_value)
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
- }
+ // if in weapon switch animation, fade ring out/in
+ if(g_weaponswitchdelay > 0)
+ {
+ f = (time - wcross_name_changestarttime) / g_weaponswitchdelay;
+ if(f > 0 && f < 2)
+ ring_alpha *= fabs(1 - f);
+ }
+
+ if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
+
+ if (ring_value)
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
+ }
#define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
- do \
- { \
- if(wcross_blur > 0) \
+ do \
{ \
- for(i = -2; i <= 2; ++i) \
+ if(wcross_blur > 0) \
+ { \
+ for(i = -2; i <= 2; ++i) \
for(j = -2; j <= 2; ++j) \
- M(i,j,sz,wcross_name,wcross_alpha*0.04); \
- } \
- else \
- { \
- M(0,0,sz,wcross_name,wcross_alpha); \
+ M(i,j,sz,wcross_name,wcross_alpha*0.04); \
+ } \
+ else \
+ { \
+ M(0,0,sz,wcross_name,wcross_alpha); \
+ } \
} \
- } \
- while(0)
+ while(0)
#define CROSSHAIR_DRAW_SINGLE(i,j,sz,wcross_name,wcross_alpha) \
- drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
+ drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
#define CROSSHAIR_DRAW(sz,wcross_name,wcross_alpha) \
- CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
+ CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
- if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
- {
- f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
- wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
- CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
- f = 1 - f;
- }
- else
- {
- f = 1;
- }
+ if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
+ {
+ f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
+ wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
+ CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
+ f = 1 - f;
+ }
+ else
+ {
+ f = 1;
+ }
+ wcross_name_alpha_goal_prev = f;
- wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
- CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
-
- if(autocvar_crosshair_dot)
- {
- vector wcross_color_old;
- wcross_color_old = wcross_color;
- if(autocvar_crosshair_dot_color != "0")
- wcross_color = stov(autocvar_crosshair_dot_color);
- CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
- wcross_color = wcross_color_old;
- }
-
- wcross_name_alpha_goal_prev = f;
+ wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
+ CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
+
+ if(autocvar_crosshair_dot)
+ {
+ vector wcross_color_old;
+ wcross_color_old = wcross_color;
+ if(autocvar_crosshair_dot_color != "0")
+ wcross_color = stov(autocvar_crosshair_dot_color);
+ CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
+ // FIXME why don't we use wcross_alpha here?
+ wcross_color = wcross_color_old;
+ }
+ }
}
else
{
if(autocvar__hud_configure)
HUD_Panel_Mouse();
-
+
+ if(hud && !intermission)
+ {
+ if(hud == HUD_SPIDERBOT)
+ CSQC_SPIDER_HUD();
+ else if(hud == HUD_WAKIZASHI)
+ CSQC_WAKIZASHI_HUD();
+ else if(hud == HUD_RAPTOR)
+ CSQC_RAPTOR_HUD();
+ else if(hud == HUD_BUMBLEBEE)
+ CSQC_BUMBLE_HUD();
+ }
// let's reset the view back to normal for the end
R_SetView(VF_MIN, '0 0 0');
R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h);
}
-#define spider_h "gfx/vehicles/hud_bg.tga"
-#define spider_b "gfx/vehicles/sbot.tga"
-#define spider_r "gfx/vehicles/sbot_rpods.tga"
-#define spider_g "gfx/vehicles/sbot_mguns.tga"
-#define spider_s "gfx/vehicles/shiled.tga"
-#define spider_a1 "gfx/hud/sb_rocket.tga"
-#define spider_a2 "gfx/sb_bullets.tga"
-
-void CSQC_SPIDER_HUD()
-{
- float rockets, reload, heat, hp, shield;
- vector picsize, hudloc;
-
- // Fetch health & ammo stats
- hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
- shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
- heat = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2);
- rockets = getstati(STAT_VEHICLESTAT_AMMO2);
- reload = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
-
- // Draw the crosshairs
- picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
- picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
- hudloc_y = 4;
- hudloc_x = 4;
-
- picsize = drawgetimagesize(spider_h) * 0.5;
- drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
- picsize = drawgetimagesize(spider_a2) * 0.5;
- drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
- drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '136 102 0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-
- picsize = drawgetimagesize(spider_a1) * 0.85;
- if(rockets == 9)
- {
- drawpic(hudloc + '132 54 0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
- }
- else
- {
- drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '179 69 0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
- }
-
- picsize = drawgetimagesize(spider_b) * 0.5;
- hudloc_y = 10.5;
- hudloc_x = 10.5;
-
- drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
- drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' * heat, 1, DRAWFLAG_NORMAL);
-
- /*
- // Draw health bar
- p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
- p = p + '0 1 0' * vid_conheight - '0 32 0';
- //pp = ('0 1 0' * hp) + ('1 0 0' * (1-hp));
- drawfill(p, '256 0 0' * shield + '0 8 0' , '0.5 0.5 1', 0.75, DRAWFLAG_NORMAL);
- p_y += 8;
- drawfill(p, '256 0 0' * hp + '0 8 0' , '0 1 0', 0.75, DRAWFLAG_NORMAL);
- p_x += 256 * hp;
- drawfill(p, '256 0 0' * (1-hp) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
- // Draw minigun heat indicator
- p = '0.5 0 0' * (vid_conwidth - 256);
- p = p + '0 1 0' * vid_conheight - '0 34 0';
- drawfill(p, '256 0 0' * (1-heat) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL);
- p_x += 256 * (1-heat);
- drawfill(p, '256 0 0' * heat + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL);
-
-
- // Draw rocket icons for loaded/empty tubes.
- pp = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
- pp += '0 1 0' * vid_conheight - '0 64 0';
- for(i = 0; i < 8; ++i)
- {
- p = pp + '1 0 0' * (rkt_size * i);
- if(rockets == 8)
- {
- if(floor(reload * 8) == i)
- {
- drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 0 0' + '0 1 0' * ((reload*8)-i), 0.75 , DRAWFLAG_NORMAL);
- }
- else if(i < reload * 8)
- drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 1 0', 0.75 , DRAWFLAG_NORMAL);
- else
- drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0.5 0.5 0.5', 0.75, DRAWFLAG_NORMAL);
- }
- else
- {
- if(i < rockets)
- drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 0 0', 0.25, DRAWFLAG_NORMAL);
- else
- drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 1 0' * reload, 0.75, DRAWFLAG_NORMAL);
- }
- }
- */
-
- if (scoreboard_showscores)
- {
- HUD_DrawScoreboard();
- HUD_DrawCenterPrint();
- }
-
-}
-
-#define raptor_h "gfx/vehicles/hud_bg.tga"
-#define raptor_b "gfx/vehicles/raptor.tga"
-#define raptor_g1 "gfx/vehicles/raptor_guns.tga"
-#define raptor_g2 "gfx/vehicles/raptor_bombs.tga"
-#define raptor_s "gfx/vehicles/shiled.tga"
-
-void CSQC_RAPTOR_HUD()
+void CSQC_common_hud(void)
{
- float reload, hp, shield, energy;
- vector picsize, hudloc;
-
- // Fetch health & ammo stats
- hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
- shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
- reload = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
- energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1);
-
- // Draw the crosshairs
- picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
- picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
- hudloc_y = 4;
- hudloc_x = 4;
-
- picsize = drawgetimagesize(raptor_h) * 0.5;
- drawpic(hudloc, raptor_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
- picsize = drawgetimagesize(spider_a2) * 0.5;
- drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
- drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'15 15 0','0.5 0.5 1', 1, DRAWFLAG_NORMAL);
-
-
- picsize = drawgetimagesize(spider_a1) * 0.85;
- if(reload == 1)
- {
- drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL);
- }
- else
+ // do some accuracy var caching
+ float i;
+ if(!(gametype == GAME_RACE || gametype == GAME_CTS))
{
- drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL);
+ if(autocvar_accuracy_color_levels != acc_color_levels)
+ {
+ if(acc_color_levels)
+ strunzone(acc_color_levels);
+ acc_color_levels = strzone(autocvar_accuracy_color_levels);
+ acc_levels = tokenize(acc_color_levels);
+ if (acc_levels > MAX_ACCURACY_LEVELS)
+ acc_levels = MAX_ACCURACY_LEVELS;
+
+ for (i = 0; i < acc_levels; ++i)
+ acc_lev[i] = stof(argv(i)) / 100.0;
+ }
+ // let know that acc_col[] needs to be loaded
+ acc_col_x[0] = -1;
}
- picsize = drawgetimagesize(raptor_b) * 0.5;
- hudloc_y = 10.5;
- hudloc_x = 10.5;
+ HUD_Main(); // always run these functions for alpha checks
+ HUD_DrawScoreboard();
- drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
- drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL);
-
-
- if (scoreboard_showscores)
- {
- HUD_DrawScoreboard();
- HUD_DrawCenterPrint();
- }
-
-}
-
-#define waki_h "gfx/vehicles/hud_bg.tga"
-#define waki_b "gfx/vehicles/waki.tga"
-#define waki_e "gfx/vehicles/waki_e.tga"
-#define waki_g "gfx/vehicles/waki_guns.tga"
-#define waki_r "gfx/vehicles/waki_rockets.tga"
-#define waki_s "gfx/vehicles/shiled.tga"
-
-#define waki_a1 "gfx/hud/sb_rocket.tga"
-#define waki_a2 "gfx/sb_cells.tga"
-
-void CSQC_WAKIZASHI_HUD()
-{
- // 0--1 floats. 1 = 100%, 0.6 = 50%.
- float health, shield, energy, rockets;
- vector picsize, hudloc;
-
- picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
- picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
-/*
-const float STAT_VEHICLESTAT_HEALTH = 60;
-const float STAT_VEHICLESTAT_SHIELD = 61;
-const float STAT_VEHICLESTAT_ENERGY = 62;
-const float STAT_VEHICLESTAT_AMMO1 = 63;
-const float STAT_VEHICLESTAT_RELAOD1 = 64;
-const float STAT_VEHICLESTAT_AMMO2 = 65;
-const float STAT_VEHICLESTAT_RELOAD2 = 66;
-*/
- health = min(getstatf(STAT_VEHICLESTAT_HEALTH), 1);
- shield = min(getstatf(STAT_VEHICLESTAT_SHIELD), 1);
- energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1);
- rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
-
- hudloc_y = 4;
- hudloc_x = 4;
-
- picsize = drawgetimagesize(waki_h) * 0.5;
- drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
- picsize = drawgetimagesize(waki_a2) * 0.7;
- drawpic(hudloc + '116 92 0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-
- drawstring(hudloc + '145 19 0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-
- drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL);
-
- picsize = drawgetimagesize(waki_a1) * 0.75;
- if(rockets == 1)
- {
- drawpic(hudloc + '140 55 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
- drawpic(hudloc + '144 59 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
- }
- else
+ if (scoreboard_active) // scoreboard/accuracy
+ HUD_Reset();
+ else if (intermission == 2) // map voting screen
{
- drawpic(hudloc + '140 55 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
- drawpic(hudloc + '144 59 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
- drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+ HUD_FinaleOverlay();
+ HUD_Reset();
}
-
- picsize = drawgetimagesize(waki_b) * 0.5;
- hudloc_y = 10.5;
- hudloc_x = 10.5;
-
- drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
- drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL);
- drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
-
-
-
/*
- p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
- p = p + '0 1 0' * vid_conheight - '0 32 0';
-
- // Draw health bar
- p_y += 8;
- drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL);
- p_x += 256 * health;
- drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
- // Draw shiled bar
- p_x -= 256 * health;
- p_y += 4;
- drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL);
-
- // Draw energy
- //p_x -= 256 * health;
- p_y -= 8;
- drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL);
-
- // Draw rockets bar
- p_y += 12;
- drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
- */
-
-
-
-
- if (scoreboard_showscores)
- {
- HUD_DrawScoreboard();
- HUD_DrawCenterPrint();
- }
-
-}
-
-void CSQC_common_hud(void)
-{
- // HUD_SortFrags(); done in HUD_Draw
- float hud;
- hud = getstati(STAT_HUD);
-
- //hud = 10;
switch(hud)
{
- case HUD_NORMAL:
- // do some accuracy var caching
- float i;
- if(!(gametype == GAME_RACE || gametype == GAME_CTS))
- {
- if(autocvar_accuracy_color_levels != acc_color_levels)
- {
- if(acc_color_levels)
- strunzone(acc_color_levels);
- acc_color_levels = strzone(autocvar_accuracy_color_levels);
- acc_levels = tokenize(acc_color_levels);
- if (acc_levels > MAX_ACCURACY_LEVELS)
- acc_levels = MAX_ACCURACY_LEVELS;
-
- for (i = 0; i < acc_levels; ++i)
- acc_lev[i] = stof(argv(i)) / 100.0;
- }
- // let know that acc_col[] needs to be loaded
- acc_col_x[0] = -1;
- }
-
- HUD_Main(); // always run these functions for alpha checks
- HUD_DrawScoreboard();
-
- if (scoreboard_active) // scoreboard/accuracy
- {
- HUD_Reset();
- // HUD_DrawScoreboard takes care of centerprint_start
- }
- else if (intermission == 2) // map voting screen
- {
- HUD_FinaleOverlay();
- HUD_Reset();
-
- centerprint_start_x = 0;
- centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
- }
- else // hud
- {
- centerprint_start_x = 0;
- centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
- }
-
- HUD_DrawCenterPrint();
- break;
-
case HUD_SPIDERBOT:
CSQC_SPIDER_HUD();
break;
case HUD_WAKIZASHI:
CSQC_WAKIZASHI_HUD();
break;
+
+ case HUD_BUMBLEBEE:
+ CSQC_BUMBLE_HUD();
+ break;
}
+ */
}
float autocvar_g_balance_tuba_attenuation;
float autocvar_g_balance_tuba_fadetime;
float autocvar_g_balance_tuba_volume;
+float autocvar_g_balance_tuba_pitchstep;
float autocvar_g_warmup_limit;
+var float autocvar_g_waypointsprite_uppercase = 1;
var float autocvar_g_waypointsprite_alpha = 1;
var float autocvar_g_waypointsprite_crosshairfadealpha = 1;
float autocvar_g_waypointsprite_crosshairfadedistance;
var float autocvar_g_waypointsprite_edgefadealpha = 1;
float autocvar_g_waypointsprite_edgefadedistance;
var float autocvar_g_waypointsprite_edgefadescale = 1;
+var float autocvar_g_waypointsprite_edgeoffset_bottom = 0;
+var float autocvar_g_waypointsprite_edgeoffset_left = 0;
+var float autocvar_g_waypointsprite_edgeoffset_right = 0;
+var float autocvar_g_waypointsprite_edgeoffset_top = 0;
+var float autocvar_g_waypointsprite_fontsize = 12;
float autocvar_g_waypointsprite_minalpha;
float autocvar_g_waypointsprite_minscale;
float autocvar_g_waypointsprite_normdistance;
var float autocvar_g_waypointsprite_scale = 1;
+float autocvar_g_waypointsprite_spam;
float autocvar_g_waypointsprite_timealphaexponent;
var float autocvar_hud_colorflash_alpha = 0.5;
float autocvar_hud_configure_bg_minalpha;
float autocvar_hud_configure_grid_ysize;
float autocvar_hud_configure_teamcolorforced;
float autocvar_hud_contents;
+float autocvar_hud_contents_blur;
+float autocvar_hud_contents_blur_alpha;
float autocvar_hud_contents_factor;
float autocvar_hud_contents_fadeintime;
float autocvar_hud_contents_fadeouttime;
float autocvar_hud_contents_water_alpha;
string autocvar_hud_contents_water_color;
float autocvar_hud_damage;
+float autocvar_hud_damage_blur;
+float autocvar_hud_damage_blur_alpha;
string autocvar_hud_damage_color;
float autocvar_hud_damage_factor;
float autocvar_hud_damage_fade_rate;
float autocvar_hud_damage_pain_threshold_lower_health;
float autocvar_hud_damage_pain_threshold_pulsating_min;
float autocvar_hud_damage_pain_threshold_pulsating_period;
+float autocvar_hud_powerup;
+float autocvar_hud_postprocessing;
+float autocvar_hud_postprocessing_maxbluralpha;
+float autocvar_hud_postprocessing_maxblurradius;
string autocvar_hud_dock;
float autocvar_hud_dock_alpha;
string autocvar_hud_dock_color;
float autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth;
float autocvar_hud_panel_healtharmor_progressbar_gfx_smooth;
+// TEMPORARY hard coded default for compatibility - remove after 0.2 release
+var float autocvar_hud_panel_centerprint = 1;
+noref var string autocvar_hud_panel_centerprint_pos = "0.180000 0.260000";
+noref var string autocvar_hud_panel_centerprint_size = "0.650000 0.210000";
+noref var string autocvar_hud_panel_centerprint_bg = "";
+noref var string autocvar_hud_panel_centerprint_bg_color = "";
+noref var string autocvar_hud_panel_centerprint_bg_color_team = "";
+noref var string autocvar_hud_panel_centerprint_bg_alpha = "";
+noref var string autocvar_hud_panel_centerprint_bg_border = "";
+noref var string autocvar_hud_panel_centerprint_bg_padding = "";
+var float autocvar_hud_panel_centerprint_align = 0.5;
+var float autocvar_hud_panel_centerprint_fadetime = 0.25;
+var float autocvar_hud_panel_centerprint_flip = 1;
+var float autocvar_hud_panel_centerprint_fontscale = 1;
+var float autocvar_hud_panel_centerprint_time = 3;
float autocvar_hud_panel_healtharmor_text;
float autocvar_hud_panel_infomessages;
float autocvar_hud_panel_infomessages_flip;
float autocvar_hud_panel_weapons_complainbubble_time;
var float autocvar_hud_panel_weapons_fade = 1;
float autocvar_hud_panel_weapons_label;
+float autocvar_hud_panel_weapons_onlyowned;
float autocvar_hud_panel_weapons_timeout;
float autocvar_hud_panel_weapons_timeout_effect;
float autocvar_hud_progressbar_alpha;
float autocvar_hud_showbinds_limit;
float autocvar_hud_shownames;
float autocvar_hud_shownames_enemies;
+float autocvar_hud_shownames_self;
float autocvar_hud_shownames_status;
float autocvar_hud_shownames_statusbar_height;
float autocvar_hud_shownames_aspect;
var float autocvar_scoreboard_highlight_alpha_self = 0.25;
float autocvar_scoreboard_offset_left;
float autocvar_scoreboard_offset_right;
-float autocvar_scr_centerpos;
-float autocvar_scr_centersize;
-float autocvar_scr_centertime;
float autocvar_v_flipped;
float autocvar_vid_conheight;
float autocvar_vid_conwidth;
var float autocvar_cl_eventchase_death = 1;
var float autocvar_cl_eventchase_distance = 140;
var float autocvar_cl_eventchase_speed = 1.3;
+float autocvar_cl_lerpexcess;
+string autocvar__togglezoom;
break;
}
- sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, s, VOL_BASE, ATTN_NORM);
}
}
}
{
entity casing;
- casing = RubbleNew("casing");
+ casing = RubbleNew("casing");
casing.state = ReadByte();
casing.silent = (casing.state & 0x80);
casing.state = (casing.state & 0x7F);
casing.cnt = time + autocvar_cl_casings_shell_time;
break;
default:
- setmodel(casing, "models/casing_bronze.mdl");
+ setmodel(casing, "models/casing_bronze.iqm");
casing.cnt = time + autocvar_cl_casings_bronze_time;
break;
}
void Casings_Precache()
{
precache_model("models/casing_shell.mdl");
- precache_model("models/casing_bronze.mdl");
+ precache_model("models/casing_bronze.iqm");
precache_sound("weapons/brass1.wav");
precache_sound("weapons/brass2.wav");
precache_sound("weapons/brass3.wav");
float CVAR_TYPEFLAG_ENGINE = 8;
float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
float CVAR_TYPEFLAG_READONLY = 32;
+
+void (entity e, float chan, string samp, float vol, float atten, float pitchshift, float flags) sound7 = #8;
+
+float trace_dphitcontents;
+float trace_networkentity;
+
+string(string search, string replace, string subject) strreplace = #484;
const float STAT_TIMELIMIT = 236;
const float STAT_MOVEVARS_GRAVITY = 242;
-// Sound Constants
-//const float CHAN_AUTO = 0;
-//const float CHAN_WEAPON = 1;
-//const float CHAN_VOICE = 2;
-//const float CHAN_ITEM = 3;
-//const float CHAN_BODY = 4;
-
-//const float ATTN_NONE = 0;
-//const float ATTN_NORM = 1;
-//const float ATTN_IDLE = 2;
-//const float ATTN_STATIC = 3;
-
// Quake-style Point Contents
const float CONTENT_EMPTY = -1;
const float CONTENT_SOLID = -2;
const float BUTTON_15 = 131072;
const float BUTTON_16 = 262144;
-
const float DRAWFLAG_NORMAL = 0;
const float DRAWFLAG_ADDITIVE = 1;
const float DRAWFLAG_MODULATE = 2;
}
self = oldself;
+
+ if(DEATH_ISVEHICLE(w_deathtype))
+ {
+ traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+ if(trace_plane_normal != '0 0 0')
+ w_backoff = trace_plane_normal;
+ else
+ w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+
+ setorigin(self, w_org + w_backoff * 2); // for sound() calls
+
+ switch(w_deathtype)
+ {
+ case DEATH_VHCRUSH:
+ break;
+
+ case DEATH_SBMINIGUN:
+ string _snd;
+ _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+ sound(self, CH_SHOTS, _snd, VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("spiderbot_minigun_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_SBROCKET:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("spiderbot_rocket_explode"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_SBBLOWUP:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_WAKIGUN:
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("wakizashi_gun_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_WAKIROCKET:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("wakizashi_rocket_explode"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_WAKIBLOWUP:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_RAPTOR_CANNON:
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("raptor_cannon_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_RAPTOR_BOMB_SPLIT:
+ float i;
+ vector ang, vel;
+ for(i = 1; i < 4; ++i)
+ {
+ vel = normalize(w_org - (w_org + normalize(force) * 16)) + randomvec() * 128;
+ ang = vectoangles(vel);
+ RaptorCBShellfragToss(w_org, vel, ang + '0 0 1' * (120 * i));
+ }
+
+
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("raptor_bomb_spread"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_RAPTOR_BOMB:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("raptor_bomb_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+ case DEATH_RAPTOR_DEATH:
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+ break;
+ }
+ }
+
+
+ if(DEATH_ISTURRET(w_deathtype))
+ {
+ traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+ if(trace_plane_normal != '0 0 0')
+ w_backoff = trace_plane_normal;
+ else
+ w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+
+ setorigin(self, w_org + w_backoff * 2); // for sound() calls
+
+ switch(w_deathtype)
+ {
+ case DEATH_TURRET_EWHEEL:
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_TURRET_FLAC:
+ vector org2;
+ org2 = w_org + w_backoff * 6;
+ pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+ if (w_random<0.15)
+ sound(self, CH_SHOTS, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+ else if (w_random<0.7)
+ sound(self, CH_SHOTS, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+ else
+ sound(self, CH_SHOTS, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+
+ break;
+
+ case DEATH_TURRET_MLRS:
+ case DEATH_TURRET_HK:
+ case DEATH_TURRET_WALKER_ROCKET:
+ case DEATH_TURRET_HELLION:
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("rocket_explode"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_TURRET_MACHINEGUN:
+ case DEATH_TURRET_WALKER_GUN:
+ string _snd;
+ _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+ sound(self, CH_SHOTS, _snd, VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("machinegun_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_TURRET_PLASMA:
+ sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+ break;
+
+ case DEATH_TURRET_WALKER_MEELE:
+ sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_MIN);
+ pointparticles(particleeffectnum("TE_SPARK"), self.origin, w_backoff * 1000, 1);
+ break;
- // TODO spawn particle effects and sounds based on w_deathtype
+ case DEATH_TURRET_PHASER:
+ break;
+
+ case DEATH_TURRET_TESLA:
+ te_smallflash(self.origin);
+ break;
+
+ }
+ }
+ // TODO spawn particle effects and sounds based on w_deathtype
if(!DEATH_ISSPECIAL(w_deathtype))
{
float hitwep;
}
if(!self.silent)
- sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
+ sound(self, CH_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum(strcat(species_prefix(self.cnt), "blood")), self.origin + '0 0 1', '0 0 30', 10);
Gib_Delete();
}
}
-void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent)
+void TossGib (string mdlname, vector safeorg, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent)
{
entity gib;
else
gib.move_touch = SUB_RemoveOnNoImpact;
+ // don't spawn gibs inside solid - just don't
+ if(org != safeorg)
+ {
+ tracebox(safeorg, gib.mins, gib.maxs, org, MOVE_NOMONSTERS, gib);
+ org = trace_endpos;
+ }
+
gib.move_origin = gib.origin = org;
gib.move_velocity = vconst * autocvar_cl_gibs_velocity_scale + vrand * autocvar_cl_gibs_velocity_random + '0 0 1' * autocvar_cl_gibs_velocity_up;
gib.move_avelocity = prandomvec() * vlen(gib.move_velocity);
{
case 0x01:
if(!issilent)
- sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
if(prandom() < amount)
- TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0, issilent);
+ TossGib ("models/gibs/eye.md3", org, org, vel, prandomvec() * 150, specnum, 0, issilent);
new_te_bloodshower(particleeffectnum(strcat(specstr, "bloodshower")), org, 1200, amount);
if(prandom() < amount)
- TossGib ("models/gibs/bloodyskull.md3", org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent);
+ TossGib ("models/gibs/bloodyskull.md3", org, org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent);
for(c = 0; c < amount; ++c)
{
randomvalue = amount - c;
if(prandom() < randomvalue)
- TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent);
+ TossGib ("models/gibs/arm.md3", org, org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent);
+ TossGib ("models/gibs/arm.md3", org, org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/chest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent);
+ TossGib ("models/gibs/chest.md3", org, org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/smallchest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent);
+ TossGib ("models/gibs/smallchest.md3", org, org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/leg1.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent);
+ TossGib ("models/gibs/leg1.md3", org, org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/leg2.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent);
+ TossGib ("models/gibs/leg2.md3", org, org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent);
// these splat on impact
if(prandom() < randomvalue)
- TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
+ TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
+ TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
+ TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
if(prandom() < randomvalue)
- TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
+ TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent);
}
break;
case 0x02:
break;
case 0x03:
if(prandom() < amount)
- TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent); // TODO maybe adjust to more randomization?
+ TossGib ("models/gibs/chunk.mdl", org, org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent); // TODO maybe adjust to more randomization?
break;
case 0x81:
pointparticles(particleeffectnum(strcat(gentle_prefix, "damage_dissolve")), org, vel, amount);
if(self.teleport_time)
if(time > self.teleport_time)
{
- sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM); // safeguard
+ sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM); // safeguard
self.teleport_time = 0;
}
void Remove_GrapplingHook()
{
- sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
}
void Ent_ReadHook(float bIsNew, float type)
self.drawmask = MASK_NORMAL;
break;
case ENT_CLIENT_LGBEAM:
- sound (self, CHAN_PROJECTILE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
break;
case ENT_CLIENT_GAUNTLET:
- sound (self, CHAN_PROJECTILE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS_SINGLE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
break;
}
}
return stringwidth(s, FALSE, theSize);
}
-#define CENTERPRINT_MAX_LINES 30
-string centerprint_messages[CENTERPRINT_MAX_LINES];
-float centerprint_width[CENTERPRINT_MAX_LINES];
-float centerprint_time;
-float centerprint_expire;
-float centerprint_num;
-float centerprint_offset_hint;
-vector centerprint_fontsize;
-
-void centerprint(string strMessage)
-{
- float i, j, n, hcount;
- string s;
-
- centerprint_fontsize = HUD_GetFontsize("scr_centersize");
-
- centerprint_expire = min(centerprint_expire, time); // if any of the returns happens, this message will fade out
-
- if(autocvar_scr_centertime <= 0)
- return;
-
- if(strMessage == "")
- return;
-
- // strip trailing newlines
- j = strlen(strMessage) - 1;
- while(substring(strMessage, j, 1) == "\n" && j >= 0)
- j = j - 1;
- strMessage = substring(strMessage, 0, j + 1);
-
- if(strMessage == "")
- return;
-
- // strip leading newlines and remember them, they are a hint that the message should be lower on the screen
- j = 0;
- while(substring(strMessage, j, 1) == "\n" && j < strlen(strMessage))
- j = j + 1;
- strMessage = substring(strMessage, j, strlen(strMessage) - j);
- centerprint_offset_hint = j;
-
- if(strMessage == "")
- return;
-
- // if we get here, we have a message. Initialize its height.
- centerprint_num = 0;
-
- n = tokenizebyseparator(strMessage, "\n");
- i = hcount = 0;
- for(j = 0; j < n; ++j)
- {
- getWrappedLine_remaining = argv(j);
- while(getWrappedLine_remaining)
- {
- s = getWrappedLine(vid_conwidth * 0.75, centerprint_fontsize, stringwidth_colors);
- if(centerprint_messages[i] != s) // don't fade the same message in, looks stupid
- centerprint_time = time;
- if(centerprint_messages[i])
- strunzone(centerprint_messages[i]);
- centerprint_messages[i] = strzone(s);
- centerprint_width[i] = stringwidth(s, TRUE, centerprint_fontsize);
- ++i;
-
- // half height for empty lines looks better
- if(s == "")
- hcount += 0.5;
- else
- hcount += 1;
-
- if(i >= CENTERPRINT_MAX_LINES)
- break;
- }
- }
-
- float h, havail;
- h = centerprint_fontsize_y*hcount;
-
- havail = vid_conheight;
- if(autocvar_con_chatpos < 0)
- havail -= (-autocvar_con_chatpos + autocvar_con_chat) * autocvar_con_chatsize; // avoid overlapping chat
- if(havail > vid_conheight - 70)
- havail = vid_conheight - 70; // avoid overlapping HUD
-
-#if 0
- float forbiddenmin, forbiddenmax, allowedmin, allowedmax, preferred;
-
- // here, the centerprint would cover the crosshair. REALLY BAD.
- forbiddenmin = vid_conheight * 0.5 - h - 16;
- forbiddenmax = vid_conheight * 0.5 + 16;
-
- allowedmin = scoreboard_bottom;
- allowedmax = havail - h;
- preferred = (havail - h)/2;
-
-
- // possible orderings (total: 4! / 4 = 6)
- // allowedmin allowedmax forbiddenmin forbiddenmax
- // forbiddenmin forbiddenmax allowedmin allowedmax
- if(allowedmax < forbiddenmin || allowedmin > forbiddenmax)
- {
- // forbidden doesn't matter in this case
- centerprint_start_y = bound(allowedmin, preferred, allowedmax);
- }
- // allowedmin forbiddenmin allowedmax forbiddenmax
- else if(allowedmin < forbiddenmin && allowedmax < forbiddenmax)
- {
- centerprint_start_y = bound(allowedmin, preferred, forbiddenmin);
- }
- // allowedmin forbiddenmin forbiddenmax allowedmax
- else if(allowedmin < forbiddenmin)
- {
- // make sure the forbidden zone is not covered
- if(preferred > (forbiddenmin + forbiddenmax) * 0.5)
- centerprint_start_y = bound(allowedmin, preferred, forbiddenmin);
- else
- centerprint_start_y = bound(forbiddenmax, preferred, allowedmin);
- }
- // forbiddenmin allowedmin allowedmax forbiddenmax
- else if(allowedmax < forbiddenmax)
- {
- // it's better to leave the allowed zone (overlap with scoreboard) than
- // to cover the forbidden zone (crosshair)
- if(preferred > (forbiddenmin + forbiddenmax) * 0.5)
- centerprint_start_y = forbiddenmax;
- else
- centerprint_start_y = forbiddenmin;
- }
- // forbiddenmin allowedmin forbiddenmax allowedmax
- else
- {
- centerprint_start_y = bound(forbiddenmax, preferred, allowedmax);
- }
-#else
-#endif
-
- centerprint_num = i;
-
- centerprint_expire = time + autocvar_scr_centertime;
-}
-
-void HUD_DrawCenterPrint (void)
-{
- float i;
- vector pos;
- string ts;
- float a, sz;
-
- if(time - centerprint_time < 0.25)
- a = (time - centerprint_time) / 0.25;
- else
- a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
-
- if(a <= 0)
- return;
-
- sz = 0.8 + (a / 5);
-
- if(centerprint_num * autocvar_scr_centersize > 24 && scoreboard_active) // 24 = height of Scoreboard text
- centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y;
-
- pos = centerprint_start;
- for (i=0; i<centerprint_num; i = i + 1)
- {
- ts = centerprint_messages[i];
- drawfontscale = sz * '1 1 0';
- pos_x = (vid_conwidth - stringwidth(ts, TRUE, centerprint_fontsize)) * 0.5;
- if (ts != "")
- {
- drawcolorcodedstring(pos + '0 1 0' * (1 - sz) * 0.5 *centerprint_fontsize_y, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
- pos_y = pos_y + centerprint_fontsize_y;
- }
- else
- // half height for empty lines looks better
- pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
- drawfontscale = '1 1 0';
- }
-}
-
void drawstringright(vector position, string text, vector scale, vector rgb, float alpha, float flag)
{
position_x -= 2 / 3 * strlen(text) * scale_x;
// draw the background/borders
#define HUD_Panel_DrawBg(alpha)\
if(panel_bg != "0")\
- draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\
-if(highlightedPanel == hud_configure_active_panel && autocvar__hud_configure)\
-{\
- HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\
-} ENDS_WITH_CURLY_BRACE
+ draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER))
//basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu
void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, float vertical, float baralign, vector theColor, float theAlpha, float drawflag)
void HUD_Weapons(void)
{
- float f, screen_ar;
+ float i, f, screen_ar;
float center_x, center_y;
-
+ if(hud != HUD_NORMAL) return;
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_weapons) return;
}
HUD_Panel_UpdateCvars(weapons);
+ HUD_Panel_ApplyFadeAlpha();
+
+ // TODO make this configurable
+ if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
+ {
+ float weapon_cnt;
+ if(weaponorder_bypriority)
+ strunzone(weaponorder_bypriority);
+ if(weaponorder_byimpulse)
+ strunzone(weaponorder_byimpulse);
+
+ weaponorder_bypriority = strzone(autocvar_cl_weaponpriority);
+ weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
+ weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
+
+ weapon_cnt = 0;
+ for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+ {
+ self = get_weaponinfo(i);
+ if(self.impulse >= 0)
+ {
+ weaponorder[weapon_cnt] = self;
+ ++weapon_cnt;
+ }
+ }
+ for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i)
+ weaponorder[i] = NULL;
+ heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
+
+ weaponorder_cmp_str = string_null;
+ }
+
+ float when, fadetime;
+ when = autocvar_hud_panel_weapons_complainbubble_time;
+ fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
+ float weapons_st = getstati(STAT_WEAPONS);
+ float weapon_count;
+ if (autocvar_hud_panel_weapons_onlyowned)
+ {
+ if(autocvar__hud_configure)
+ {
+ if (weapons_st == 0)
+ for(i = 0; i <= WEP_LAST-WEP_FIRST; i += floor((WEP_LAST-WEP_FIRST)/5))
+ weapons_st |= power2of(i);
+ if(menu_enabled != 2)
+ HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
+ }
+
+ vector old_panel_size;
+ for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
+ {
+ if(weapons_st & weaponorder[i].weapons)
+ ++weapon_count;
+ }
+ if(!autocvar__hud_configure && (autocvar_hud_panel_weapons_complainbubble && time - complain_weapon_time < when + fadetime))// && complain_weapon >= 0
+ ++weapon_count;
+ if (weapon_count == 0)
+ return;
+ // reduce size of the panel
+ if (panel_size_y > panel_size_x)
+ {
+ old_panel_size_y = panel_size_y;
+ panel_size_y *= weapon_count / WEP_COUNT;
+ panel_pos_y += (old_panel_size_y - panel_size_y) / 2;
+ }
+ else
+ {
+ old_panel_size_x = panel_size_x;
+ panel_size_x *= weapon_count / WEP_COUNT;
+ panel_pos_x += (old_panel_size_x - panel_size_x) / 2;
+ }
+ }
+ else
+ weapon_count = WEP_COUNT;
if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
{
}
}
- float i, weapid, wpnalpha, weapon_cnt;
-
- // TODO make this configurable
- if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
- {
- if(weaponorder_bypriority)
- strunzone(weaponorder_bypriority);
- if(weaponorder_byimpulse)
- strunzone(weaponorder_byimpulse);
-
- weaponorder_bypriority = strzone(autocvar_cl_weaponpriority);
- weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
- weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
-
- weapon_cnt = 0;
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- {
- self = get_weaponinfo(i);
- if(self.impulse >= 0)
- {
- weaponorder[weapon_cnt] = self;
- ++weapon_cnt;
- }
- }
- for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i)
- weaponorder[i] = NULL;
- heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
-
- weaponorder_cmp_str = string_null;
- }
-
HUD_Panel_DrawBg(1);
if(panel_bg_padding)
{
panel_size -= '2 2 0' * panel_bg_padding;
}
+ float weapid, wpnalpha;
+
if(autocvar_hud_panel_weapons_fade)
{
wpnalpha = 3.2 - 2 * (time - weapontime);
float rows, columns;
float aspect = autocvar_hud_panel_weapons_aspect;
rows = panel_size_y/panel_size_x;
- rows = bound(1, floor((sqrt(4 * aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT);
+ rows = bound(1, floor((sqrt(4 * aspect * rows * weapon_count + rows * rows) + rows + 0.5) / 2), weapon_count);
- columns = ceil(WEP_COUNT/rows);
+ columns = ceil(weapon_count/rows);
float row, column;
float a, type, fullammo;
- float when;
- when = autocvar_hud_panel_weapons_complainbubble_time;
- float fadetime;
- fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
vector color;
vector wpnpos;
vector wpnsize;
-
+
vector ammo_color;
float ammo_alpha;
wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i))));
}
- float weapons_st = getstati(STAT_WEAPONS);
-
for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
{
self = weaponorder[i];
if (!self || self.impulse < 0)
continue;
+ if (autocvar_hud_panel_weapons_onlyowned)
+ if (!((weapons_st & self.weapons) || (self.weapon == complain_weapon && time - complain_weapon_time < when + fadetime && autocvar_hud_panel_weapons_complainbubble)))
+ continue;
wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y;
weapid = self.impulse;
// draw background behind currently selected weapon
- if(self.weapon == activeweapon)
+ if(self.weapon == switchweapon)
drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
// draw the weapon accuracy
}
}
-void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected)
+void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected, float infinite_ammo)
{
float a;
if(autocvar__hud_configure)
a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode?
vector color;
- if(a < 10)
+ if(infinite_ammo)
+ color = '0 0.5 0.75';
+ else if(a < 10)
color = '0.7 0 0';
else
color = '1 1 1';
if(autocvar_hud_panel_ammo_text)
{
- if(a > 0)
+ if(a > 0 || infinite_ammo)
drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
else // "ghost" ammo count
drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
}
- if(a > 0)
+ if(a > 0 || infinite_ammo)
drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
else // "ghost" ammo icon
drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
void HUD_Ammo(void)
{
+ if(hud != HUD_NORMAL) return;
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_ammo) return;
hud_configure_active_panel = HUD_PANEL_AMMO;
HUD_Panel_UpdateCvars(ammo);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
ammo_size_y = newSize;
}
- float i, stat_items, currently_selected;
+ float i, stat_items, currently_selected, infinite_ammo;
+ infinite_ammo = FALSE;
if (autocvar_hud_panel_ammo_onlycurrent)
{
if(autocvar__hud_configure)
{
- DrawAmmoItem(pos, ammo_size, 2, true); //show rockets
+ DrawAmmoItem(pos, ammo_size, 2, true, FALSE); //show rockets
return;
}
stat_items = getstati(STAT_ITEMS);
+ if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
+ infinite_ammo = TRUE;
for (i = 0; i < AMMO_COUNT; ++i) {
currently_selected = stat_items & GetAmmoItemCode(i);
if (currently_selected)
{
- DrawAmmoItem(pos, ammo_size, i, true);
+ DrawAmmoItem(pos, ammo_size, i, true, infinite_ammo);
return;
}
}
}
stat_items = getstati(STAT_ITEMS);
+ if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
+ infinite_ammo = TRUE;
for (i = 0; i < AMMO_COUNT; ++i) {
currently_selected = stat_items & GetAmmoItemCode(i);
- DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected);
+ DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected, infinite_ammo);
++row;
if(row >= rows)
{
}
HUD_Panel_UpdateCvars(powerups);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_healtharmor) return;
+ if(hud != HUD_NORMAL) return;
if(spectatee_status == -1) return;
health = getstati(STAT_HEALTH);
}
HUD_Panel_UpdateCvars(healtharmor);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
if(alsoprint)
print(sprintf(_("^1%s^1 was thrown into a world of hurt by %s\n"), s2, s1));
- } else if(type == DEATH_SBCRUSH) {
+ } else if(type == DEATH_VHCRUSH) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
print (sprintf(_("^1%s^1 was crushed by %s\n"), s2, s1));
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
print (sprintf(_("^1%s^1 dies when %s^1's wakizashi dies.\n"), s2, s1));
+ } else if(type == DEATH_RAPTOR_CANNON) {
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+ if(alsoprint)
+ print (sprintf(_("^1%s^1 nailed to hell by %s\n"), s2, s1));
+ } else if(type == DEATH_RAPTOR_BOMB) {
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+ if(alsoprint)
+ print (sprintf(_("^1%s^1 cluster crushed by %s\n"), s2, s1));
+ } else if(type == DEATH_RAPTOR_DEATH) {
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+ if(alsoprint)
+ print (sprintf(_("^1%s^1 dies when %s^1's raptor dies.\n"), s2, s1));
} else if(type == DEATH_TURRET) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
}
}
-#define DAMAGE_CENTERPRINT_SPACER NEWLINES
-
-void HUD_Centerprint(string s1, string s2, float type, float msg)
+void HUD_KillCenterprint(string s1, string s2, float type, float msg)
{
float gentle;
gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
if(msg == MSG_SUICIDE) {
if (type == DEATH_TEAMCHANGE) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You are now on: %s"), s1)));
+ centerprint(sprintf(_("You are now on: %s"), s1));
} else if (type == DEATH_AUTOTEAMCHANGE) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1)));
+ centerprint(sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1));
} else if (type == DEATH_CAMP) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Reconsider your tactics, camper!")));
+ centerprint(_("^1Reconsider your tactics, camper!"));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Die camper!")));
+ centerprint(_("^1Die camper!"));
} else if (type == DEATH_NOAMMO) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You are reinserted into the game for running out of ammo...")));
+ centerprint(_("^1You are reinserted into the game for running out of ammo..."));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You were killed for running out of ammo...")));
+ centerprint(_("^1You were killed for running out of ammo..."));
} else if (type == DEATH_ROT) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to preserve your health")));
+ centerprint(_("^1You need to preserve your health"));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You grew too old without taking your medicine")));
+ centerprint(_("^1You grew too old without taking your medicine"));
} else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't go against team mates!")));
+ centerprint(_("^1Don't go against team mates!"));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't shoot your team mates!")));
+ centerprint(_("^1Don't shoot your team mates!"));
} else if (type == DEATH_QUIET) {
// do nothing
} else { // generic message
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to be more careful!")));
+ centerprint(_("^1You need to be more careful!"));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You killed your own dumb self!")));
+ centerprint(_("^1You killed your own dumb self!"));
}
} else if(msg == MSG_KILL) {
if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1)));
+ centerprint(sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1)));
+ centerprint(sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1));
}
} else if (type == KILL_FIRST_BLOOD) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First score")));
+ centerprint(_("^1First score"));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First blood")));
+ centerprint(_("^1First blood"));
}
} else if (type == KILL_FIRST_VICTIM) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First casualty")));
+ centerprint(_("^1First casualty"));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First victim")));
+ centerprint(_("^1First victim"));
}
} else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap...
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You typefragged ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You typefragged ^7%s"), s1), s2));
}
} else if (type == KILL_TYPEFRAGGED) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
}
} else if (type == KILL_FRAG) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You scored against ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^4You scored against ^7%s"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You fragged ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^4You fragged ^7%s"), s1), s2));
}
} else { // generic message
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You were scored against by ^7%s"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were fragged by ^7%s"), s1), s2));
+ centerprint(strcat(sprintf(_("^1You were fragged by ^7%s"), s1), s2));
}
}
} else if(msg == MSG_KILL_ACTION) {
// TODO: invent more centerprints here?
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Watch your step!")));
+ centerprint(_("^1Watch your step!"));
}
}
hud_configure_active_panel = HUD_PANEL_NOTIFY;
HUD_Panel_UpdateCvars(notify);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_TIMER;
HUD_Panel_UpdateCvars(timer);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_RADAR;
HUD_Panel_UpdateCvars(radar);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_SCORE;
HUD_Panel_UpdateCvars(score);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_RACETIMER;
HUD_Panel_UpdateCvars(racetimer);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
return;
HUD_Panel_UpdateCvars(vote);
+ HUD_Panel_ApplyFadeAlpha();
if(uid2name_dialog)
{
pos = panel_pos;
mySize = panel_size;
- a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
+ a = vote_alpha * (vote_highlighted ? autocvar_hud_panel_vote_alreadyvoted_alpha : 1);
HUD_Panel_DrawBg(a);
a = panel_fg_alpha * a;
drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
}
- else if(vote_highlighted == 2) {
+ else if(vote_highlighted == -1) {
drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y);
drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
}
}
drawresetcliparea();
-
- if(!vote_active) {
- vote_highlighted = 0;
- }
}
// Mod icons panel (#10)
hud_configure_active_panel = HUD_PANEL_MODICONS;
HUD_Panel_UpdateCvars(modicons);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
HUD_Panel_UpdateCvars(pressedkeys);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_CHAT;
HUD_Panel_UpdateCvars(chat);
+ HUD_Panel_ApplyFadeAlpha();
if(autocvar__con_chat_maximized && !autocvar__hud_configure) // draw at full screen height if maximized
{
hud_configure_active_panel = HUD_PANEL_ENGINEINFO;
HUD_Panel_UpdateCvars(engineinfo);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
hud_configure_active_panel = HUD_PANEL_INFOMESSAGES;
HUD_Panel_UpdateCvars(infomessages);
+ HUD_Panel_ApplyFadeAlpha();
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_physics) return;
- if(spectatee_status == -1 && autocvar_hud_panel_physics < 2) return;
+ if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
+ if(autocvar_hud_panel_physics == 3 && !(gametype == GAME_RACE || gametype == GAME_CTS)) return;
}
else
hud_configure_active_panel = HUD_PANEL_PHYSICS;
HUD_Panel_UpdateCvars(physics);
+ HUD_Panel_ApplyFadeAlpha();
HUD_Panel_DrawBg(1);
if(panel_bg_padding)
drawstring_aspect(panel_pos + acceleration_offset, strcat(ftos_decimals(acceleration, 2), "g"), panel_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
}
+// CenterPrint (#16)
+//
+#define CENTERPRINT_MAX_MSGS 10
+#define CENTERPRINT_MAX_ENTRIES 50
+#define CENTERPRINT_SPACING 0.7
+float cpm_index;
+string centerprint_messages[CENTERPRINT_MAX_MSGS];
+float centerprint_msgID[CENTERPRINT_MAX_MSGS];
+float centerprint_time[CENTERPRINT_MAX_MSGS];
+float centerprint_expire_time[CENTERPRINT_MAX_MSGS];
+float centerprint_countdown_num[CENTERPRINT_MAX_MSGS];
+float centerprint_fadetime;
+float centerprint_showing;
+
+void centerprint_generic(float new_id, string strMessage, float duration, float countdown_num)
+{
+ float i, j;
+
+ if(strMessage == "" && new_id == 0)
+ return;
+
+ // strip trailing newlines
+ j = strlen(strMessage) - 1;
+ while(substring(strMessage, j, 1) == "\n" && j >= 0)
+ --j;
+ if (j < strlen(strMessage) - 1)
+ strMessage = substring(strMessage, 0, j + 1);
+
+ if(strMessage == "" && new_id == 0)
+ return;
+
+ // strip leading newlines
+ j = 0;
+ while(substring(strMessage, j, 1) == "\n" && j < strlen(strMessage))
+ ++j;
+ if (j > 0)
+ strMessage = substring(strMessage, j, strlen(strMessage) - j);
+
+ if(strMessage == "" && new_id == 0)
+ return;
+
+ if (!centerprint_showing)
+ centerprint_showing = TRUE;
+
+ centerprint_fadetime = bound(0, autocvar_hud_panel_centerprint_fadetime, 1);
+
+ for (i=0, j=cpm_index; i<CENTERPRINT_MAX_MSGS; ++i, ++j)
+ {
+ if (j == CENTERPRINT_MAX_MSGS)
+ j = 0;
+ if (new_id && new_id == centerprint_msgID[j])
+ {
+ if (strMessage == "" && centerprint_messages[j] != "" && centerprint_countdown_num[j] == 0)
+ {
+ // fade out the current msg (duration and countdown_num are ignored)
+ centerprint_time[j] = centerprint_fadetime;
+ if (centerprint_expire_time[j] > time + centerprint_fadetime || centerprint_expire_time[j] < time)
+ centerprint_expire_time[j] = time + centerprint_fadetime;
+ return;
+ }
+ break; // found a msg with the same id, at position j
+ }
+ }
+
+ if (i == CENTERPRINT_MAX_MSGS)
+ {
+ // a msg with the same id was not found, add the msg at the next position
+ --cpm_index;
+ if (cpm_index == -1)
+ cpm_index = CENTERPRINT_MAX_MSGS - 1;
+ j = cpm_index;
+ }
+ if(centerprint_messages[j])
+ strunzone(centerprint_messages[j]);
+ centerprint_messages[j] = strzone(strMessage);
+ centerprint_msgID[j] = new_id;
+ if (duration < 0)
+ centerprint_time[j] = -1;
+ else
+ {
+ if(duration == 0)
+ duration = max(1, autocvar_hud_panel_centerprint_time);
+ centerprint_time[j] = duration;
+ centerprint_expire_time[j] = time + duration;
+ }
+ centerprint_countdown_num[j] = countdown_num;
+}
+
+void centerprint(string strMessage)
+{
+ centerprint_generic(0, strMessage, autocvar_hud_panel_centerprint_time, 0);
+}
+
+void reset_centerprint_messages(void)
+{
+ float i;
+ for (i=0; i<CENTERPRINT_MAX_MSGS; ++i)
+ {
+ centerprint_expire_time[i] = 0;
+ centerprint_time[i] = 1;
+ centerprint_msgID[i] = 0;
+ if(centerprint_messages[i])
+ strunzone(centerprint_messages[i]);
+ centerprint_messages[i] = string_null;
+ }
+}
+float hud_configure_cp_generation_time;
+void HUD_CenterPrint (void)
+{
+ if(!autocvar__hud_configure)
+ {
+ if(!autocvar_hud_panel_centerprint) return;
+
+ if (hud_configure_prev && hud_configure_prev != -1)
+ reset_centerprint_messages();
+ }
+ else
+ {
+ hud_configure_active_panel = HUD_PANEL_CENTERPRINT;
+
+ if (!hud_configure_prev)
+ reset_centerprint_messages();
+ if (time > hud_configure_cp_generation_time)
+ {
+ float r;
+ r = random();
+ if (r > 0.9)
+ centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: %d"), 1, 10);
+ else if (r > 0.8)
+ centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0);
+ else
+ centerprint(sprintf("Message at time %s", seconds_tostring(time)));
+ hud_configure_cp_generation_time = time + 1 + random()*4;
+ }
+ }
+
+ HUD_Panel_UpdateCvars(centerprint);
+
+ // this panel doesn't fade when showing the scoreboard
+ if(autocvar__menu_alpha)
+ HUD_Panel_ApplyFadeAlpha();
+
+ if(scoreboard_fade_alpha)
+ {
+ // move the panel below the scoreboard
+ if (scoreboard_bottom >= 0.96 * vid_conheight)
+ return;
+ vector target_pos;
+ target_pos = eY * scoreboard_bottom + eX * 0.5 * (vid_conwidth - panel_size_x);
+ panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha);
+ panel_size_y = min(panel_size_y, vid_conheight - scoreboard_bottom);
+ }
+
+ HUD_Panel_DrawBg(1);
+
+ if (!centerprint_showing)
+ return;
+
+ if(panel_bg_padding)
+ {
+ panel_pos += '1 1 0' * panel_bg_padding;
+ panel_size -= '2 2 0' * panel_bg_padding;
+ }
+
+ float entries, height;
+ vector fontsize;
+ // entries = bound(1, floor(CENTERPRINT_MAX_ENTRIES * 4 * panel_size_y/panel_size_x), CENTERPRINT_MAX_ENTRIES);
+ // height = panel_size_y/entries;
+ // fontsize = '1 1 0' * height;
+ height = vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale;
+ fontsize = '1 1 0' * height;
+ entries = bound(1, floor(panel_size_y/height), CENTERPRINT_MAX_ENTRIES);
+
+ float i, j, k, n;
+ float a, sz, align, current_msg_pos_y, msg_size;
+ vector pos;
+ string ts;
+
+ n = -1; // if no msg will be displayed, n stays -1
+
+ pos = panel_pos;
+ if (autocvar_hud_panel_centerprint_flip)
+ pos_y += panel_size_y;
+ align = bound(0, autocvar_hud_panel_centerprint_align, 1);
+ for (i=0, j=cpm_index; i<CENTERPRINT_MAX_MSGS; ++i, ++j)
+ {
+ if (j == CENTERPRINT_MAX_MSGS)
+ j = 0;
+ if (centerprint_expire_time[j] <= time)
+ {
+ if (centerprint_countdown_num[j] && centerprint_time[j] > 0)
+ {
+ centerprint_countdown_num[j] = centerprint_countdown_num[j] - 1;
+ if (centerprint_countdown_num[j] == 0)
+ continue;
+ centerprint_expire_time[j] = centerprint_expire_time[j] + centerprint_time[j];
+ }
+ else
+ continue;
+ }
+ if (centerprint_time[j] < 0 || centerprint_expire_time[j] - centerprint_fadetime > time)
+ {
+ a = bound(0, (time - (centerprint_expire_time[j] - centerprint_time[j])) / centerprint_fadetime, 1);
+ sz = 0.8 + a * (1 - 0.8);
+ }
+ else if (centerprint_expire_time[j] > time)
+ {
+ a = (centerprint_expire_time[j] - time) / centerprint_fadetime;
+ sz = 0.8 + a * (1 - 0.8);
+ }
+
+ drawfontscale = sz * '1 1 0';
+ if (centerprint_countdown_num[j])
+ n = tokenizebyseparator(sprintf(centerprint_messages[j], centerprint_countdown_num[j]), "\n");
+ else
+ n = tokenizebyseparator(centerprint_messages[j], "\n");
+ if (autocvar_hud_panel_centerprint_flip)
+ {
+ // check if the message can be entirely shown
+ for(k = 0; k < n; ++k)
+ {
+ getWrappedLine_remaining = argv(k);
+ while(getWrappedLine_remaining)
+ {
+ ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors);
+ if (ts != "")
+ pos_y -= fontsize_y;
+ else
+ pos_y -= fontsize_y * CENTERPRINT_SPACING/2;
+ // NOTE: uncommented so as to not reject messages whenever they are "too large" -- This just continues drawing it anyway.
+ //if (pos_y < panel_pos_y) // check if the next line can be shown
+ //{
+ // drawfontscale = '1 1 0';
+ // return;
+ //}
+ }
+ }
+ current_msg_pos_y = pos_y; // save starting pos (first line) of the current message
+ }
+
+ msg_size = pos_y;
+ for(k = 0; k < n; ++k)
+ {
+ getWrappedLine_remaining = argv(k);
+ while(getWrappedLine_remaining)
+ {
+ ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors);
+ if (ts != "")
+ {
+ if (align)
+ pos_x = panel_pos_x + (panel_size_x - stringwidth(ts, TRUE, fontsize)) * align;
+ drawcolorcodedstring(pos + eY * 0.5 * (1 - sz) * fontsize_y, ts, fontsize, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ pos_y += fontsize_y;
+ }
+ else
+ pos_y += fontsize_y * CENTERPRINT_SPACING/2;
+ // NOTE: uncommented so as to not reject messages whenever they are "too large" -- This just continues drawing it anyway.
+ //if (!autocvar_hud_panel_centerprint_flip && pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next line can be shown
+ //{
+ // drawfontscale = '1 1 0';
+ // return;
+ //}
+ }
+ }
+ msg_size = pos_y - msg_size;
+ if (autocvar_hud_panel_centerprint_flip)
+ {
+ pos_y = current_msg_pos_y - CENTERPRINT_SPACING * fontsize_y;
+ if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
+ pos_y += (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a));
+ }
+ else
+ {
+ pos_y += CENTERPRINT_SPACING * fontsize_y;
+ if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
+ pos_y -= (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a));
+ }
+ }
+ drawfontscale = '1 1 0';
+ if (n == -1)
+ {
+ centerprint_showing = FALSE;
+ reset_centerprint_messages();
+ }
+}
+
/*
==================
Main HUD system
HUD_InfoMessages(); break;\
case (HUD_PANEL_PHYSICS):\
HUD_Physics(); break;\
+ case (HUD_PANEL_CENTERPRINT):\
+ HUD_CenterPrint(); break;\
} ENDS_WITH_CURLY_BRACE
void HUD_Main (void)
else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
hud_fade_alpha = 1;
+ // panels that we want to be active together with the scoreboard
+ // they must call HUD_Panel_ApplyFadeAlpha(); only when showing the menu
+ if(scoreboard_fade_alpha == 1)
+ {
+ HUD_CenterPrint();
+ return;
+ }
+
if(!autocvar__hud_configure && !hud_fade_alpha)
return;
if(autocvar__con_chat_maximized)
HUD_Chat(); // HUD_DrawPanel(HUD_PANEL_CHAT);
- if (autocvar__hud_configure && spectatee_status && hud_configure_prev == -1) // try to join if we are in hud_configure mode, but still spectating, and in the first frame (in order to get rid of motd when launching a server via the menu "HUD Setup" button)
- localcmd("cmd selectteam auto; cmd join\n");
-
- if(autocvar__hud_configure && tab_panel != -1)
+ if(autocvar__hud_configure)
{
- HUD_Panel_UpdatePosSizeForId(tab_panel)
- drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL);
+ if(tab_panel != -1)
+ {
+ HUD_Panel_UpdatePosSizeForId(tab_panel)
+ drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL);
+ }
+ if(highlightedPanel != -1)
+ {
+ HUD_Panel_UpdatePosSizeForId(highlightedPanel);
+ HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha));
+ }
}
hud_configure_prev = autocvar__hud_configure;
float log(float f);
-vector centerprint_start;
-
float panel_order[HUD_PANEL_NUM];
string hud_panelorder_prev;
float ps_primary, ps_secondary;
float ts_primary, ts_secondary;
-float last_weapon;
+float last_switchweapon;
+float last_activeweapon;
float weapontime;
float weaponprevtime;
panel_bg_color_team = stof(panel_bg_color_team_str);\
}
+// the check doesn't allow to fade this panel when showing the panel-specific menu dialog
+#define HUD_Panel_ApplyFadeAlpha()\
+if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel))\
+{\
+ panel_bg_alpha *= hud_fade_alpha;\
+ panel_fg_alpha *= hud_fade_alpha;\
+} ENDS_WITH_CURLY_BRACE
+
// Get value for panel_bg_alpha: if "" fetch default, else use panel_bg_alpha. Also do various menu dialog fadeout/in checks, and minalpha checks
// comment on line 3 of macro: // do not set a minalpha cap when showing the config dialog for this panel
#define HUD_Panel_GetBgAlpha()\
panel_bg_alpha = (1 - autocvar__menu_alpha) * max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha) + autocvar__menu_alpha * panel_bg_alpha;\
else\
panel_bg_alpha = max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha);\
-} if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel)) {\
- panel_bg_alpha *= hud_fade_alpha;\
}
// Get value for panel_fg_alpha. Also do various minalpha checks
// comment on line 2 of macro: // ALWAYS show disabled panels at 0.25 alpha when in config mode
-// comment on line 4 of macro: // don't fade this panel when showing the panel-specific menu dialog
#define HUD_Panel_GetFgAlpha()\
panel_fg_alpha = autocvar_hud_panel_fg_alpha;\
if(autocvar__hud_configure && !panel_enabled)\
panel_fg_alpha = 0.25;\
-if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel))\
- panel_fg_alpha *= hud_fade_alpha;
// Get border. See comments above, it's similar.
#define HUD_Panel_GetBorder()\
panel_pos = (1 - autocvar__menu_alpha) * panel_pos + (autocvar__menu_alpha) * menu_enable_panelpos;
// return smoothly faded size of given panel when a dialog is active
-//var vector menu_enable_maxsize; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(menu_enable_maxsize);
+//var vector menu_enable_maxsize;
var float menu_enable_maxsize_x;
var float menu_enable_maxsize_y;
var vector menu_enable_size;
switch(id) { \
case HUD_PANEL_INFOMESSAGES: HUD_Panel_UpdateCvars(infomessages) break; \
case HUD_PANEL_PHYSICS: HUD_Panel_UpdateCvars(physics); break;\
+ case HUD_PANEL_CENTERPRINT: HUD_Panel_UpdateCvars(centerprint); break;\
}
#define HUD_Panel_UpdateCvarsForId(id) \
switch(id) { \
case HUD_PANEL_INFOMESSAGES: HUD_Panel_UpdatePosSize(infomessages) break;\
case HUD_PANEL_PHYSICS: HUD_Panel_UpdatePosSize(physics); break;\
+ case HUD_PANEL_CENTERPRINT: HUD_Panel_UpdatePosSize(centerprint); break;\
}
#define HUD_Panel_UpdatePosSizeForId(id) \
HUD_Write_Cvar_q("hud_configure_grid_ysize");
HUD_Write("\n");
- HUD_Write_Cvar_q("scr_centerpos");
- HUD_Write("\n");
-
// common cvars for all panels
float i;
for (i = 0; i < HUD_PANEL_NUM; ++i)
HUD_Write_PanelCvar_q("_progressbar");
HUD_Write_PanelCvar_q("_acceleration_mode");
break;
+ case HUD_PANEL_CENTERPRINT:
+ HUD_Write_PanelCvar_q("_align");
+ HUD_Write_PanelCvar_q("_flip");
+ HUD_Write_PanelCvar_q("_fontscale");
+ HUD_Write_PanelCvar_q("_time");
+ HUD_Write_PanelCvar_q("_fadetime");
+ break;
}
HUD_Write("\n");
}
{
string s;
+ // we only care for keyboard events
+ if(bInputType != 0 && bInputType != 1)
+ return false;
+
if(!autocvar__hud_configure)
return false;
if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
{
float f;
- f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1);
+ f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2;
if(self.iflags & IFLAG_ANGLES)
{
float scores_flags[MAX_SCORE];
string teamscores_label[MAX_SCORE];
float teamscores_flags[MAX_SCORE];
-.float scores[MAX_SCORE]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(scores);
-.float teamscores[MAX_TEAMSCORE]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(teamscores);
+.float scores[MAX_SCORE];
+.float teamscores[MAX_TEAMSCORE];
#define IS_INCREASING(x) ( (x)&SFL_LOWER_IS_BETTER )
#define IS_DECREASING(x) ( !((x)&SFL_LOWER_IS_BETTER) )
float button_attack2;
float activeweapon;
+float switchingweapon;
+float switchweapon;
float current_viewzoom;
float zoomin_effect;
float warmup_stage;
vector camera_direction;
void centerprint(string strMessage);
+void centerprint_generic(float new_id, string strMessage, float duration, float countdown_num);
#define ALPHA_MIN_VISIBLE 0.003
float g_trueaim_minrange;
entity entcs_receiver[255]; // 255 is the engine limit on maxclients
+
+float hud;
if(!mv_active)
return;
-
+
mv_mousepos = mv_mousepos + getmousepos();
mv_mousepos_x = bound(0, mv_mousepos_x, vid_conwidth);
pos_y = ymin;
pos_z = 0;
- //pos_x = center - stringwidth("Vote for a map", false) * 0.5 * 24;
- pos_x = center - stringwidth(_("Vote for a map"), false, '12 0 0');
- drawstring(pos, "Vote for a map", '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+
+ map = _("Vote for a map");
+ pos_x = center - stringwidth(map, false, '12 0 0');
+ drawstring(pos, map, '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
pos_y += 26;
i = ceil(max(0, mv_timeout - time));
map = sprintf(_("%d seconds left"), i);
- //pos_x = center - stringwidth(map, false) * 0.5 * 16;
pos_x = center - stringwidth(map, false, '8 0 0');
drawstring(pos, map, '16 16 0', '0 1 0', 1, DRAWFLAG_NORMAL);
pos_y += 22;
ymin = pos_y;
if(mv_abstain)
mv_num_maps -= 1;
-
+
if(mv_num_maps > 3)
{
columns = 3;
if(mv_abstain)
++mv_num_maps;
-
+
if(mv_abstain && i < mv_num_maps) {
tmp = mv_votes[i];
pos_y = ymax + isize - hud_fontsize_y;
localcmd(strcat("\nimpulse ", ftos(imp), "\n"));
return true;
}
+ switch(nPrimary)
+ {
+ case K_KP_1: localcmd("\nimpulse 1\n"); return true;
+ case K_KP_2: localcmd("\nimpulse 2\n"); return true;
+ case K_KP_3: localcmd("\nimpulse 3\n"); return true;
+ case K_KP_4: localcmd("\nimpulse 4\n"); return true;
+ case K_KP_5: localcmd("\nimpulse 5\n"); return true;
+ case K_KP_6: localcmd("\nimpulse 6\n"); return true;
+ case K_KP_7: localcmd("\nimpulse 7\n"); return true;
+ case K_KP_8: localcmd("\nimpulse 8\n"); return true;
+ case K_KP_9: localcmd("\nimpulse 9\n"); return true;
+ case K_KP_0: localcmd("\nimpulse 10\n"); return true;
+ }
if (nPrimary == K_MOUSE1)
if (mv_selection >= 0)
if(oldmask & mv_maps_mask != oldmask)
if(oldmask & mv_maps_mask == mv_maps_mask)
- sound(world, CHAN_AUTO, "misc_invshot.wav", VOL_BASE, ATTN_NONE);
+ sound(world, CH_INFO, "misc_invshot.wav", VOL_BASE, ATTN_NONE);
// remove votes that no longer apply
for(i = 0, power = 1; i < mv_num_maps; ++i, power *= 2)
// check for pending announcement, play it and remove it
if(announce_snd != "")
{
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
strunzone(announce_snd);
announce_snd = "";
}
countdown_rounded = floor(0.5 + countdown);
if(countdown <= 0) {
if (!spectatee_status) //do cprint only for players
- centerprint(_("^1Begin!"));
+ centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
//reset maptime announcers now as well
announcer_5min = announcer_1min = FALSE;
}
else {
if (!spectatee_status) //do cprint only for players
- centerprint(sprintf(_("^1Game starts in %d seconds"), countdown_rounded));
+ centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
if(countdown_rounded <= 3 && countdown_rounded >= 1) {
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
}
self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
//if we're in warmup mode, check whether there's a warmup timelimit
if not (warmuplimit == -1 && warmup_stage) {
announcer_5min = TRUE;
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
}
}
//if we're in warmup mode, check whether there's a warmup timelimit
if not (warmuplimit == -1 && warmup_stage) {
announcer_1min = TRUE;
- sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
}
}
}
float PreviewExists(string name)
{
- float f;
- string file;
-
if(autocvar_cl_readpicture_force)
return false;
-.entity move_groundentity;
+float STAT_MOVEFLAGS = 225;
+float MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE = 4;
+#define GRAVITY_UNAFFECTED_BY_TICRATE (getstati(STAT_MOVEFLAGS) & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE)
+
+.entity move_groundentity; // FIXME add move_groundnetworkentity?
.float move_suspendedinair;
.float move_didgravity;
if(self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
{
- self.move_didgravity = TRUE;
- if(self.gravity)
- self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ self.move_didgravity = 1;
+ if(GRAVITY_UNAFFECTED_BY_TICRATE)
+ {
+ if(self.gravity)
+ self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
else
- self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ {
+ if(self.gravity)
+ self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
}
self.move_angles = self.move_angles + self.move_avelocity * dt;
break;
}
+ if(GRAVITY_UNAFFECTED_BY_TICRATE)
+ if(self.move_didgravity > 0)
+ if(!(self.move_flags & FL_ONGROUND))
+ {
+ if(self.gravity)
+ self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
+
_Movetype_CheckWaterTransition();
}
void _Movetype_Physics_Frame(float movedt)
{
- self.move_didgravity = FALSE;
+ self.move_didgravity = -1;
switch(self.move_movetype)
{
case MOVETYPE_PUSH:
movedt = time - self.move_time;
self.move_time = time;
- //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
- // we use the field as set by the last run of this
-
_Movetype_Physics_Frame(movedt);
if(wasfreed(self))
return;
dt -= n * tr;
self.move_time += n * tr;
- //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
- // we use the field as set by the last run of this
+ if(!self.move_didgravity)
+ self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
for(i = 0; i < n; ++i)
{
{
// now continue the move from move_time to time
self.velocity = self.move_velocity;
- if(self.move_didgravity)
+
+ if(self.move_didgravity > 0)
{
- if(self.gravity)
- self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ if(GRAVITY_UNAFFECTED_BY_TICRATE)
+ {
+ if(self.gravity)
+ self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
else
- self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ {
+ if(self.gravity)
+ self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
}
self.angles = self.move_angles + dt * self.avelocity;
if(!trace_startsolid)
setorigin(self, trace_endpos);
}
+
+ if(self.move_didgravity > 0)
+ {
+ if(GRAVITY_UNAFFECTED_BY_TICRATE)
+ {
+ if(self.gravity)
+ self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ else
+ self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
+ }
}
else
{
float MOVETYPE_BOUNCEMISSILE = 11; // Like bounce but doesn't lose speed on bouncing
float MOVETYPE_FOLLOW = 12;
float MOVETYPE_FAKEPUSH = 13;
+float MOVETYPE_FLY_WORLDONLY = 33;
float FL_ITEM = 256;
float FL_ONGROUND = 512;
if(self.noise != "")
{
self.origin = p;
- sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);
+ sound(self, CH_AMBIENT, self.noise, VOL_BASE * self.volume, self.atten);
}
self.just_toggled = 0;
}
bgmscript.qh
noise.qh
teamplay.qh
-
+tturrets.qh
+../server/tturrets/include/turrets_early.qh
+../server/movelib.qc
main.qh
+vehicles/vehicles.qh
sortlist.qc
miscfunctions.qc
tuba.qc
target_music.qc
-//vehicles/spiderbot.qc
+vehicles/vehicles.qc
shownames.qh
shownames.qc
+
Main.qc
View.qc
interpolate.qc
../warpzonelib/mathlib.qc
../warpzonelib/common.qc
../warpzonelib/client.qc
+tturrets.qc
../common/if-this-file-errors-scroll-up-and-fix-the-warnings.fteqccfail
self.trail_oldorigin = to;
self.trail_oldtime = time;
}
+
void Projectile_DrawTrail(vector to)
{
vector from;
float t0;
+
from = self.trail_oldorigin;
t0 = self.trail_oldtime;
self.trail_oldorigin = to;
void Ent_RemoveProjectile()
{
if(self.snd_looping)
- sound(self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
if(self.count & 0x80)
{
// effects
//
// projectiles don't send angles, because they always follow the velocity
-
+
f = ReadByte();
self.count = (f & 0x80);
self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break;
case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; self.traileffect = particleeffectnum("TR_SEEKER"); break;
case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.traileffect = particleeffectnum("TR_SEEKER"); break;
+
+ case PROJECTILE_RAPTORBOMB: setmodel(self, "models/vehicles/clusterbomb.md3"); self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+ case PROJECTILE_RAPTORBOMBLET: setmodel(self, "models/vehicles/bomblet.md3"); self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+ case PROJECTILE_RAPTORCANNON: setmodel(self, "models/plasmatrail.mdl"); self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
+
+ case PROJECTILE_SPIDERROCKET: setmodel(self, "models/vehicles/rocket02.md3"); self.traileffect = particleeffectnum("spiderbot_rocket_thrust"); break;
+ case PROJECTILE_WAKIROCKET: setmodel(self, "models/vehicles/rocket01.md3"); self.traileffect = particleeffectnum("wakizashi_rocket_thrust"); break;
+ case PROJECTILE_WAKICANNON: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum(""); break;
default:
error("Received invalid CSQC projectile, can't work with this!");
break;
{
case PROJECTILE_ELECTRO:
// only new engines support sound moving with object
- loopsound(self, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
self.mins = '0 0 -4';
self.maxs = '0 0 -4';
self.move_movetype = MOVETYPE_BOUNCE;
self.move_bounce_stopspeed = g_balance_electro_secondary_bouncestop;
break;
case PROJECTILE_ROCKET:
- loopsound(self, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
self.mins = '-3 -3 -3';
self.maxs = '3 3 3';
break;
self.move_touch = SUB_Null;
break;
case PROJECTILE_FIREBALL:
- loopsound(self, CHAN_PROJECTILE, "weapons/fireball_fly2.wav", VOL_BASE, ATTN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/fireball_fly2.wav", VOL_BASE, ATTN_NORM);
self.mins = '-16 -16 -16';
self.maxs = '16 16 16';
break;
case PROJECTILE_FIREMINE:
- loopsound(self, CHAN_PROJECTILE, "weapons/fireball_fly.wav", VOL_BASE, ATTN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/fireball_fly.wav", VOL_BASE, ATTN_NORM);
self.move_movetype = MOVETYPE_BOUNCE;
self.move_touch = SUB_Null;
self.mins = '-4 -4 -4';
self.maxs = '2 2 2';
break;
case PROJECTILE_SEEKER:
- loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
self.mins = '-4 -4 -4';
self.maxs = '4 4 4';
break;
+ case PROJECTILE_RAPTORBOMB:
+ self.mins = '-3 -3 -3';
+ self.maxs = '3 3 3';
+ break;
+ case PROJECTILE_RAPTORBOMBLET:
+ break;
+ case PROJECTILE_RAPTORCANNON:
+ break;
+ case PROJECTILE_SPIDERROCKET:
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ break;
+ case PROJECTILE_WAKIROCKET:
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ break;
+ case PROJECTILE_WAKICANNON:
+ break;
default:
break;
}
if(!(self.count & 0x80))
InterpolateOrigin_Note();
-
+
self.draw = Projectile_Draw;
self.entremove = Ent_RemoveProjectile;
}
precache_model("models/rocket.md3");
precache_model("models/tagrocket.md3");
precache_model("models/tracer.mdl");
+
precache_sound("weapons/electro_fly.wav");
precache_sound("weapons/rocket_fly.wav");
precache_sound("weapons/fireball_fly.wav");
precache_sound("weapons/fireball_fly2.wav");
precache_sound("weapons/tag_rocket_fly.wav");
+
}
print(_("^3|---------------------------------------------------------------|\n"));
print(_("Usage:\n"));
print(_("^2scoreboard_columns_set default\n"));
- print(_("^2scoreboard_columns_set ^7filed1 field2 ...\n"));
+ print(_("^2scoreboard_columns_set ^7field1 field2 ...\n"));
print(_("The following field names are recognized (case insensitive):\n"));
print(_("You can use a ^3|^7 to start the right-aligned fields.\n\n"));
- print(_("^3name^7 or ^3nick^7 Name of a player\n"));
+ print(_("^3name^7 or ^3nick^7 Name of a player\n"));
print(_("^3ping^7 Ping time\n"));
print(_("^3pl^7 Packet loss\n"));
print(_("^3kills^7 Number of kills\n"));
body_table_height = 1.25 * hud_fontsize_y * max(1, tm.team_size); // no player? show 1 empty line
+ pos_y += autocvar_scoreboard_border_thickness;
pos -= '1 1 0';
tmp_x = sbwidth + 2;
float weapon_width = sbwidth / weapon_cnt;
drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- pos_y += 1.25 * hud_fontsize_y;
+ pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness;
vector tmp;
tmp_x = sbwidth;
tmp_y = height * rows;
if(rows == 2)
pos_x += weapon_width / 2;
- if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX)
+ if(switchweapon == WEP_MINSTANEX)
g_minstagib = 1; // TODO: real detection for minstagib?
- float weapon_stats, weapon_number;
+ float weapon_stats;
if (!acc_levels)
rgb = '1 1 1';
pos_y += hud_fontsize_y;
drawstring(pos, _("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- pos_y += hud_fontsize_y;
+ pos_y += hud_fontsize_y + autocvar_scoreboard_border_thickness;
vector tmp;
tmp_x = sbwidth;
tmp_y = 1.25 * hud_fontsize_y * RANKINGS_RECEIVED_CNT;
drawcolorcodedstring(pos + '8 0 0' * hud_fontsize_y, n, '1 1 0' * hud_fontsize_y, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y;
}
+ pos_y += autocvar_scoreboard_border_thickness;
return pos;
}
vector rgb, pos, tmp;
entity pl, tm;
+ string str;
xmin = autocvar_scoreboard_offset_left * vid_conwidth;
ymin = autocvar_con_notify * autocvar_con_notifysize;
pos_z = 0;
// Heading
- drawstring(pos, _("Scoreboard"), '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth(_("Scoreboard"), FALSE, '24 24 0'));
- centerprint_start_y = pos_y;
+ vector sb_heading_fontsize;
+ sb_heading_fontsize = hud_fontsize * 2;
+ drawstring(pos, _("Scoreboard"), sb_heading_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- pos_y += 24;
+ pos_y += sb_heading_fontsize_y + hud_fontsize_y * 0.25;
// Draw the scoreboard
vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale;
if(teamplay)
{
+ vector team_score_baseoffset;
+ team_score_baseoffset = eY * (2 * autocvar_scoreboard_border_thickness + hud_fontsize_y) - eX * (autocvar_scoreboard_border_thickness + hud_fontsize_x * 0.25);
for(tm = teams.sort_next; tm; tm = tm.sort_next)
{
if(tm.team == COLOR_SPECTATOR)
continue;
rgb = GetTeamRGB(tm.team);
- drawstring(pos - '2 0 0' * hud_fontsize_x + '0 1 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_primary])), '1 1 0' * hud_fontsize_y * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ str = ftos(tm.(teamscores[ts_primary]));
+ drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize * 1.5), str, hud_fontsize * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
if(ts_primary != ts_secondary)
- drawstring(pos - '2 0 0' * hud_fontsize_x + '0 2.5 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_secondary])), '1 1 0' * hud_fontsize_y * 1, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
+ {
+ str = ftos(tm.(teamscores[ts_secondary]));
+ drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize) + eY * hud_fontsize_y * 1.5, str, hud_fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ }
pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size);
}
}
}
// Print info string
- string str;
float tl, fl, ll;
str = sprintf(_("playing on ^2%s^7"), shortmapname);
tl = getstatf(STAT_TIMELIMIT);
// self.healthvalue
// self.armorvalue
// self.sameteam = player is on same team as local client
+// self.fadedelay = time to wait before name tag starts fading in for enemies
//
const float SHOWNAMES_FADESPEED = 4;
+const float SHOWNAMES_FADEDELAY = 0.5;
void Draw_ShowNames(entity ent)
{
if(!autocvar_hud_shownames)
return;
+
+ if((ent.sv_entnum == player_localentnum) || (ent.sv_entnum == spectatee_status)) // ent is me or person i'm spectating
+ if not (autocvar_hud_shownames_self && autocvar_chase_active)
+ return;
- if(ent.sv_entnum == player_localentnum && !autocvar_chase_active)
- return;
+ makevectors(view_angles);
if(ent.sameteam || (!ent.sameteam && autocvar_hud_shownames_enemies))
{
ent.origin_z += autocvar_hud_shownames_offset;
- if(!ent.sameteam)
+ float hit;
+ if(ent.sameteam)
+ {
+ hit = 1;
+ }
+ else
{
- /* WIP, why does trace_ent != ent not work as intended here?
- if(autocvar_hud_shownames_enemies != 2) // player has to point at enemy if so
- {
- traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, MOVETYPE_FLY, world);
- print("trace_endpos: ", vtos(trace_endpos), " view_origin: ", vtos(view_origin), "\n");
- if(trace_ent != ent)
- return;
- }*/
-
- traceline(ent.origin, view_origin, 1, ent);
+ traceline(view_origin, ent.origin, MOVE_NORMAL, ent);
+ if(trace_fraction < 1 && trace_networkentity != ent.sv_entnum)
+ hit = 0;
+ else
+ hit = 1;
}
vector o, eo;
o = project_3d_to_2d(ent.origin);
- float overlap;
+ float overlap, onscreen;
if(autocvar_hud_shownames_antioverlap)
{
}
}
- if(!ent.sameteam && trace_endpos != view_origin) // out of view, fade out
- ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+ onscreen = (o_z >= 0 && o_x >= 0 && o_y >= 0 && o_x <= vid_conwidth && o_y <= vid_conheight);
+
+ if(!ent.fadedelay)
+ ent.fadedelay = time + SHOWNAMES_FADEDELAY;
+
+ if(!ent.sameteam && (!onscreen || !hit)) // out of view, fade out
+ {
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+ ent.fadedelay = 0; // reset fade in delay, enemy has left the view
+ }
else if(ent.healthvalue < 1) // dead player, fade out slowly
- ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
else if(overlap) // tag overlap detected, fade out
- ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
- else // fade in
+ ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+ else if(ent.sameteam) // fade in for team mates
+ ent.alpha = min(1, ent.alpha + SHOWNAMES_FADESPEED * frametime);
+ else if(time > ent.fadedelay) // fade in for enemies
ent.alpha = min(1, ent.alpha + SHOWNAMES_FADESPEED * frametime);
if(!ent.alpha)
return;
-
+
float dist;
dist = vlen(ent.origin - view_origin);
resize = 0.5 + 0.5 * ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
// draw the sprite image
- if not(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+ if(o_z >= 0)
{
o_z = 0;
float i;
for(i = 0; i < maxclients; ++i)
{
- vector o;
float t;
t = GetPlayerColor(i);
if(t == COLOR_SPECTATOR)
.float healthvalue;
.float armorvalue;
.float sameteam;
-.float the_entnum;
+.float fadedelay;
for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
{
vol0 = e.lastvol;
- if(getsoundtime(e, CHAN_VOICE) < 0)
+ if(getsoundtime(e, CH_BGM_SINGLE) < 0)
{
vol0 = -1;
}
if(vol != vol0)
{
if(vol0 < 0)
- sound(e, CHAN_VOICE, e.noise, vol, ATTN_NONE); // restart
+ sound(e, CH_BGM_SINGLE, e.noise, vol, ATTN_NONE); // restart
else
- sound(e, CHAN_VOICE, "", vol, ATTN_NONE);
+ sound(e, CH_BGM_SINGLE, "", vol, ATTN_NONE);
e.lastvol = vol;
}
}
music_trigger = world;
if(best)
- bgmtime = getsoundtime(best, CHAN_VOICE);
+ bgmtime = getsoundtime(best, CH_BGM_SINGLE);
else
bgmtime = gettime(GETTIME_CDTRACK);
}
strunzone(e.noise);
e.noise = strzone(noi);
precache_sound(e.noise);
- sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
- if(getsoundtime(e, CHAN_VOICE) < 0)
+ sound(e, CH_BGM_SINGLE, e.noise, 0, ATTN_NONE);
+ if(getsoundtime(e, CH_BGM_SINGLE) < 0)
{
print(sprintf(_("Cannot initialize sound %s\n"), e.noise));
strunzone(e.noise);
if(self.noise != s)
{
precache_sound(self.noise);
- sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
- if(getsoundtime(self, CHAN_VOICE) < 0)
+ sound(self, CH_BGM_SINGLE, self.noise, 0, ATTN_NONE);
+ if(getsoundtime(self, CH_BGM_SINGLE) < 0)
{
print(sprintf(_("Cannot initialize sound %s\n"), self.noise));
strunzone(self.noise);
// to make entities have dots on the team radar
.float teamradar_icon;
-.float teamradar_times[MAX_TEAMRADAR_TIMES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(teamradar_times);
+.float teamradar_times[MAX_TEAMRADAR_TIMES];
.float teamradar_time_index;
.vector teamradar_color;
--- /dev/null
+string tid2info_base;
+string tid2info_head;
+string tid2info_name;
+vector tid2info_min;
+vector tid2info_max;
+
+void turret_tid2info(float _tid);
+void turret_precache(float _tid);
+float turret_is_precache[TID_LAST];
+
+void turrets_precache()
+{
+ turret_precache(TID_COMMON);
+}
+
+void turret_precache(float _tid)
+{
+ if (!turret_is_precache[TID_COMMON])
+ {
+ dprint("turret_precache TID_COMMON\n");
+ precache_sound ("weapons/rocket_impact.wav");
+ precache_model ("models/turrets/base-gib1.md3");
+ precache_model ("models/turrets/base-gib2.md3");
+ precache_model ("models/turrets/base-gib3.md3");
+ precache_model ("models/turrets/base-gib4.md3");
+ precache_model ("models/turrets/head-gib1.md3");
+ precache_model ("models/turrets/head-gib2.md3");
+ precache_model ("models/turrets/head-gib3.md3");
+ precache_model ("models/turrets/head-gib4.md3");
+ precache_model ("models/turrets/terrainbase.md3");
+ precache_model ("models/turrets/base.md3");
+ precache_model ("models/turrets/rocket.md3");
+ }
+ turret_tid2info(_tid);
+ if(turret_is_precache[_tid])
+ {
+ dprint("turret_precache: ", tid2info_name, " allready precachd, skipping.\n");
+ return;
+ }
+ else
+ dprint("turret_precache: ", tid2info_name, " precaching.\n");
+
+ switch(_tid)
+ {
+ case TID_EWHEEL:
+ precache_model ("models/turrets/ewheel-base2.md3");
+ precache_model ("models/turrets/ewheel-gun1.md3");
+ break;
+ case TID_FLAC:
+ precache_model ("models/turrets/flac.md3");
+ break;
+ case TID_FUSION:
+ precache_model ("models/turrets/reactor.md3");
+ break;
+ case TID_HELLION:
+ precache_model ("models/turrets/hellion.md3");
+ break;
+ case TID_HK:
+ precache_model ("models/turrets/hk.md3");
+ break;
+ case TID_MACHINEGUN:
+ precache_model ("models/turrets/machinegun.md3");
+ precache_sound ("weapons/uzi_fire.wav");
+ break;
+ case TID_MLRS:
+ precache_model ("models/turrets/mlrs.md3");
+ break;
+ case TID_PHASER:
+ precache_model ("models/turrets/phaser.md3");
+ precache_model ("models/turrets/phaser_beam.md3");
+ precache_sound ("turrets/phaser.wav");
+ break;
+ case TID_PLASMA:
+ precache_model ("models/turrets/plasma.md3");
+ break;
+ case TID_PLASMA_DUAL:
+ precache_model ("models/turrets/plasmad.md3");
+ break;
+ case TID_TESLA:
+ precache_model ("models/turrets/tesla_head.md3");
+ precache_model ("models/turrets/tesla_base.md3");
+ break;
+ case TID_WALKER:
+ precache_model ("models/turrets/walker_head_minigun.md3");
+ precache_model ("models/turrets/walker_body.md3");
+ precache_sound ("weapons/uzi_fire.wav");
+ break;
+ }
+ turret_is_precache[_tid] = TRUE;
+}
+
+void turret_tid2info(float _tid)
+{
+ tid2info_base = "models/turrets/base.md3";
+ tid2info_min = '-32 -32 0';
+ tid2info_max = '32 32 64';
+
+ switch(_tid)
+ {
+ case TID_EWHEEL:
+ tid2info_base = "models/turrets/ewheel-base2.md3";
+ tid2info_head = "models/turrets/ewheel-gun1.md3";
+ tid2info_name = "eWheel";
+ break;
+ case TID_FLAC:
+ tid2info_head = "models/turrets/flac.md3";
+ tid2info_name = "Flac Cannon";
+ break;
+ case TID_FUSION:
+ tid2info_head = "models/turrets/reactor.md3";
+ tid2info_name = "Fusion Reactor";
+ tid2info_min = '-34 -34 0';
+ tid2info_max = '34 34 90';
+ break;
+ case TID_HELLION:
+ tid2info_head = "models/turrets/hellion.md3";
+ tid2info_name = "Hellion";
+ break;
+ case TID_HK:
+ tid2info_head = "models/turrets/hk.md3";
+ tid2info_name = "Hunter-Killer";
+ break;
+ case TID_MACHINEGUN:
+ tid2info_head = "models/turrets/machinegun.md3";
+ tid2info_name = "Machinegun";
+ break;
+ case TID_MLRS:
+ tid2info_head = "models/turrets/mlrs.md3";
+ tid2info_name = "MLRS";
+ break;
+ case TID_PHASER:
+ tid2info_head = "models/turrets/phaser.md3";
+ tid2info_name = "Phaser";
+ break;
+ case TID_PLASMA:
+ tid2info_head = "models/turrets/plasma.md3";
+ tid2info_name = "Plasma";
+ break;
+ case TID_PLASMA_DUAL:
+ tid2info_head = "models/turrets/plasmad.md3";
+ tid2info_name = "Dual Plasma";
+ break;
+ case TID_TESLA:
+ tid2info_base = "models/turrets/tesla_base.md3";
+ tid2info_head = "models/turrets/tesla_head.md3";
+ tid2info_name = "Tesla coil";
+ tid2info_min = '-60 -60 0';
+ tid2info_max ='60 60 128';
+ break;
+ case TID_WALKER:
+ tid2info_base = "models/turrets/walker_body.md3";
+ tid2info_head = "models/turrets/walker_head_minigun.md3";
+ tid2info_name = "Walker";
+ tid2info_min = '-70 -70 0';
+ tid2info_max = '70 70 95';
+ break;
+ }
+}
+
+void turret_remove()
+{
+ turret_tid2info(self.turret_type);
+ dprint("Removing ", tid2info_name, " turrret.\n");
+
+ remove(self.tur_head);
+ self.tur_head = world;
+}
+
+void turret_changeteam()
+{
+ self.colormod = '0 0 0';
+
+ switch(self.team)
+ {
+ case COLOR_TEAM1: // Red
+ self.colormod = '2 0.5 0.5';
+ break;
+
+ case COLOR_TEAM2: // Blue
+ self.colormod = '0.5 0.5 2';
+ break;
+
+ case COLOR_TEAM3: // Yellow
+ self.colormod = '1.4 1.4 0.6';
+ break;
+
+ case COLOR_TEAM4: // Pink
+ self.colormod = '1.4 0.6 1.4';
+ break;
+ }
+
+ self.tur_head.colormod = self.colormod;
+}
+
+void turret_head_draw()
+{
+ self.drawmask = MASK_NORMAL;
+}
+
+void turret_draw()
+{
+ float dt;
+
+ dt = time - self.move_time;
+ self.move_time = time;
+ if(dt <= 0)
+ return;
+
+ self.tur_head.angles += dt * self.tur_head.move_avelocity;
+
+ if (self.health < 127)
+ {
+ dt = random();
+
+ if(dt < 0.25)
+ te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
+
+ }
+
+ if(self.health < 85)
+ if(dt < 0.1)
+ pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+
+ if(self.health < 32)
+ if(dt < 0.1)
+ pointparticles(particleeffectnum("smoke_large"), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+
+}
+
+void turret_walker_draw()
+{
+ float dt;
+
+ dt = time - self.move_time;
+ self.move_time = time;
+ if(dt <= 0)
+ return;
+
+ fixedmakevectors(self.angles);
+ movelib_groundalign4point(300, 100, 0.25);
+
+ setorigin(self, self.origin + self.velocity * dt);
+ setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+
+ self.tur_head.angles += dt * self.tur_head.move_avelocity;
+
+ self.angles_y = self.move_angles_y;
+
+ if (self.health < 127)
+ if(random() < 0.25)
+ te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
+}
+
+void turret_ewheel_draw()
+{
+ float dt;
+
+ dt = time - self.move_time;
+ self.move_time = time;
+ if(dt <= 0)
+ return;
+
+ fixedmakevectors(self.angles);
+ movelib_groundalign4point(300, 100, 0.25);
+
+ setorigin(self, self.origin + self.velocity * dt);
+ setorigin(self.tur_head, self.origin);
+
+ self.tur_head.angles += dt * self.tur_head.move_avelocity;
+
+ // Simulate banking
+ //self.angles_z -= self.angles_z * dt * 2;
+ //self.angles_z = bound(-45, self.angles_z + ((self.move_angles_y - self.angles_y * -25) * dt), 45);
+
+ self.angles_y = self.move_angles_y;
+
+ if (self.health < 127)
+ if(random() < 0.25)
+ te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
+}
+
+void turret_construct()
+{
+ if(self.tur_head == world)
+ self.tur_head = spawn();
+
+ turret_tid2info(self.turret_type);
+ dprint("Constructing ", tid2info_name , " turret (", ftos(self.turret_type), ")\n");
+
+ setorigin(self, self.origin);
+ setmodel(self, tid2info_base);
+ setmodel(self.tur_head, tid2info_head);
+ setsize(self, tid2info_min, tid2info_max);
+ setsize(self.tur_head, '0 0 0', '0 0 0');
+ setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+
+ self.tur_head.classname = "turret_head";
+ self.tur_head.owner = self;
+ self.tur_head.move_movetype = MOVETYPE_NOCLIP;
+ self.move_movetype = MOVETYPE_NOCLIP;
+ self.tur_head.angles = self.angles;
+ self.health = 255;
+ self.solid = SOLID_BBOX;
+ self.tur_head.solid = SOLID_NOT;
+ self.movetype = MOVETYPE_NOCLIP;
+ self.tur_head.movetype = MOVETYPE_NOCLIP;
+ self.draw = turret_draw;
+ self.entremove = turret_remove;
+ self.drawmask = MASK_NORMAL;
+ self.tur_head.drawmask = MASK_NORMAL;
+
+ if(self.turret_type == TID_EWHEEL || self.turret_type == TID_WALKER)
+ {
+ self.gravity = 1;
+ self.movetype = MOVETYPE_BOUNCE;
+ self.move_movetype = MOVETYPE_BOUNCE;
+ self.move_origin = self.origin;
+ self.move_time = time;
+ switch(self.turret_type)
+ {
+ case TID_EWHEEL:
+ self.draw = turret_ewheel_draw;
+ break;
+ case TID_WALKER:
+ self.draw = turret_walker_draw;
+ }
+ }
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode);
+void turret_gibboom();
+void turret_gib_draw()
+{
+ Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+
+ self.drawmask = MASK_NORMAL;
+
+ if(self.cnt)
+ {
+ if(time >= self.nextthink)
+ {
+ turret_gibboom();
+ remove(self);
+ }
+ }
+ else
+ {
+ self.alpha = bound(0, self.nextthink - time, 1);
+ if(self.alpha < ALPHA_MIN_VISIBLE)
+ remove(self);
+ }
+}
+
+void turret_gibboom()
+{
+ float i;
+
+ sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+
+ for (i = 1; i < 5; i = i + 1)
+ turret_gibtoss(strcat("models/turrets/head-gib", ftos(i), ".md3"), self.origin, self.velocity + randomvec() * 700, '0 0 0', FALSE);
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode)
+{
+ entity gib;
+
+ gib = spawn();
+ setorigin(gib, _from);
+ setmodel(gib, _model);
+ gib.colormod = _cmod;
+ gib.solid = SOLID_CORPSE;
+ gib.draw = turret_gib_draw;
+ gib.cnt = _explode;
+
+ if(_explode)
+ {
+ gib.nextthink = time + 0.2 * (autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15));
+ gib.effects = EF_FLAME;
+ }
+ else
+ gib.nextthink = time + autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15);
+
+ gib.gravity = 1;
+ gib.move_movetype = MOVETYPE_BOUNCE;
+ gib.move_origin = gib.origin = _from;
+ gib.move_velocity = _to;
+ gib.move_avelocity = prandomvec() * 32;
+ gib.move_time = time;
+ gib.damageforcescale = 1;
+
+ return gib;
+}
+
+void turret_die()
+{
+ entity headgib;
+
+ setmodel(self, "");
+ setmodel(self.tur_head, "");
+ sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+ turret_tid2info(self.turret_type);
+ dprint("Turret ", tid2info_name, " dies.\n");
+
+ // Base
+ if(self.turret_type == TID_EWHEEL)
+ turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+ else if (self.turret_type == TID_WALKER)
+ turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+ else if (self.turret_type == TID_TESLA)
+ turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+ else
+ {
+ if (random() > 0.5)
+ {
+ turret_gibtoss("models/turrets/base-gib2.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+ turret_gibtoss("models/turrets/base-gib3.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+ turret_gibtoss("models/turrets/base-gib4.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+ }
+ else
+ turret_gibtoss("models/turrets/base-gib1.md3", self.origin + '0 0 4', '0 0 0', '0 0 0', TRUE);
+ }
+
+ headgib = turret_gibtoss(tid2info_head, self.origin + '0 0 32', '0 0 200' + randomvec() * 200, '-1 -1 -1', TRUE);
+ headgib.angles = headgib.move_angles = self.tur_head.angles;
+ headgib.avelocity = headgib.move_avelocity = self.tur_head.move_avelocity + randomvec() * 45;
+ headgib.avelocity_y = headgib.move_avelocity_y = headgib.move_avelocity_y * 5;
+ headgib.gravity = 0.5;
+}
+
+void ent_turret()
+{
+ float sf;
+ sf = ReadByte();
+
+ if(sf & TNSF_SETUP)
+ {
+ self.turret_type = ReadByte();
+
+ self.origin_x = ReadCoord();
+ self.origin_y = ReadCoord();
+ self.origin_z = ReadCoord();
+
+ self.angles_x = ReadAngle();
+ self.angles_y = ReadAngle();
+
+ turret_precache(self.turret_type);
+ turret_construct();
+ }
+
+ if(sf & TNSF_ANG)
+ {
+ self.tur_head.move_angles_x = ReadShort();
+ self.tur_head.move_angles_y = ReadShort();
+ self.tur_head.angles = self.angles + self.tur_head.move_angles;
+ }
+
+ if(sf & TNSF_AVEL)
+ {
+ self.tur_head.move_avelocity_x = ReadShort();
+ self.tur_head.move_avelocity_y = ReadShort();
+ }
+
+ if(sf & TNSF_MOVE)
+ {
+ self.origin_x = ReadShort();
+ self.origin_y = ReadShort();
+ self.origin_z = ReadShort();
+ setorigin(self, self.origin);
+
+ self.velocity_x = ReadShort();
+ self.velocity_y = ReadShort();
+ self.velocity_z = ReadShort();
+
+ self.move_angles_y = ReadShort();
+
+ self.move_time = time;
+ self.move_velocity = self.velocity;
+ self.move_origin = self.origin;
+ }
+
+ if(sf & TNSF_ANIM)
+ {
+ self.frame1time = ReadCoord();
+ self.frame = ReadByte();
+ }
+
+ if(sf & TNSF_STATUS)
+ {
+ float _team;
+ _team = ReadByte();
+ _team -= 1; // /&)=(%&#)&%)/#&)=½!!!½!!". thanks.
+ self.health = ReadByte();
+ if(_team != self.team)
+ {
+ self.team = _team;
+ turret_changeteam();
+ }
+
+ if(self.health == 0)
+ turret_die();
+ }
+
+}
--- /dev/null
+void ent_turret();
+void turrets_precache();
+.entity tur_head;
-#define TUBA_STARTNOTE(n) strcat((checkextension("DP_SND_SETPARAMS") ? "weapons/tuba_loopnote" : "weapons/tuba_note"), ftos(n), ".wav")
-.float cnt; // note
+#define TUBA_MIN -18
+#define TUBA_MAX 27
+
+#define TUBA_STARTNOTE(n) strcat("weapons/tuba_loopnote", ftos(n), ".wav")
+.float note; // note
.float attenuate; // if set, attenuate it
+.float cnt; // current volume
+.float count; // initial volume
+
+float Tuba_PitchStep;
+
+void tubasound(entity e, float restart)
+{
+ string snd1;
+
+ snd1 = string_null;
+
+ if(Tuba_PitchStep)
+ {
+ string snd2;
+ float f1, f2;
+ float p1, p2;
+ float m;
+
+ f1 = 1;
+ p1 = 1;
+ snd2 = string_null;
+ f2 = 0;
+ p2 = 1;
+
+ m = mod(e.note, Tuba_PitchStep);
+ if(m)
+ {
+ if(e.note - m < TUBA_MIN)
+ {
+ if(restart)
+ snd1 = TUBA_STARTNOTE(e.note - m + Tuba_PitchStep);
+ p1 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
+ }
+ else if(e.note - m + Tuba_PitchStep > TUBA_MAX)
+ {
+ if(restart)
+ snd1 = TUBA_STARTNOTE(e.note - m);
+ p1 = pow(2.0, m / 12.0);
+ }
+ else
+ {
+ if(restart)
+ snd1 = TUBA_STARTNOTE(e.note - m);
+ f1 = 1 - m / Tuba_PitchStep;
+ p1 = pow(2.0, m / 12.0);
+ if(restart)
+ snd2 = TUBA_STARTNOTE(e.note - m + Tuba_PitchStep);
+ f2 = m / Tuba_PitchStep;
+ p2 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
+ }
+ }
+ else
+ {
+ if(restart)
+ snd1 = TUBA_STARTNOTE(e.note);
+ }
+
+ sound7(e, CH_TUBA, snd1, e.cnt * f1, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p1, 0);
+ if(f2)
+ sound7(e.enemy, CH_TUBA, snd2, e.cnt * f2, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p2, 0);
+ }
+ else
+ {
+ if(restart)
+ snd1 = TUBA_STARTNOTE(e.note);
+ sound(e, CH_TUBA, snd1, e.cnt, e.attenuate * autocvar_g_balance_tuba_attenuation);
+ }
+}
void Ent_TubaNote_Think()
{
self.nextthink = time;
if(self.cnt <= 0)
{
- sound(self, CHAN_PROJECTILE, "misc/null.wav", 0, 0);
+ sound(self, CH_TUBA, "misc/null.wav", 0, 0);
+ if(self.enemy)
+ {
+ sound(self.enemy, CH_TUBA, "misc/null.wav", 0, 0);
+ remove(self.enemy);
+ }
remove(self);
}
else
- sound(self, CHAN_PROJECTILE, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
+ {
+ tubasound(self, 0);
+ }
}
void Ent_TubaNote_UpdateSound()
{
self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
self.enemy.count = self.enemy.cnt;
- sound(self.enemy, CHAN_PROJECTILE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
+ self.enemy.note = self.note;
+ tubasound(self.enemy, 1);
}
void Ent_TubaNote_StopSound()
float f, n;
f = ReadByte();
n = floor(f / 2) - 42;
- if(n != self.cnt || bIsNew)
+ if(n != self.note || bIsNew)
if(self.enemy)
Ent_TubaNote_StopSound();
if(!self.enemy)
{
self.enemy = spawn();
self.enemy.classname = "tuba_note";
+ if(Tuba_PitchStep)
+ {
+ self.enemy.enemy = spawn();
+ self.enemy.enemy.classname = "tuba_note_2";
+ }
bIsNew = TRUE;
}
if(f & 1)
self.enemy.origin_z = ReadCoord();
setorigin(self.enemy, self.enemy.origin);
self.enemy.attenuate = ReadByte();
+ if(self.enemy.enemy)
+ setorigin(self.enemy.enemy, self.enemy.origin);
}
self.think = Ent_TubaNote_StopSound;
self.entremove = Ent_TubaNote_StopSound;
self.enemy.nextthink = time + 10;
if(bIsNew)
{
- self.cnt = n;
+ self.note = n;
Ent_TubaNote_UpdateSound();
}
}
void Tuba_Precache()
{
float i;
- for(i = -18; i <= +27; ++i)
+ Tuba_PitchStep = autocvar_g_balance_tuba_pitchstep;
+ if(Tuba_PitchStep)
+ {
+ if(!checkextension("DP_SND_SOUND7_WIP2") && !checkextension("DP_SND_SOUND7"))
+ {
+ print("^1NOTE:^7 requested pitch shifting, but not supported by this engine build\n");
+ Tuba_PitchStep = 0;
+ }
+ }
+ for(i = TUBA_MIN; i <= TUBA_MAX; ++i)
{
- precache_sound(TUBA_STARTNOTE(i));
+ if(!Tuba_PitchStep || (mod(i, Tuba_PitchStep) == 0))
+ precache_sound(TUBA_STARTNOTE(i));
}
- //precache_sound(""); // we want to change volume of existing sounds
}
--- /dev/null
+#define hud_bg "gfx/vehicles/frame.tga"
+#define hud_sh "gfx/vehicles/vh-shield.tga"
+
+#define hud_hp_bar "gfx/vehicles/bar_up_left.tga"
+#define hud_hp_ico "gfx/vehicles/health.tga"
+#define hud_sh_bar "gfx/vehicles/bar_dwn_left.tga"
+#define hud_sh_ico "gfx/vehicles/shield.tga"
+
+#define hud_ammo1_bar "gfx/vehicles/bar_up_right.tga"
+#define hud_ammo1_ico "gfx/vehicles/bullets.tga"
+#define hud_ammo2_bar "gfx/vehicles/bar_dwn_right.tga"
+#define hud_ammo2_ico "gfx/vehicles/rocket.tga"
+
+entity dropmark;
+float autocvar_cl_vehicles_hudscale;
+float autocvar_cl_vehicles_hudalpha;
+
+
+void CSQC_WAKIZASHI_HUD();
+void CSQC_SPIDER_HUD();
+void CSQC_RAPTOR_HUD();
+void CSQC_BUMBLE_HUD();
+
+#define MAX_AXH 4
+entity AuxiliaryXhair[MAX_AXH];
+const var void Draw_Not();
+
+.string axh_image;
+.float axh_fadetime;
+.float axh_drawflag;
+.float axh_scale;
+
+void AuxiliaryXhair_Draw2D()
+{
+ vector loc, psize;
+
+ psize = self.axh_scale * drawgetimagesize(self.axh_image);
+ loc = project_3d_to_2d(self.origin) - 0.5 * psize;
+ if not (loc_z < 0 || loc_x < 0 || loc_y < 0 || loc_x > vid_conwidth || loc_y > vid_conheight)
+ {
+ loc_z = 0;
+ psize_z = 0;
+ drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag);
+ }
+
+ if(time - self.cnt > self.axh_fadetime)
+ self.draw2d = Draw_Not;
+}
+
+void Net_AuXair2(float bIsNew)
+{
+ float axh_id;
+ entity axh;
+
+ axh_id = bound(0, ReadByte(), MAX_AXH);
+ axh = AuxiliaryXhair[axh_id];
+
+ if(axh == world || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+ {
+ axh = spawn();
+ axh.draw2d = Draw_Not;
+ axh.drawmask = MASK_NORMAL;
+ axh.axh_drawflag = DRAWFLAG_ADDITIVE;
+ axh.axh_fadetime = 0.1;
+ axh.axh_image = "gfx/vehicles/axh-ring.tga";
+ axh.axh_scale = 1;
+ axh.alpha = 1;
+ AuxiliaryXhair[axh_id] = axh;
+ }
+
+ axh.draw2d = AuxiliaryXhair_Draw2D;
+
+ axh.origin_x = ReadCoord();
+ axh.origin_y = ReadCoord();
+ axh.origin_z = ReadCoord();
+
+ axh.colormod_x = ReadByte() / 255;
+ axh.colormod_y = ReadByte() / 255;
+ axh.colormod_z = ReadByte() / 255;
+ axh.cnt = time;
+}
+
+void Net_VehicleSetup()
+{
+
+ float hud_id, i;
+ hud_id = bound(HUD_SPIDERBOT, ReadByte(), HUD_RAPTOR);
+
+ // Init auxiliary crosshairs
+ entity axh;
+ for(i = 0; i < MAX_AXH; ++i)
+ {
+ axh = AuxiliaryXhair[i];
+ if(axh != world && !wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+ remove(axh);
+
+ axh = spawn();
+ axh.draw2d = Draw_Not;
+ axh.drawmask = MASK_NORMAL;
+ axh.axh_drawflag = DRAWFLAG_NORMAL;
+ axh.axh_fadetime = 0.1;
+ axh.axh_image = "gfx/vehicles/axh-ring.tga";
+ axh.axh_scale = 1;
+ axh.alpha = 1;
+ AuxiliaryXhair[i] = axh;
+ }
+
+ switch(hud_id)
+ {
+ case HUD_SPIDERBOT:
+ // Minigun1
+ AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-ring.tga";
+ AuxiliaryXhair[0].axh_scale = 0.25;
+ // Minigun2
+ AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-ring.tga";
+ AuxiliaryXhair[1].axh_scale = 0.25;
+ // Rocket
+ AuxiliaryXhair[2].axh_image = "gfx/vehicles/axh-special1.tga";
+ AuxiliaryXhair[2].axh_scale = 0.5;
+ break;
+
+ case HUD_WAKIZASHI:
+ AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-bracket.tga";
+ AuxiliaryXhair[0].axh_scale = 0.25;
+ break;
+
+ case HUD_RAPTOR:
+ AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-special2.tga";
+ AuxiliaryXhair[0].axh_scale = 0.5;
+ //AuxiliaryXhair[0].alpha = 0.5;
+
+ AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-bracket.tga";
+ AuxiliaryXhair[1].axh_scale = 0.25;
+ //AuxiliaryXhair[1].alpha = 0.75;
+ //AuxiliaryXhair[1].axh_drawflag = DRAWFLAG_NORMAL;
+ break;
+
+ case HUD_BUMBLEBEE:
+ // Plasma cannons
+ AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-ring.tga";
+ AuxiliaryXhair[0].axh_scale = 0.25;
+ // Raygun
+ AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-special1.tga";
+ AuxiliaryXhair[1].axh_scale = 0.25;
+ break;
+ }
+}
+#define HUD_GETSTATS \
+ float vh_health = getstati(STAT_VEHICLESTAT_HEALTH); \
+ float shield = getstati(STAT_VEHICLESTAT_SHIELD); \
+ float energy = getstati(STAT_VEHICLESTAT_ENERGY); \
+ float ammo1 = getstati(STAT_VEHICLESTAT_AMMO1); \
+ float reload1 = getstati(STAT_VEHICLESTAT_RELOAD1); \
+ float ammo2 = getstati(STAT_VEHICLESTAT_AMMO2); \
+ float reload2 = getstati(STAT_VEHICLESTAT_RELOAD2);
+
+void CSQC_BUMBLE_HUD()
+{
+}
+
+
+#define spider_ico "gfx/vehicles/sbot.tga"
+#define spider_rkt "gfx/vehicles/sbot_rpods.tga"
+#define spider_mgun "gfx/vehicles/sbot_mguns.tga"
+#define spider_xhair "gfx/vehicles/axh-special1.tga"
+float alarm1time;
+float alarm2time;
+
+void CSQC_SPIDER_HUD()
+{
+ if(autocvar_r_letterbox)
+ return;
+
+ vector picsize, hudloc, pic2size, picloc;
+ float i;
+
+ // Fetch health & ammo stats
+ HUD_GETSTATS
+
+ picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+ hudloc_y = vid_conheight - picsize_y;
+ hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+ drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+ //drawstring(hudloc + '145 19 0', strcat(ftos(vh_health), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
+ //drawstring(hudloc + '175 34 0', strcat(ftos(shield), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
+ //drawstring(hudloc + '136 102 0', strcat(ftos(ammo1), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+ //drawstring(hudloc + '179 69 0', strcat(ftos(9 - ammo2), " / 8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+
+ ammo1 *= 0.01;
+ shield *= 0.01;
+ vh_health *= 0.01;
+ reload2 *= 0.01;
+
+ pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+ picloc = picsize * 0.5 - pic2size * 0.5;
+ if(vh_health < 0.25)
+ drawpic(hudloc + picloc, spider_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, spider_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, spider_rkt, pic2size, '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1 + '1 0 0' * (1 - ammo1), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+ picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+ if(vh_health < 0.25)
+ {
+ if(alarm1time < time)
+ {
+ alarm1time = time + 2;
+ sound(world, CH_PAIN, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm1time)
+ {
+ sound(world, CH_PAIN, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm1time = 0;
+ }
+ }
+// Shield bar
+ picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+ picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+ if(shield < 0.25)
+ {
+ if(alarm2time < time)
+ {
+ alarm2time = time + 1;
+ sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm2time)
+ {
+ sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm2time = 0;
+ }
+ }
+
+
+// Minigun bar
+ picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * ammo1, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+ if(ammo1 < 0.2)
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Rocket ammo bar
+ picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+ ammo1 = picsize_x / 8;
+ picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload2, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+
+// .. and icons
+ pic2size = 0.35 * drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+ picloc_x -= pic2size_x;
+ picloc_y += pic2size_y * 2.25;
+ if(ammo2 == 9)
+ {
+ for(i = 1; i < 9; ++i)
+ {
+ picloc_x += ammo1;
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL);
+ }
+ }
+ else
+ {
+ for(i = 1; i < 9; ++i)
+ {
+ picloc_x += ammo1;
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL);
+ }
+ }
+ pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+ if(ammo2 == 9)
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+ if (scoreboard_showscores)
+ HUD_DrawScoreboard();
+ else
+ {
+ picsize = drawgetimagesize(spider_xhair);
+ picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+ picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE);
+ }
+}
+
+#define raptor_ico "gfx/vehicles/raptor.tga"
+#define raptor_gun "gfx/vehicles/raptor_guns.tga"
+#define raptor_bomb "gfx/vehicles/raptor_bombs.tga"
+#define raptor_drop "gfx/vehicles/axh-dropcross.tga"
+#define raptor_xhair "gfx/vehicles/axh-ring.tga"
+void CSQC_RAPTOR_HUD()
+{
+ if(autocvar_r_letterbox)
+ return;
+
+ vector picsize, hudloc, pic2size, picloc;
+
+ // Fetch health & ammo stats
+ HUD_GETSTATS
+
+ picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+ hudloc_y = vid_conheight - picsize_y;
+ hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+ drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+ ammo1 *= 0.01;
+ ammo2 *= 0.01;
+ shield *= 0.01;
+ vh_health *= 0.01;
+ energy *= 0.01;
+ reload1 = reload2 * 0.01;
+ //reload2 *= 0.01;
+
+ pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+ picloc = picsize * 0.5 - pic2size * 0.5;
+ if(vh_health < 0.25)
+ drawpic(hudloc + picloc, raptor_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, raptor_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, raptor_bomb, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+ picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+ if(vh_health < 0.25)
+ {
+ if(alarm1time < time)
+ {
+ alarm1time = time + 2;
+ sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm1time)
+ {
+ sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm1time = 0;
+ }
+ }
+
+// Shield bar
+ picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+ picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+ if(shield < 0.25)
+ {
+ if(alarm2time < time)
+ {
+ alarm2time = time + 1;
+ sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm2time)
+ {
+ sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm2time = 0;
+ }
+ }
+
+// Gun bar
+ picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+ if(energy < 0.2)
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+ picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+ if(reload1 != 1)
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bombing crosshair
+ if(!dropmark)
+ {
+ dropmark = spawn();
+ dropmark.owner = self;
+ dropmark.gravity = 1;
+ }
+
+ if(reload2 == 100)
+ {
+ vector where;
+
+ setorigin(dropmark, pmove_org);
+ dropmark.velocity = pmove_vel;
+ tracetoss(dropmark, self);
+
+ where = project_3d_to_2d(trace_endpos);
+
+ setorigin(dropmark, trace_endpos);
+ picsize = drawgetimagesize(raptor_drop) * 0.2;
+
+ if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+ {
+ where_x -= picsize_x * 0.5;
+ where_y -= picsize_y * 0.5;
+ where_z = 0;
+ drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE);
+ }
+ dropmark.cnt = time + 5;
+ }
+ else
+ {
+ vector where;
+ if(dropmark.cnt > time)
+ {
+ where = project_3d_to_2d(dropmark.origin);
+ picsize = drawgetimagesize(raptor_drop) * 0.25;
+
+ if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+ {
+ where_x -= picsize_x * 0.5;
+ where_y -= picsize_y * 0.5;
+ where_z = 0;
+ drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE);
+ }
+ }
+ }
+
+ if (scoreboard_showscores)
+ HUD_DrawScoreboard();
+ else
+ {
+ picsize = drawgetimagesize(raptor_xhair);
+ picsize_x *= 0.5;
+ picsize_y *= 0.5;
+
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ }
+}
+
+#define waki_ico "gfx/vehicles/waki.tga"
+#define waki_eng "gfx/vehicles/waki_e.tga"
+#define waki_gun "gfx/vehicles/waki_guns.tga"
+#define waki_rkt "gfx/vehicles/waki_rockets.tga"
+#define waki_xhair "gfx/vehicles/axh-special1.tga"
+void CSQC_WAKIZASHI_HUD()
+{
+/*
+ drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
+ drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
+*/
+ if(autocvar_r_letterbox)
+ return;
+
+ vector picsize, hudloc, pic2size, picloc;
+
+ // Fetch health & ammo stats
+ HUD_GETSTATS
+
+ picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+ hudloc_y = vid_conheight - picsize_y;
+ hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+ drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+ shield *= 0.01;
+ vh_health *= 0.01;
+ energy *= 0.01;
+ reload1 *= 0.01;
+
+ pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+ picloc = picsize * 0.5 - pic2size * 0.5;
+ if(vh_health < 0.25)
+ drawpic(hudloc + picloc, waki_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, waki_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, waki_rkt, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+ drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+ picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+ if(vh_health < 0.25)
+ {
+ if(alarm1time < time)
+ {
+ alarm1time = time + 2;
+ sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm1time)
+ {
+ sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm1time = 0;
+ }
+ }
+
+
+// Shield bar
+ picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+ drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+ picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+ if(shield < 0.25)
+ {
+ if(alarm2time < time)
+ {
+ alarm2time = time + 1;
+ sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+ }
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ }
+ else
+ {
+ drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ if(alarm2time)
+ {
+ sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+ alarm2time = 0;
+ }
+ }
+
+// Gun bar
+ picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+ if(energy < 0.2)
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+ picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+ picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+ drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+ drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+// .. and icon
+ pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+ picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+ if(reload1 != 1)
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+ else
+ drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+ if (scoreboard_showscores)
+ HUD_DrawScoreboard();
+ else
+ {
+ picsize = drawgetimagesize(waki_xhair);
+ picsize_x *= 0.5;
+ picsize_y *= 0.5;
+
+
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+ }
+}
+
+void Vehicles_Precache()
+{
+// fixme: HAAAAKKKZZZ!!!!!!!!!!!! (this belongs as a setting in default.cfg)
+ autocvar_cl_vehicles_hudscale = 0.5;
+ autocvar_cl_vehicles_hudalpha = 0.75;
+
+
+ precache_model("models/vehicles/wakizashi.dpm");
+
+ precache_model("models/vehicles/bomblet.md3");
+ precache_model("models/vehicles/clusterbomb.md3");
+ precache_model("models/vehicles/clusterbomb_fragment.md3");
+ precache_model("models/vehicles/rocket01.md3");
+ precache_model("models/vehicles/rocket02.md3");
+
+ precache_sound ("vehicles/alarm.wav");
+ precache_sound ("vehicles/alarm_shield.wav");
+}
+
+void RaptorCBShellfragDraw()
+{
+
+ Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+ if(wasfreed(self))
+ return;
+
+ self.move_avelocity += randomvec() * 15;
+ self.renderflags = 0;
+ if(self.cnt < time)
+ self.alpha = bound(0, self.nextthink - time, 1);
+
+ if(self.alpha < ALPHA_MIN_VISIBLE)
+ remove(self);
+}
+
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
+{
+ entity sfrag;
+
+ sfrag = spawn();
+ setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3");
+ setorigin(sfrag, _org);
+
+ sfrag.move_movetype = MOVETYPE_BOUNCE;
+ sfrag.gravity = 0.15;
+ sfrag.solid = SOLID_CORPSE;
+
+ sfrag.draw = RaptorCBShellfragDraw;
+
+ sfrag.move_origin = sfrag.origin = _org;
+ sfrag.move_velocity = _vel;
+ sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
+ sfrag.angles = self.move_angles = _ang;
+
+ sfrag.move_time = time;
+ sfrag.damageforcescale = 4;
+
+ sfrag.nextthink = time + 3;
+ sfrag.cnt = time + 2;
+ sfrag.alpha = 1;
+ sfrag.drawmask = MASK_NORMAL;
+}
--- /dev/null
+void RaptorCBShellfragDraw();
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang);
+void Vehicles_Precache();
+
float waypointsprite_distancealphaexponent;
float waypointsprite_timealphaexponent;
float waypointsprite_scale;
+float waypointsprite_fontsize;
float waypointsprite_edgefadealpha;
float waypointsprite_edgefadescale;
float waypointsprite_edgefadedistance;
+float waypointsprite_edgeoffset_bottom;
+float waypointsprite_edgeoffset_left;
+float waypointsprite_edgeoffset_right;
+float waypointsprite_edgeoffset_top;
float waypointsprite_crosshairfadealpha;
float waypointsprite_crosshairfadescale;
float waypointsprite_crosshairfadedistance;
float waypointsprite_distancefadedistance;
float waypointsprite_alpha;
+.float helpme;
.float rule;
.string netname; // primary picture
.string netname2; // secondary picture
.float build_starthealth;
.float build_finished;
-vector SPRITE_SIZE = '288 36 0';
-vector SPRITE_HOTSPOT = '144 36 0';
float SPRITE_HEALTHBAR_WIDTH = 144;
float SPRITE_HEALTHBAR_HEIGHT = 9;
float SPRITE_HEALTHBAR_MARGIN = 6;
float SPRITE_HEALTHBAR_BORDER = 2;
float SPRITE_HEALTHBAR_BORDERALPHA = 1;
float SPRITE_HEALTHBAR_HEALTHALPHA = 0.5;
+float SPRITE_ARROW_SCALE = 1.0;
+float SPRITE_HELPME_BLINK = 2;
void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)
{
drawquad(o + ri * (border + align * ((1 - h) * width)), ri * width * h, up * height, "", hrgb, ha, f);
}
+// returns location of sprite text
+vector drawspritearrow(vector o, float ang, vector rgb, float a, float t)
+{
+ float SQRT2 = 1.414;
+ float BORDER; BORDER = 1.5 * t;
+ float TSIZE; TSIZE = 8 * t;
+ float RLENGTH; RLENGTH = 8 * t;
+ float RWIDTH; RWIDTH = 4 * t;
+ float MLENGTH; MLENGTH = 4 * t;
+
+ R_BeginPolygon("", DRAWFLAG_NORMAL);
+ R_PolygonVertex(o + rotate(eX * -(TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_PolygonVertex(o + rotate(eX * (TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_PolygonVertex(o + rotate(eY * -( BORDER * SQRT2), ang), '0 0 0', '0 0 0', a);
+ R_EndPolygon();
+ R_BeginPolygon("", DRAWFLAG_NORMAL);
+ R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_PolygonVertex(o + rotate(eX * (RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_PolygonVertex(o + rotate(eX * (RWIDTH + BORDER) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+ R_EndPolygon();
+
+ R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+ R_PolygonVertex(o + rotate(eX * -TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+ R_PolygonVertex(o + rotate(eX * TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+ R_PolygonVertex(o + rotate('0 0 0', ang), '0 0 0', rgb, a);
+ R_EndPolygon();
+ R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+ R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * TSIZE, ang), '0 0 0', rgb, a);
+ R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+ R_PolygonVertex(o + rotate(eX * RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+ R_PolygonVertex(o + rotate(eX * RWIDTH + eY * TSIZE, ang), '0 0 0', rgb, a);
+ R_EndPolygon();
+
+ return
+ o + rotate(eY * (TSIZE + RLENGTH + MLENGTH), ang);
+}
+
+// returns location of sprite healthbar
+vector drawspritetext(vector o, float ang, float minwidth, vector rgb, float a, vector fontsize, string s)
+{
+ float algnx, algny;
+ float sw, w, h;
+ float aspect, sa, ca;
+
+ sw = stringwidth(s, FALSE, fontsize);
+ if(sw > minwidth)
+ w = sw;
+ else
+ w = minwidth;
+ h = fontsize_y;
+
+ // how do corners work?
+ aspect = vid_conwidth / vid_conheight;
+ sa = sin(ang);
+ ca = cos(ang) * aspect;
+ if(fabs(sa) > fabs(ca))
+ {
+ algnx = (sa < 0);
+ algny = 0.5 - 0.5 * ca / fabs(sa);
+ }
+ else
+ {
+ algnx = 0.5 - 0.5 * sa / fabs(ca);
+ algny = (ca < 0);
+ }
+
+ // align
+ o_x -= w * algnx;
+ o_y -= h * algny;
+
+ // we want to be onscreen
+ if(o_x < 0)
+ o_x = 0;
+ if(o_y < 0)
+ o_y = 0;
+ if(o_x > vid_conwidth - w)
+ o_x = vid_conwidth - w;
+ if(o_y > vid_conheight - h)
+ o_x = vid_conheight - h;
+
+ o_x += 0.5 * (w - sw);
+
+ drawstring(o, s, fontsize, rgb, a, DRAWFLAG_NORMAL);
+
+ o_x += 0.5 * sw;
+ o_y += 0.5 * h;
+
+ return o;
+}
+
+float spritelookupblinkvalue(string s)
+{
+ switch(s)
+ {
+ case "ons-cp-atck-neut": return 2;
+ case "ons-cp-atck-red": return 2;
+ case "ons-cp-atck-blue": return 2;
+ case "ons-cp-dfnd-red": return 0.5;
+ case "ons-cp-dfnd-blue": return 0.5;
+ case "item-invis": return 2;
+ case "item-extralife": return 2;
+ case "item-speed": return 2;
+ case "item-strength": return 2;
+ case "item-shueld": return 2;
+ case "item-fuelregen": return 2;
+ case "item-jetpack": return 2;
+ case "tagged-target": return 2;
+ default: return 1;
+ }
+}
+vector spritelookupcolor(string s, vector def)
+{
+ switch(s)
+ {
+ case "keycarrier-friend": return '0 1 0';
+ case "wpn-laser": return '1 0.5 0.5';
+ case "wpn-shotgun": return '0.5 0.25 0';
+ case "wpn-uzi": return '1 1 0';
+ case "wpn-gl": return '1 0 0';
+ case "wpn-electro": return '0 0.5 1';
+ case "wpn-crylink": return '1 0.5 1';
+ case "wpn-nex": return '0.5 1 1';
+ case "wpn-hagar": return '1 1 0.5';
+ case "wpn-rl": return '1 1 0';
+ case "wpn-porto": return '0.5 0.5 0.5';
+ case "wpn-minstanex": return '0.5 1 1';
+ case "wpn-hookgun": return '0 0.5 0';
+ case "wpn-fireball": return '1 0.5 0';
+ case "wpn-hlac": return '0 1 0';
+ case "wpn-campingrifle": return '0.5 1 0';
+ case "wpn-minelayer": return '0.75 1 0';
+ default: return def;
+ }
+}
+string spritelookuptext(string s)
+{
+ switch(s)
+ {
+ case "as-push": return _("Push");
+ case "as-destroy": return _("Destroy");
+ case "as-defend": return _("Defend");
+ case "bluebase": return _("Blue base");
+ case "danger": return _("DANGER");
+ case "flagcarrier": return _("Flag carrier");
+ case "flagdropped": return _("Dropped flag");
+ case "helpme": return _("Help me!");
+ case "here": return _("Here");
+ case "key-dropped": return _("Dropped key");
+ case "keycarrier-blue": return _("Key carrier");
+ case "keycarrier-finish": return _("Run here");
+ case "keycarrier-friend": return _("Key carrier");
+ case "keycarrier-pink": return _("Key carrier");
+ case "keycarrier-red": return _("Key carrier");
+ case "keycarrier-yellow": return _("Key carrier");
+ case "redbase": return _("Red base");
+ case "waypoint": return _("Waypoint");
+ case "ons-gen-red": return _("Generator");
+ case "ons-gen-blue": return _("Generator");
+ case "ons-gen-shielded": return _("Generator");
+ case "ons-cp-neut": return _("Control point");
+ case "ons-cp-red": return _("Control point");
+ case "ons-cp-blue": return _("Control point");
+ case "ons-cp-atck-neut": return _("Control point");
+ case "ons-cp-atck-red": return _("Control point");
+ case "ons-cp-atck-blue": return _("Control point");
+ case "ons-cp-dfnd-red": return _("Control point");
+ case "ons-cp-dfnd-blue": return _("Control point");
+ case "race-checkpoint": return _("Checkpoint");
+ case "race-finish": return _("Finish");
+ case "race-start": return _("Start");
+ case "race-start-finish": return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start");
+ case "nb-ball": return _("Ball");
+ case "ka-ball": return _("Ball");
+ case "ka-ballcarrier": return _("Ball carrier");
+ case "wpn-laser": return _("Laser");
+ case "wpn-shotgun": return _("Shotgun");
+ case "wpn-uzi": return _("Machine Gun");
+ case "wpn-gl": return _("Mortar");
+ case "wpn-electro": return _("Electro");
+ case "wpn-crylink": return _("Crylink");
+ case "wpn-nex": return _("Nex");
+ case "wpn-hagar": return _("Hagar");
+ case "wpn-rl": return _("Rocket Launcher");
+ case "wpn-porto": return _("Port-O-Launch");
+ case "wpn-minstanex": return _("Minstanex");
+ case "wpn-hookgun": return _("Hook");
+ case "wpn-fireball": return _("Fireball");
+ case "wpn-hlac": return _("HLAC");
+ case "wpn-campingrifle": return _("Rifle");
+ case "wpn-minelayer": return _("Mine Layer");
+ case "dom-neut": return _("Control point");
+ case "dom-red": return _("Control point");
+ case "dom-blue": return _("Control point");
+ case "dom-yellow": return _("Control point");
+ case "dom-pink": return _("Control point");
+ case "item-invis": return _("Invisibility");
+ case "item-extralife": return _("Extra life");
+ case "item-speed": return _("Speed");
+ case "item-strength": return _("Strength");
+ case "item-shield": return _("Shield");
+ case "item-fuelregen": return _("Fuel regen");
+ case "item-jetpack": return _("Jet Pack");
+ case "freezetag_frozen": return _("Frozen!");
+ case "tagged-target": return _("Tagged");
+ case "vehicle": return _("Vehicle");
+ default: return s;
+ }
+}
+
+vector fixrgbexcess_move(vector rgb, vector src, vector dst)
+{
+ vector yvec = '0.299 0.587 0.114';
+ return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
+}
+vector fixrgbexcess(vector rgb)
+{
+ if(rgb_x > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
+ if(rgb_y > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
+ if(rgb_z > 1)
+ rgb_z = 1;
+ }
+ else if(rgb_z > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
+ if(rgb_y > 1)
+ rgb_y = 1;
+ }
+ }
+ else if(rgb_y > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
+ if(rgb_x > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
+ if(rgb_z > 1)
+ rgb_z = 1;
+ }
+ else if(rgb_z > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
+ if(rgb_x > 1)
+ rgb_x = 1;
+ }
+ }
+ else if(rgb_z > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
+ if(rgb_x > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
+ if(rgb_y > 1)
+ rgb_y = 1;
+ }
+ else if(rgb_y > 1)
+ {
+ rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
+ if(rgb_x > 1)
+ rgb_x = 1;
+ }
+ }
+ return rgb;
+}
+
+float waypointsprite_count, waypointsprite_newcount;
void Draw_WaypointSprite()
{
string spriteimage;
if(spriteimage == "")
return;
+
+ ++waypointsprite_newcount;
float dist;
dist = vlen(self.origin - view_origin);
else if(self.maxdistance > 0)
a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
+ vector rgb;
+ rgb = self.teamradar_color;
+ rgb = spritelookupcolor(spriteimage, rgb);
+ if(rgb == '0 0 0')
+ {
+ self.teamradar_color = '1 0 1';
+ print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage));
+ }
+
+ if(time - floor(time) > 0.5)
+ {
+ if(self.helpme && time < self.helpme)
+ a *= SPRITE_HELPME_BLINK;
+ else
+ a *= spritelookupblinkvalue(spriteimage);
+ }
+
+ if(a > 1)
+ {
+ rgb *= a;
+ a = 1;
+ }
+
if(a <= 0)
return;
-
- // draw the sprite image
+
+ rgb = fixrgbexcess(rgb);
+
vector o;
- float rot;
- o = project_3d_to_2d(self.origin);
- rot = 0;
+ float ang;
- if(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+ o = project_3d_to_2d(self.origin);
+ if(o_z < 0
+ || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
+ || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
+ || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
+ || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
{
// scale it to be just in view
vector d;
float f1, f2;
- // get the waypoint angle vector
- /*
- d_x = view_right * (self.origin - view_origin) * vid_conwidth / vid_width;
- d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight);
- d_z = 0;
- */
-
d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
-
- /*
- if(autocvar_v_flipped)
- d_x = -d_x;
- */
+ ang = atan2(-d_x, -d_y);
+ if(o_z < 0)
+ ang += M_PI;
f1 = d_x / vid_conwidth;
f2 = d_y / vid_conheight;
if(d_z * f1 > 0)
{
// RIGHT edge
- d = d * (0.5 / f1);
- rot = 3;
+ d = d * ((0.5 - waypointsprite_edgeoffset_right) / f1);
}
else
{
// LEFT edge
- d = d * (-0.5 / f1);
- rot = 1;
+ d = d * (-(0.5 - waypointsprite_edgeoffset_left) / f1);
}
}
else
if(d_z * f2 > 0)
{
// BOTTOM edge
- d = d * (0.5 / f2);
- rot = 0;
+ d = d * ((0.5 - waypointsprite_edgeoffset_bottom) / f2);
}
else
{
// TOP edge
- d = d * (-0.5 / f2);
- rot = 2;
+ d = d * (-(0.5 - waypointsprite_edgeoffset_top) / f2);
}
}
o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
}
+ else
+ {
+#if 1
+ ang = M_PI;
+#else
+ vector d;
+ d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
+ ang = atan2(-d_x, -d_y);
+#endif
+ }
o_z = 0;
+ float edgedistance_min, crosshairdistance;
+ edgedistance_min = min4((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
+ (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
+ (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
+ (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
+
float vidscale;
vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
- t = stof(db_get(tempdb, strcat("/spriteframes/", spriteimage)));
- if(t == 0)
- spriteimage = strcat("models/sprites/", spriteimage);
- else
- spriteimage = strcat("models/sprites/", spriteimage, "_frame", ftos(mod(floor((max(0, time - self.spawntime)) * 2), t)));
-
- float edgedistance_min, crosshairdistance;
- edgedistance_min = min4(o_y, o_x,vid_conwidth - o_x, vid_conheight - o_y);
-
crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
t = waypointsprite_scale * vidscale;
a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
}
- drawrotpic(o, rot * 90 * DEG2RAD, spriteimage, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, '1 1 1', a, DRAWFLAG_MIPMAP);
if(self.build_finished)
{
self.health = -1;
}
+ o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
+
+ string txt;
+ if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
+ txt = _("Spam");
+ else
+ txt = spritelookuptext(spriteimage);
+ if(self.helpme && time < self.helpme)
+ txt = sprintf(_("%s needing help!"), txt);
+ if(autocvar_g_waypointsprite_uppercase)
+ txt = strtoupper(txt);
+
if(self.health >= 0)
{
- float align;
+ o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
+
+ float align, marg;
if(self.build_finished)
align = 0.5;
else
align = 0;
- drawhealthbar(o, rot * 90 * DEG2RAD, self.health, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, SPRITE_HEALTHBAR_WIDTH * t, SPRITE_HEALTHBAR_HEIGHT * t, SPRITE_HEALTHBAR_MARGIN * t, SPRITE_HEALTHBAR_BORDER * t, align, self.teamradar_color, a * SPRITE_HEALTHBAR_BORDERALPHA, self.teamradar_color, a * SPRITE_HEALTHBAR_HEALTHALPHA, DRAWFLAG_NORMAL);
+ if(cos(ang) > 0)
+ marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
+ else
+ marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
+ drawhealthbar(
+ o,
+ 0,
+ self.health,
+ '0 0 0',
+ '0 0 0',
+ SPRITE_HEALTHBAR_WIDTH * t,
+ SPRITE_HEALTHBAR_HEIGHT * t,
+ marg,
+ SPRITE_HEALTHBAR_BORDER * t,
+ align,
+ rgb,
+ a * SPRITE_HEALTHBAR_BORDERALPHA,
+ rgb,
+ a * SPRITE_HEALTHBAR_HEALTHALPHA,
+ DRAWFLAG_NORMAL
+ );
+ }
+ else
+ {
+ o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
}
}
self.teamradar_color_x = ReadByte() / 255.0;
self.teamradar_color_y = ReadByte() / 255.0;
self.teamradar_color_z = ReadByte() / 255.0;
+ self.helpme = ReadByte() * 0.1;
+ if(self.helpme > 0)
+ self.helpme += servertime;
}
InterpolateOrigin_Note();
waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
waypointsprite_scale = autocvar_g_waypointsprite_scale;
+ waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
+ waypointsprite_edgeoffset_bottom = autocvar_g_waypointsprite_edgeoffset_bottom;
+ waypointsprite_edgeoffset_left = autocvar_g_waypointsprite_edgeoffset_left;
+ waypointsprite_edgeoffset_right = autocvar_g_waypointsprite_edgeoffset_right;
+ waypointsprite_edgeoffset_top = autocvar_g_waypointsprite_edgeoffset_top;
waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
WaypointSprite_Load_Frames(".jpg");
waypointsprite_initialized = true;
}
+
+ waypointsprite_count = waypointsprite_newcount;
+ waypointsprite_newcount = 0;
}
campaign_entries = 0;
campaign_title = string_null;
- fn = strcat("maps/campaign", campaign_name, ".txt");
+ fn = language_filename(strcat("maps/campaign", campaign_name, ".txt"));
fh = fopen(fn, FILE_READ);
if(fh >= 0)
{
const float TE_CSQC_LIGHTNINGARC = 105;
const float TE_CSQC_TEAMNAGGER = 106;
const float TE_CSQC_PINGPLREPORT = 107;
-const float TE_CSQC_VOTE = 108;
-const float TE_CSQC_VOTERESET = 109;
const float TE_CSQC_ANNOUNCE = 110;
const float TE_CSQC_TARGET_MUSIC = 111;
-const float TE_CSQC_NOTIFY = 112;
-const float TE_CSQC_WEAPONCOMPLAIN = 113;
+const float TE_CSQC_KILLNOTIFY = 112;
+const float TE_CSQC_KILLCENTERPRINT = 113;
+const float TE_CSQC_CENTERPRINT_GENERIC = 114;
+const float TE_CSQC_WEAPONCOMPLAIN = 115;
const float TE_CSQC_NEX_SCOPE = 116;
const float TE_CSQC_MINELAYER_MAXMINES = 117;
const float TE_CSQC_HAGAR_MAXROCKETS = 118;
+const float TE_CSQC_VEHICLESETUP = 119;
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_SERVER_STATUS = 12;
const float RANKINGS_CNT = 15;
-const float CSQC_KILLNOTIFY = 0;
-const float CSQC_CENTERPRINT = 1;
-
const float ENT_CLIENT = 0;
const float ENT_CLIENT_DEAD = 1;
const float ENT_CLIENT_ENTCS = 2;
const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
const float ENT_CLIENT_TURRET = 40;
+const float ENT_CLIENT_AUXILIARYXHAIR = 50;
+const float ENT_CLIENT_VEHICLE = 60;
const float SPRITERULE_DEFAULT = 0;
const float SPRITERULE_TEAMPLAY = 1;
+const float RADARICON_NONE = 0;
const float RADARICON_FLAG = 1;
const float RADARICON_FLAGCARRIER = 1;
const float RADARICON_HERE = 1; // TODO make these 3 and 4, and make images for them
const float RADARICON_OBJECTIVE = 1;
const float RADARICON_DOMPOINT = 1;
const float RADARICON_POWERUP = 1;
+const float RADARICON_TAGGED = 1;
///////////////////////////
// key constants
const float STAT_TYPEHIT_TIME = 55;
const float STAT_LAYED_MINES = 56;
const float STAT_HAGAR_LOAD = 57;
+const float STAT_SWITCHINGWEAPON = 58;
// see DP source, quakedef.h
const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
const float CTF_STATE_COMMANDER = 3;
const float HUD_NORMAL = 0;
-const float HUD_SPIDERBOT = 10;
-const float HUD_WAKIZASHI = 11;
-const float HUD_RAPTOR = 12;
+const float HUD_VEHICLE_FIRST = 10;
+const float HUD_SPIDERBOT = 10;
+const float HUD_WAKIZASHI = 11;
+const float HUD_RAPTOR = 12;
+const float HUD_BUMBLEBEE = 13;
+const float HUD_VEHICLE_LAST = 13;
+
const vector eX = '1 0 0';
const vector eY = '0 1 0';
const vector eZ = '0 0 1';
const float STAT_FROZEN = 104;
const float STAT_REVIVE_PROGRESS = 105;
+
const float STAT_DOM_TOTAL_PPS = 100;
const float STAT_DOM_PPS_RED = 101;
const float STAT_DOM_PPS_BLUE = 102;
//const float STAT_SPIDERBOT_AIM 53 // compressShotOrigin
//const float STAT_SPIDERBOT_TARGET 54 // compressShotOrigin
-
-
-
// moved that here so the client knows the max.
// # of maps, I'll use arrays for them :P
#define MAPVOTE_COUNT 10
#define SP_SCORE 3
// game mode specific indices are not in common/, but in server/scores_rules.qc!
-// this assignment must match menu/xonotic/dialog_settings_misc.c!
-float CHAN_AUTO = 0;
- // on world: announcers, ... INFO
- // on players: item pickup ITEMS
- // on entities: UNUSED
- // on csqc: announcers INFO
-float CHAN_WEAPON = 1; // Weapon fire
- // on world: UNUSED
- // on players: weapon firing WEAPONS
- // on entities: turret firing WEAPONS
- // on csqc: UNUSED
-float CHAN_VOICE = 2; // Voice/Radio
- // on world: UNUSED
- // on players: voice VOICE
- // on entities: ambient AMBIENT
- // on csqc: background music BGM
-float CHAN_TRIGGER = 3; // Triggers/Items
- // on world: UNUSED
- // on players: item pickup ITEMS
- // on entities: platforms moving etc. ITEMS
- // on csqc: platforms moving etc. ITEMS
-float CHAN_PROJECTILE = 4; // Projectiles
- // on world: UNUSED
- // on players: projectiles hitting player SHOTS
- // on entities: projectiles SHOTS
- // on csqc: projectile sounds SHOTS
-float CHAN_WEAPON2 = 5; // Nex fire (separated as it is a very long sound)
- // on world: UNUSED
- // on players: weapon firing WEAPONS
- // on entities: turret firing WEAPONS
- // on csqc: UNUSED
-float CHAN_PAIN = 6; // Pain
- // on world: UNUSED
- // on players: pain PAIN
- // on entities: projectiles flying SHOTS
- // on csqc: player pain PAIN
-float CHAN_PLAYER = 7; // Player body
- // on world: UNUSED
- // on players: player sounds PLAYER
- // on entities: player sounds PLAYER
- // on csqc: UNUSED
+#ifdef COMPAT_XON010_CHANNELS
+float CH_INFO = 0; // only on world and csqc
+float CH_TRIGGER = 0; // only on players; compat: FALSELY CONTROLLED BY "Info"
+float CH_WEAPON_A = 1; // only on players and entities
+float CH_WEAPON_SINGLE = 5; // only on players and entities
+float CH_VOICE = 2; // only on players
+float CH_BGM_SINGLE = 2; // only on csqc; compat: FALSELY CONTROLLED BY "Voice"
+float CH_AMBIENT = 2; // only on csqc; compat: FALSELY CONTROLLED BY "Voice"
+float CH_TRIGGER_SINGLE = 3; // only on players, entities, csqc
+float CH_SHOTS = 4; // only on players, entities, csqc
+float CH_SHOTS_SINGLE = 4; // only on players, entities, csqc
+float CH_WEAPON_B = 5; // only on players and entities
+float CH_PAIN = 6; // only on players and csqc
+float CH_PAIN_SINGLE = 6; // only on players and csqc
+float CH_PLAYER = 7; // only on players and entities
+float CH_TUBA = 5; // only on csqc
+#else
+float CH_INFO = 0;
+float CH_TRIGGER = -3;
+float CH_WEAPON_A = -1;
+float CH_WEAPON_SINGLE = 1;
+float CH_VOICE = -2;
+float CH_BGM_SINGLE = 8;
+float CH_AMBIENT = -9;
+float CH_TRIGGER_SINGLE = 3;
+float CH_SHOTS = -4;
+float CH_SHOTS_SINGLE = 4;
+float CH_WEAPON_B = -1;
+float CH_PAIN = -6;
+float CH_PAIN_SINGLE = 6;
+float CH_PLAYER = -7;
+float CH_TUBA = 5;
+#endif
float ATTN_NONE = 0;
float ATTN_MIN = 0.015625;
float PROJECTILE_FIREMINE = 22;
float PROJECTILE_BULLET_GLOWING_TRACER = 23;
+float PROJECTILE_RAPTORCANNON = 24;
+float PROJECTILE_RAPTORBOMB = 25;
+float PROJECTILE_RAPTORBOMBLET = 26;
+float PROJECTILE_SPIDERROCKET = 27;
+float PROJECTILE_WAKIROCKET = 28;
+float PROJECTILE_WAKICANNON = 29;
+
float SPECIES_HUMAN = 0;
float SPECIES_ROBOT_SOLID = 1;
float SPECIES_ALIEN = 2;
float DEATH_TOUCHEXPLODE = 10015;
float DEATH_CHEAT = 10016;
float DEATH_FIRE = 10017;
-float DEATH_TURRET = 10020;
float DEATH_QUIET = 10021;
float DEATH_HEADSHOT = 10022;
-float DEATH_SBMINIGUN = 10030;
-float DEATH_SBROCKET = 10031;
-float DEATH_SBCRUSH = 10032;
-float DEATH_SBBLOWUP = 10033;
-
-float DEATH_WAKIGUN = 10040;
-float DEATH_WAKIROCKET = 10041;
-float DEATH_WAKIBLOWUP = 10042;
+float DEATH_VHFIRST = 10030;
+float DEATH_VHCRUSH = 10030;
+float DEATH_SBMINIGUN = 10031;
+float DEATH_SBROCKET = 10032;
+float DEATH_SBBLOWUP = 10033;
+float DEATH_WAKIGUN = 10034;
+float DEATH_WAKIROCKET = 10035;
+float DEATH_WAKIBLOWUP = 10036;
+float DEATH_RAPTOR_CANNON = 10037;
+float DEATH_RAPTOR_BOMB = 10038;
+float DEATH_RAPTOR_BOMB_SPLIT = 10039;
+float DEATH_RAPTOR_DEATH = 10040;
+float DEATH_VHLAST = 10040;
+#define DEATH_ISVEHICLE(t) ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
float DEATH_GENERIC = 10050;
float DEATH_CUSTOM = 10300;
+float DEATH_TURRET = 10500;
+float DEATH_TURRET_EWHEEL = 10501;
+float DEATH_TURRET_FLAC = 10502;
+float DEATH_TURRET_MACHINEGUN = 10503;
+float DEATH_TURRET_WALKER_GUN = 10504;
+float DEATH_TURRET_WALKER_MEELE = 10505;
+float DEATH_TURRET_WALKER_ROCKET = 10506;
+float DEATH_TURRET_HELLION = 10507;
+float DEATH_TURRET_HK = 10508;
+float DEATH_TURRET_MLRS = 10509;
+float DEATH_TURRET_PLASMA = 10510;
+float DEATH_TURRET_PHASER = 10511;
+float DEATH_TURRET_TESLA = 10512;
+float DEATH_TURRET_LAST = 10512;
float DEATH_WEAPONMASK = 0xFF;
float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
float HITTYPE_RESERVED = 0x1000; // unused yet
// macros to access these
+#define DEATH_ISTURRET(t) ((t) >= DEATH_TURRET && (t) <= DEATH_TURRET_LAST)
#define DEATH_ISSPECIAL(t) ((t) >= DEATH_SPECIAL_START)
#define DEATH_WEAPONOFWEAPONDEATH(t) ((t) & DEATH_WEAPONMASK)
#define DEATH_ISWEAPON(t,w) (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
#define FRAGS_PLAYER_NONSOLID -616
// we can use this frags value for both
-//misc. stuff
-#define NEWLINES "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
-
// water levels
float WATERLEVEL_NONE = 0;
float WATERLEVEL_WETFEET = 1;
float MAX_SHOT_DISTANCE = 32768;
+//centerprint ID list
+float CPID_TEAMCHANGE = 1;
+float CPID_CTF_CAPTURESHIELD = 2;
+float CPID_MINSTA_FINDAMMO = 3;
+float CPID_NIX_WPNCHANGE = 4;
+float CPID_DISCONNECT_IDLING = 5;
+float CPID_ROUND_STARTING = 6;
+float CPID_GAME_STARTING = 7;
+float CPID_TIMEOUT_COUNTDOWN = 8;
+float CPID_MOTD = 9;
+float CPID_KH_MSG = 10;
+float CPID_PREVENT_JOIN = 11;
+
// CSQC centerprint/notify message types
float MSG_SUICIDE = 0;
float MSG_KILL = 1;
float WR_IMPACTEFFECT = 11; // (CSQC) impact effect
float WR_SWITCHABLE = 12; // (CSQC) impact effect
float WR_PLAYERDEATH = 13; // (SVQC) does not need to do anything
+float WR_GONETHINK = 14; // (SVQC) logic to run every frame, also if no longer having the weapon as long as the switch away has not been performed
float HUD_PANEL_WEAPONS = 0;
float HUD_PANEL_AMMO = 1;
float HUD_PANEL_ENGINEINFO = 13;
float HUD_PANEL_INFOMESSAGES = 14;
float HUD_PANEL_PHYSICS = 15;
-float HUD_PANEL_NUM = 16; // always last panel id + 1, please increment when adding a new panel
+float HUD_PANEL_CENTERPRINT = 16;
+float HUD_PANEL_NUM = 17; // always last panel id + 1, please increment when adding a new panel
string HUD_PANELNAME_WEAPONS = "weapons";
string HUD_PANELNAME_AMMO = "ammo";
string HUD_PANELNAME_ENGINEINFO = "engineinfo";
string HUD_PANELNAME_INFOMESSAGES = "infomessages";
string HUD_PANELNAME_PHYSICS = "physics";
+string HUD_PANELNAME_CENTERPRINT = "centerprint";
float HUD_MENU_ENABLE = 0;
// now store all the stuff
bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, i, MapInfo_Map_bspname);
bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_title);
+ bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_titlestring);
bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_description);
bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_author);
bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, ftos(MapInfo_Map_supportedGametypes));
// now retrieve all the stuff
MapInfo_Map_bspname = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, i);
MapInfo_Map_title = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
+ MapInfo_Map_titlestring = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
MapInfo_Map_description = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
MapInfo_Map_author = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
MapInfo_Map_supportedGametypes = stof(bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i));
void _MapInfo_Map_Reset()
{
MapInfo_Map_title = "<TITLE>";
+ MapInfo_Map_titlestring = "<TITLE>";
MapInfo_Map_description = "<DESCRIPTION>";
MapInfo_Map_author = "<AUTHOR>";
MapInfo_Map_supportedGametypes = 0;
}
}
+float MapInfo_isRedundant(string fn, string t)
+{
+ // normalize file name
+ fn = strreplace("_", "-", fn);
+
+ // normalize visible title
+ t = strreplace(": ", "-", t);
+ t = strreplace(":", "-", t);
+ t = strreplace(" ", "-", t);
+ t = strreplace("_", "-", t);
+ t = strreplace("'", "-", t);
+
+ if(!strcasecmp(fn, t))
+ return TRUE;
+
+ // we allow the visible title to have punctuation the file name does
+ // not, but not vice versa
+ t = strreplace("-", "", t);
+
+ if(!strcasecmp(fn, t))
+ return TRUE;
+
+ return FALSE;
+}
+
// load info about a map by name into the MapInfo_Map_* globals
float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametypeToSet)
{
string fn;
string s, t;
- float fh, fh2;
+ float fh;
float r, f, n, i, p;
string acl;
}
}
+ if(MapInfo_Map_title == "<TITLE>")
+ MapInfo_Map_titlestring = MapInfo_Map_bspname;
+ else if(MapInfo_isRedundant(MapInfo_Map_bspname, MapInfo_Map_title))
+ MapInfo_Map_titlestring = MapInfo_Map_title;
+ else
+ MapInfo_Map_titlestring = sprintf(_("%s: %s"), MapInfo_Map_bspname, MapInfo_Map_title);
+
MapInfo_Cache_Store();
if(MapInfo_Map_supportedGametypes != 0)
return r;
return substring(out, 1, strlen(out) - 1);
}
+string MapInfo_ListAllAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
+{
+ string out;
+ float i;
+
+ // to make absolutely sure:
+ MapInfo_Enumerate();
+ MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, pRequiredFlags, pForbiddenFlags, 0);
+
+ out = "";
+ for(i = 0; i < MapInfo_count; ++i)
+ out = strcat(out, " ", _MapInfo_GlobItem(MapInfo_FilterList_Lookup(i)));
+
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), pRequiredFlags, pForbiddenFlags, 0);
+
+ return substring(out, 1, strlen(out) - 1);
+}
+
void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
{
float t, t0;
{
MapInfo_Map_bspname = string_null;
MapInfo_Map_title = string_null;
+ MapInfo_Map_titlestring = string_null;
MapInfo_Map_description = string_null;
MapInfo_Map_author = string_null;
MapInfo_Map_clientstuff = string_null;
// info about a map that MapInfo loads
string MapInfo_Map_bspname;
string MapInfo_Map_title;
+string MapInfo_Map_titlestring; // either bspname: title or just title, depending on whether bspname is redundant
string MapInfo_Map_description;
string MapInfo_Map_author;
string MapInfo_Map_clientstuff; // not in cache, only for map load
// list all maps for the current game type
string MapInfo_ListAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
+// list all allowed maps (for any game type)
+string MapInfo_ListAllAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
// gets a gametype from a string
float MapInfo_Type_FromString(string t);
--- /dev/null
+// files (-1 for URL)
+.float url_fh;
+
+// URLs
+.string url_url;
+.float url_wbuf;
+.float url_wbufpos;
+.float url_rbuf;
+.float url_rbufpos;
+.float url_id;
+.url_ready_func url_ready;
+.entity url_ready_pass;
+
+entity url_fromid[NUM_URL_ID];
+float autocvar__urllib_nextslot;
+
+float url_URI_Get_Callback(float id, float status, string data)
+{
+ if(id < MIN_URL_ID)
+ return 0;
+ id -= MIN_URL_ID;
+ if(id >= NUM_URL_ID)
+ return 0;
+ entity e;
+ e = url_fromid[id];
+ if(!e)
+ return 0;
+ if(e.url_rbuf >= 0 || e.url_wbuf >= 0)
+ {
+ print(sprintf("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url));
+ return 0;
+ }
+
+ // whatever happens, we will remove the URL from the list of IDs
+ url_fromid[id] = world;
+
+ // if we get here, we MUST have both buffers cleared
+ if(e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != -1)
+ error("url_URI_Get_Callback: not a request waiting for data");
+
+ if(status == 0)
+ {
+ // WE GOT DATA!
+ float n, i;
+ n = tokenizebyseparator(data, "\n");
+ e.url_rbuf = buf_create();
+ if(e.url_rbuf < 0)
+ {
+ print("url_URI_Get_Callback: out of memory in buf_create\n");
+ e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
+ strunzone(e.url_url);
+ remove(e);
+ return 1;
+ }
+ e.url_rbufpos = 0;
+ if(e.url_rbuf < 0)
+ {
+ print("url_URI_Get_Callback: out of memory in buf_create\n");
+ e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
+ strunzone(e.url_url);
+ remove(e);
+ return 1;
+ }
+ for(i = 0; i < n; ++i)
+ bufstr_set(e.url_rbuf, i, argv(i));
+ e.url_ready(e, e.url_ready_pass, URL_READY_CANREAD);
+ return 1;
+ }
+ else
+ {
+ // an ERROR
+ e.url_ready(e, e.url_ready_pass, -fabs(status));
+ strunzone(e.url_url);
+ remove(e);
+ return 1;
+ }
+}
+
+void url_fopen(string url, float mode, url_ready_func rdy, entity pass)
+{
+ entity e;
+ float i;
+ if(strstrofs(url, "://", 0) >= 0)
+ {
+ switch(mode)
+ {
+ case FILE_WRITE:
+ case FILE_APPEND:
+ // collect data to a stringbuffer for a POST request
+ // attempts to close will result in a reading handle
+
+ // create a writing end that does nothing yet
+ e = spawn();
+ e.classname = "url_fopen_file";
+ e.url_url = strzone(url);
+ e.url_fh = -1;
+ e.url_wbuf = buf_create();
+ if(e.url_wbuf < 0)
+ {
+ print("url_fopen: out of memory in buf_create\n");
+ rdy(e, pass, URL_READY_ERROR);
+ strunzone(e.url_url);
+ remove(e);
+ return;
+ }
+ e.url_wbufpos = 0;
+ e.url_rbuf = -1;
+ rdy(e, pass, URL_READY_CANWRITE);
+ break;
+
+ case FILE_READ:
+ // read data only
+
+ // get slot for HTTP request
+ for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i)
+ if(url_fromid[i] == world)
+ break;
+ if(i >= NUM_URL_ID)
+ {
+ for(i = 0; i < autocvar__urllib_nextslot; ++i)
+ if(url_fromid[i] == world)
+ break;
+ if(i >= autocvar__urllib_nextslot)
+ {
+ print("url_fopen: too many concurrent requests\n");
+ rdy(world, pass, URL_READY_ERROR);
+ return;
+ }
+ }
+
+ // GET the data
+ if(!crypto_uri_postbuf(url, i + MIN_URL_ID, string_null, string_null, -1, 0))
+ {
+ print("url_fopen: failure in crypto_uri_postbuf\n");
+ rdy(world, pass, URL_READY_ERROR);
+ return;
+ }
+
+ // Make a dummy handle object (no buffers at
+ // all). Wait for data to come from the
+ // server, then call the callback
+ e = spawn();
+ e.classname = "url_fopen_file";
+ e.url_url = strzone(url);
+ e.url_fh = -1;
+ e.url_rbuf = -1;
+ e.url_wbuf = -1;
+ e.url_ready = rdy;
+ e.url_ready_pass = pass;
+ e.url_id = i;
+ url_fromid[i] = e;
+
+ // make sure this slot won't be reused quickly even on map change
+ cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID)));
+ break;
+ }
+ }
+ else
+ {
+ float fh;
+ fh = fopen(url, mode);
+ if(fh < 0)
+ {
+ rdy(world, pass, URL_READY_ERROR);
+ return;
+ }
+ else
+ {
+ e = spawn();
+ e.classname = "url_fopen_file";
+ e.url_fh = fh;
+ if(mode == FILE_READ)
+ rdy(e, pass, URL_READY_CANREAD);
+ else
+ rdy(e, pass, URL_READY_CANWRITE);
+ }
+ }
+}
+
+// close a file
+void url_fclose(entity e, url_ready_func rdy, entity pass)
+{
+ float i;
+
+ if(e.url_fh < 0)
+ {
+ if(e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request)
+ if(e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request)
+ error("url_fclose: not closable in current state");
+
+ // closing an URL!
+ if(e.url_wbuf >= 0)
+ {
+ // we are closing the write end (HTTP POST request)
+
+ // get slot for HTTP request
+ for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i)
+ if(url_fromid[i] == world)
+ break;
+ if(i >= NUM_URL_ID)
+ {
+ for(i = 0; i < autocvar__urllib_nextslot; ++i)
+ if(url_fromid[i] == world)
+ break;
+ if(i >= autocvar__urllib_nextslot)
+ {
+ print("url_fclose: too many concurrent requests\n");
+ rdy(e, pass, URL_READY_ERROR);
+ buf_del(e.url_wbuf);
+ strunzone(e.url_url);
+ remove(e);
+ return;
+ }
+ }
+
+ // POST the data
+ if(!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, "text/plain", "", e.url_wbuf, 0))
+ {
+ print("url_fclose: failure in crypto_uri_postbuf\n");
+ rdy(e, pass, URL_READY_ERROR);
+ buf_del(e.url_wbuf);
+ strunzone(e.url_url);
+ remove(e);
+ return;
+ }
+
+ // delete write end. File handle is now in unusable
+ // state. Wait for data to come from the server, then
+ // call the callback
+ buf_del(e.url_wbuf);
+ e.url_wbuf = -1;
+ e.url_ready = rdy;
+ e.url_ready_pass = pass;
+ e.url_id = i;
+ url_fromid[i] = e;
+
+ // make sure this slot won't be reused quickly even on map change
+ cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID)));
+ }
+ else
+ {
+ // we have READ all data, just close
+ rdy(e, pass, URL_READY_CLOSED);
+ buf_del(e.url_rbuf);
+ strunzone(e.url_url);
+ remove(e);
+ }
+ }
+ else
+ {
+ // file
+ fclose(e.url_fh);
+ rdy(e, pass, URL_READY_CLOSED); // closing creates no reading handle
+ remove(e);
+ }
+}
+
+// with \n (blame FRIK_FILE)
+string url_fgets(entity e)
+{
+ if(e.url_fh < 0)
+ {
+ if(e.url_rbuf == -1)
+ error("url_fgets: not readable in current state");
+ // curl
+ string s;
+ s = bufstr_get(e.url_rbuf, e.url_rbufpos);
+ e.url_rbufpos += 1;
+ return s;
+ }
+ else
+ {
+ // file
+ return fgets(e.url_fh);
+ }
+}
+
+// without \n (blame FRIK_FILE)
+void url_fputs(entity e, string s)
+{
+ if(e.url_fh < 0)
+ {
+ if(e.url_wbuf == -1)
+ error("url_fputs: not writable in current state");
+ // curl
+ bufstr_set(e.url_wbuf, e.url_wbufpos, s);
+ e.url_wbufpos += 1;
+ }
+ else
+ {
+ // file
+ fputs(e.url_fh, s);
+ }
+}
--- /dev/null
+float URL_READY_ERROR = -1;
+float URL_READY_CLOSED = 0;
+float URL_READY_CANWRITE = 1;
+float URL_READY_CANREAD = 2;
+// errors: -1, or negative HTTP status code
+typedef void(entity handle, entity pass, float status) url_ready_func;
+
+void url_fopen(string url, float mode, url_ready_func rdy, entity pass);
+void url_fclose(entity e, url_ready_func rdy, entity pass);
+string url_fgets(entity e);
+void url_fputs(entity e, string s);
+
+// returns true if handled
+float url_URI_Get_Callback(float id, float status, string data);
+#define MIN_URL_ID 128
+#define NUM_URL_ID 64
#pragma flag enable subscope
#pragma flag enable lo
+
+#ifndef NOCOMPAT
+//# define WORKAROUND_XON010
+//# define COMPAT_XON010_CHANNELS
+#endif
return s;
return substring(s, p+1, -1);
}
+
+// x-encoding (encoding as zero length invisible string)
+const string XENCODE_2 = "xX";
+const string XENCODE_22 = "0123456789abcdefABCDEF";
+string xencode(float f)
+{
+ float a, b, c, d;
+ d = mod(f, 22); f = floor(f / 22);
+ c = mod(f, 22); f = floor(f / 22);
+ b = mod(f, 22); f = floor(f / 22);
+ a = mod(f, 2); // f = floor(f / 2);
+ return strcat(
+ "^",
+ substring(XENCODE_2, a, 1),
+ substring(XENCODE_22, b, 1),
+ substring(XENCODE_22, c, 1),
+ substring(XENCODE_22, d, 1)
+ );
+}
+float xdecode(string s)
+{
+ float a, b, c, d;
+ if(substring(s, 0, 1) != "^")
+ return -1;
+ if(strlen(s) < 5)
+ return -1;
+ a = strstrofs(XENCODE_2, substring(s, 1, 1), 0);
+ b = strstrofs(XENCODE_22, substring(s, 2, 1), 0);
+ c = strstrofs(XENCODE_22, substring(s, 3, 1), 0);
+ d = strstrofs(XENCODE_22, substring(s, 4, 1), 0);
+ if(a < 0 || b < 0 || c < 0 || d < 0)
+ return -1;
+ return ((a * 22 + b) * 22 + c) * 22 + d;
+}
case HUD_PANEL_ENGINEINFO: panel_name = HUD_PANELNAME_ENGINEINFO; break; \
case HUD_PANEL_INFOMESSAGES: panel_name = HUD_PANELNAME_INFOMESSAGES; break; \
case HUD_PANEL_PHYSICS: panel_name = HUD_PANELNAME_PHYSICS; break; \
+ case HUD_PANEL_CENTERPRINT: panel_name = HUD_PANELNAME_CENTERPRINT; break; \
} ENDS_WITH_CURLY_BRACE
// Get name of specified panel id
string language_filename(string s);
string CTX(string s);
#define ZCTX(s) strzone(CTX(s))
+
+// x-encoding (encoding as zero length invisible string)
+// encodes approx. 14 bits into 5 bytes of color code string
+const float XENCODE_MAX = 21295; // 2*22*22*22-1
+const float XENCODE_LEN = 5;
+string xencode(float f);
+float xdecode(string s);
+
+#ifndef COMPAT_XON010_CHANNELS
+#define sound(e,c,s,v,a) sound7(e,c,s,v,a,0,0)
+#endif
#include "xonotic/dialog_hudpanel_infomessages.c"
#include "xonotic/dialog_hudpanel_weapons.c"
#include "xonotic/dialog_hudpanel_physics.c"
+#include "xonotic/dialog_hudpanel_centerprint.c"
#include "xonotic/slider_picmip.c"
if(fh < 0)
if(cvar_defstring("menu_skin") != "")
{
- draw_currentSkin = strcat("gfx/menu/", cvar_defstring("menu_skin"));
+ cvar_set("menu_skin", cvar_defstring("menu_skin"));
+ draw_currentSkin = strcat("gfx/menu/", cvar_string("menu_skin"));
fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
}
if(fh < 0)
draw_currentSkin = "gfx/menu/default";
fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
}
+ if(fh < 0)
+ {
+ error("cannot load any menu skin\n");
+ }
draw_currentSkin = strzone(draw_currentSkin);
while((s = fgets(fh)))
{
+++ /dev/null
-#ifndef INTERFACE
-#define INTERFACE
-#endif
-
-#ifdef IMPLEMENTATION
-#undef IMPLEMENTATION
-#endif
-
-#ifdef CLASS
-#undef CLASS
-#undef EXTENDS
-#undef METHOD
-#undef ATTRIB
-#undef ATTRIBARRAY
-#undef ENDCLASS
-#undef SUPER
-#endif
-
-#define CLASS(cname) entity spawn##cname(); entity cname##_vtbl;
-#define EXTENDS(base)
-#define METHOD(cname,name,prototype) prototype cname##_##name; .prototype name;
-#define ATTRIB(cname,name,type,val) .type name;
-#define ATTRIBARRAY(cname,name,type,cnt) .type name[cnt];
-#define ENDCLASS(cname) .float instanceOf##cname;
-#define SUPER(cname)
+++ /dev/null
-#ifndef INTERFACE
-#define INTERFACE
-#endif
-
-#ifdef IMPLEMENTATION
-#undef IMPLEMENTATION
-#endif
-
-#ifdef CLASS
-#undef CLASS
-#undef EXTENDS
-#undef METHOD
-#undef ATTRIB
-#undef ATTRIBARRAY
-#undef ENDCLASS
-#undef SUPER
-#endif
-
-#define CLASS(cname) entity spawn##cname() { entity me;
-#define EXTENDS(base) me = spawn##base (); entity basevtbl; basevtbl = base##_vtbl;
-#define METHOD(cname,name,prototype) me.name = cname##_##name;
-#define ATTRIB(cname,name,type,val) me.name = val;
-#define ATTRIBARRAY(cname,name,type,cnt) me.name = me.name;
-#define ENDCLASS(cname) me.instanceOf##cname = 1; me.classname = #cname; if(!cname##_vtbl) cname##_vtbl = spawnVtbl(me, basevtbl); return me; }
-#define SUPER(cname)
-#ifdef INTERFACE
-#undef INTERFACE
+#ifndef INTERFACE
+#define INTERFACE
#endif
#ifndef IMPLEMENTATION
#undef SUPER
#endif
+// for the constructor
+#define CLASS(cname) entity spawn##cname() { entity me;
+#define EXTENDS(base) me = spawn##base (); entity basevtbl; basevtbl = base##_vtbl;
+#define METHOD(cname,name,prototype) me.name = cname##_##name;
+#define ATTRIB(cname,name,type,val) me.name = val;
+#define ATTRIBARRAY(cname,name,type,cnt) me.name = me.name;
+#define ENDCLASS(cname) me.instanceOf##cname = 1; me.classname = #cname; if(!cname##_vtbl) cname##_vtbl = spawnVtbl(me, basevtbl); return me; }
+
+// for the implementation
#define SUPER(cname) (cname##_vtbl.vtblbase)
--- /dev/null
+#ifndef INTERFACE
+#define INTERFACE
+#endif
+
+#ifdef IMPLEMENTATION
+#undef IMPLEMENTATION
+#endif
+
+#ifdef CLASS
+#undef CLASS
+#undef EXTENDS
+#undef METHOD
+#undef ATTRIB
+#undef ATTRIBARRAY
+#undef ENDCLASS
+#undef SUPER
+#endif
+
+#define CLASS(cname) entity spawn##cname(); entity cname##_vtbl;
+#define EXTENDS(base)
+#define METHOD(cname,name,prototype) prototype cname##_##name; .prototype name;
+#define ATTRIB(cname,name,type,val) .type name;
+#define ATTRIBARRAY(cname,name,type,cnt) .type name[cnt];
+#define ENDCLASS(cname) .float instanceOf##cname;
+#define SUPER(cname)
skin.qh
xonotic/util.qh
-oo/classdefs.h
- classes.c
-
-oo/constructors.h
+oo/interface.h
classes.c
oo/implementation.h
classes.c
me.configureXonoticListBox(me);
// load the file
me.bufferIndex = buf_load(language_filename("xonotic-credits.txt"));
- if(me.bufferIndex < 0)
- me.bufferIndex = buf_load("xonotic-credits.txt");
me.nItems = buf_getsize(me.bufferIndex);
}
void XonoticCreditsList_destroy(entity me)
--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticHUDCenterprintDialog) EXTENDS(XonoticRootDialog)
+ METHOD(XonoticHUDCenterprintDialog, fill, void(entity))
+ ATTRIB(XonoticHUDCenterprintDialog, title, string, _("Centerprint"))
+ ATTRIB(XonoticHUDCenterprintDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
+ ATTRIB(XonoticHUDCenterprintDialog, intendedWidth, float, 0.4)
+ ATTRIB(XonoticHUDCenterprintDialog, rows, float, 15)
+ ATTRIB(XonoticHUDCenterprintDialog, columns, float, 4)
+ ATTRIB(XonoticHUDCenterprintDialog, name, string, "HUDcenterprint")
+ENDCLASS(XonoticHUDCenterprintDialog)
+#endif
+
+#ifdef IMPLEMENTATION
+void XonoticHUDCenterprintDialog_fill(entity me)
+{
+ entity e;
+ string panelname = "centerprint";
+
+ DIALOG_HUDPANEL_COMMON();
+
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Message duration:")));
+ me.TD(me, 1, 2.6, e = makeXonoticSlider(1, 10, 1, "hud_panel_centerprint_time"));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Fade time:")));
+ me.TD(me, 1, 2.6, e = makeXonoticSlider(0, 1, 0.05, "hud_panel_centerprint_fadetime"));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_centerprint_flip", _("Flip messages order")));
+ me.TR(me);
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Text alignment:")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "0", _("Left")));
+ me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "0.5", _("Center")));
+ me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "1", _("Right")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Font scale:")));
+ me.TD(me, 1, 2.6, e = makeXonoticSlider(0.5, 2, 0.1, "hud_panel_centerprint_fontscale"));
+}
+#endif
{
entity e;
string panelname = "physics";
- float i;
me.TR(me);
me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_physics"));
e.addValue(e, _("Panel disabled"), "0");
- e.addValue(e, _("Panel enabled if not observing"), "1");
- e.addValue(e, _("Panel always enabled"), "2");
+ e.addValue(e, _("Panel enabled"), "1");
+ e.addValue(e, _("Panel enabled even observing"), "2");
+ e.addValue(e, _("Panel enabled only in Race/CTS"), "3");
e.configureXonoticTextSliderValues(e);
DIALOG_HUDPANEL_COMMON_NOTOGGLE();
ATTRIB(XonoticHUDWeaponsDialog, title, string, _("Weapons Panel"))
ATTRIB(XonoticHUDWeaponsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDWeaponsDialog, intendedWidth, float, 0.4)
- ATTRIB(XonoticHUDWeaponsDialog, rows, float, 17)
+ ATTRIB(XonoticHUDWeaponsDialog, rows, float, 18)
ATTRIB(XonoticHUDWeaponsDialog, columns, float, 4)
ATTRIB(XonoticHUDWeaponsDialog, name, string, "HUDweapons")
ENDCLASS(XonoticHUDWeaponsDialog)
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
me.TR(me);
me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Weapon icons:")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_weapons_onlyowned", _("Show only owned weapons")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Show weapon ID as:")));
void XonoticServerCreateTab_fill(entity me)
{
entity e, e0;
- float n;
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Game type:")));
me.TR(me);
me.TD(me, 1, w, e = makeXonoticTextLabel(0, _("Game types:")));
-
n = ceil(GameType_GetCount() / (me.rows - 6));
wgt = (w - 0.2) / n;
for(i = 0; i < GameType_GetCount(); ++i)
me.TD(me, 1, me.columns - 5.5, e = makeXonoticButton(_("Close"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
- me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton(_("Play"), '0 0 0'));
+ me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton(ZCTX(_("MAP^Play")), '0 0 0'));
me.startButton.onClick = MapList_LoadMap;
me.startButton.onClickEntity = NULL; // filled later
}
me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Timedemo"), '0 0 0'));
e.onClick = TimeDemo_Click;
e.onClickEntity = dlist;
- me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Play"), '0 0 0'));
+ me.TD(me, 1, me.columns / 2, e = makeXonoticButton(ZCTX(_("DEMO^Play")), '0 0 0'));
e.onClick = StartDemo_Click;
e.onClickEntity = dlist;
}
ATTRIB(XonoticWeaponsDialog, title, string, _("Weapon settings"))
ATTRIB(XonoticWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.4)
- ATTRIB(XonoticWeaponsDialog, rows, float, 17)
+ ATTRIB(XonoticWeaponsDialog, rows, float, 18)
ATTRIB(XonoticWeaponsDialog, columns, float, 3)
ATTRIB(XonoticWeaponsDialog, weaponsList, entity, NULL)
ENDCLASS(XonoticWeaponsDialog)
me.TR(me);
me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Weapon priority list:")));
me.TR(me);
- me.TD(me, 9, 3, e = me.weaponsList = makeXonoticWeaponsList());
- me.gotoRC(me, 10, 0);
+ me.TD(me, 10, 3, e = me.weaponsList = makeXonoticWeaponsList());
+ me.gotoRC(me, 11, 0);
me.TDempty(me, 0.5);
me.TD(me, 1, 1, e = makeXonoticButton(_("Up"), '0 0 0'));
e.onClick = WeaponsList_MoveUp_Click;
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "r_drawviewmodel", _("Draw 1st person weapon model")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
setDependent(e, "r_drawviewmodel", 1, 1);
- me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "1", _("Center")));
+ setDependent(e, "r_drawviewmodel", 1, 1);
+ me.TD(me, 1, 1.0, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
setDependent(e, "r_drawviewmodel", 1, 1);
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_flipped", _("Flip view horizontally")));
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
- makeMulti(s, "snd_csqcchannel2volume");
+ makeMulti(s, "snd_channel8volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Music:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_staticvolume");
+ makeMulti(s, "snd_channel9volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, ZCTX(_("VOL^Ambient:"))));
- makeMulti(s, "snd_entchannel2volume");
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_worldchannel0volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel0volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Info:")));
- makeMulti(s, "snd_csqcchannel0volume");
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel3volume");
- makeMulti(s, "snd_playerchannel0volume snd_playerchannel3volume snd_csqcchannel3volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel3volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Items:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel6volume");
- makeMulti(s, "snd_csqcchannel6volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel6volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Pain:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel7volume");
- makeMulti(s, "snd_entchannel7volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel7volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Player:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel4volume");
- makeMulti(s, "snd_playerchannel4volume snd_entchannel6volume snd_csqcchannel4volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel4volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Shots:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel2volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel2volume");
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Voice:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel1volume");
- makeMulti(s, "snd_playerchannel5volume snd_entchannel1volume snd_entchannel5volume");
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel1volume");
+ makeMulti(s, "snd_channel5volume"); // @!#%'n Tuba
me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Weapons:")));
me.TD(me, 1, 2, s);
setDependentStringNotEqual(e, "mastervolume", "0");
me.TD(me, 1, 1.9, e = makeXonoticSlider(500, 2000, 100, "r_drawparticles_drawdistance"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+ me.TD(me, 1, 1.5, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+ me.TD(me, 1, 1.5, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
+ setDependent(e, "cl_decals", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.9, e = makeXonoticTextLabel(0, _("Distance:")));
me.TD(me, 1, 1.2, e = makeXonoticCheckBox(1, "mod_q3bsp_nolightmaps", _("Use lightmaps")));
me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_deluxemapping", _("Deluxe mapping")));
setDependentAND(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
- me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "r_shadow_gloss", _("Gloss")));
- setDependentAND3(e, "vid_gl20", 1, 1, "r_glsl_deluxemapping", 1, 2, "mod_q3bsp_nolightmaps", 0, 0);
+ me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "r_shadow_gloss", _("Gloss"))); // FIXME move this box elsewhere, it has nothing to do with Q3BSP lightmaps
+ setDependent(e, "vid_gl20", 1, 1);
me.TR(me);
me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping", _("Offset mapping")));
setDependent(e, "vid_gl20", 1, 1);
e.savedValue = 0.5; // default
me.TD(me, 1, 2, s);
me.TR(me);
- s = makeXonoticSlider(0.1, 1, 0.1, "r_damageblur");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, _("Damage blur:")));
- if(s.value != e.savedValue)
- e.savedValue = 0.4; // default
- me.TD(me, 1, 2, s);
+ e = makeXonoticCheckBoxEx(0.5, 0, "hud_postprocessing_maxbluralpha", _("Blur and sharpen postprocessing"));
+ makeMulti(e, "hud_powerup");
+ me.TD(me, 1, 2, e);
me.gotoRC(me, me.rows - 1, 0);
me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Key bindings:")));
me.TR(me);
- me.TD(me, me.rows - 2, 3.3, kb = makeXonoticKeyBinder());
- me.gotoRC(me, me.rows - 1, 0);
+ me.TD(me, me.rows - 4, 3.3, kb = makeXonoticKeyBinder());
+ me.gotoRC(me, me.rows - 3, 0);
me.TR(me);
me.TD(me, 1, 1.1, e = makeXonoticButton(_("Change key..."), '0 0 0'));
e.onClick = KeyBinder_Bind_Change;
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "apple_mouse_noaccel", _("Turn off OS mouse acceleration")));
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_closeontoggleconsole", _("\"enter console\" also closes")));
+ me.TR(me);
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_movement_track_canjump", _("Holding jump key keeps jumping")));
+ me.gotoRC(me, me.rows - 1, 0);
+ me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "sendcvar cl_movement_track_canjump", COMMANDBUTTON_APPLY));
}
#endif
void InstantAction_LoadMap(entity btn, entity dummy)
{
- float glob, i, n, fh;
- string s;
- glob = search_begin("maps/*.instantaction", TRUE, TRUE);
- if(glob < 0)
- return;
- i = ceil(random() * search_getsize(glob)) - 1;
- fh = fopen(search_getfilename(glob, i), FILE_READ);
- search_end(glob);
- if(fh < 0)
- return;
- while((s = fgets(fh)))
+ float pmin, pmax, pstep;
+
+ cvar_set("timelimit_override", "10");
+ cvar_set("g_lms_lives_override", "9");
+
+ if(random() < 0.4) // 40% are DM
+ {
+ MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
+ pmin = 2;
+ pmax = 8;
+ pstep = 1;
+ }
+ else if(random() < 0.5) // half of the remaining 60%, i.e. 30%, are CTF
+ {
+ MapInfo_SwitchGameType(MAPINFO_TYPE_CTF);
+ pmin = 4;
+ pmax = 12;
+ pstep = 2;
+ }
+ else if(random() < 0.5) // half of the remaining 30%, i.e. 15%, are TDM
+ {
+ MapInfo_SwitchGameType(MAPINFO_TYPE_TEAM_DEATHMATCH);
+ pmin = 4;
+ pmax = 8;
+ pstep = 2;
+ }
+ else if(random() < 0.666) // 2/3 of the remaining 15%, i.e. 10%, are KH
{
- if(substring(s, 0, 4) == "set ")
- s = substring(s, 4, strlen(s) - 4);
- n = tokenize_console(s);
- if(argv(0) == "bot_number")
- cvar_set("bot_number", argv(1));
- else if(argv(0) == "skill")
- cvar_set("skill", argv(1));
- else if(argv(0) == "timelimit")
- cvar_set("timelimit_override", argv(1));
- else if(argv(0) == "fraglimit")
- cvar_set("fraglimit_override", argv(1));
- else if(argv(0) == "changelevel")
+ MapInfo_SwitchGameType(MAPINFO_TYPE_KEYHUNT);
+ pmin = 6;
+ pmax = 6;
+ pstep = 6; // works both for 2 and 3 teams
+ // TODO find team count of map, set pstep=2 or 3, and use 2v2(v2) games at least
+ }
+ else // somehow distribute the remaining 5%
+ {
+ float r;
+ r = floor(random() * 4);
+ switch(r)
{
- fclose(fh);
- localcmd("\nmenu_loadmap_prepare\n");
- MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
- MapInfo_LoadMap(argv(1));
- cvar_set("lastlevel", "1");
- return;
+ default:
+ case 0:
+ MapInfo_SwitchGameType(MAPINFO_TYPE_LMS);
+ pmin = 2;
+ pmax = 6;
+ pstep = 1;
+ cvar_set("timelimit_override", "-1");
+ break;
+ case 1:
+ MapInfo_SwitchGameType(MAPINFO_TYPE_DOMINATION);
+ pmin = 2;
+ pmax = 8;
+ pstep = 2;
+ break;
+ case 2:
+ MapInfo_SwitchGameType(MAPINFO_TYPE_ONSLAUGHT);
+ pmin = 6;
+ pmax = 16;
+ pstep = 2;
+ break;
+ case 3:
+ MapInfo_SwitchGameType(MAPINFO_TYPE_ASSAULT);
+ pmin = 4;
+ pmax = 16;
+ pstep = 2;
+ break;
+ // CA, Freezetag: bot AI does not work, add them once it does
}
}
- fclose(fh);
+
+ // find random map
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+ string s;
+ do
+ {
+ float m;
+ m = floor(random() * MapInfo_count);
+ s = MapInfo_BSPName_ByID(m);
+ }
+ while(!fexists(sprintf("maps/%s.waypoints", s)));
+ MapInfo_LoadMap(s);
+
+ // configure bots
+ float p;
+ pmin = pstep * ceil(pmin / pstep);
+ pmax = pstep * floor(pmax / pstep);
+ p = pmin + pstep * floor(random() * ((pmax - pmin) / pstep + 1));
+ cvar_set("bot_number", ftos(p - 1));
+
+ // make sure we go back to menu
+ cvar_set("lastlevel", "1");
}
void XonoticSingleplayerDialog_fill(entity me)
me.configureXonoticKeyBinder(me);
return me;
}
+void replace_bind(string from, string to)
+{
+ float n, j, k;
+ n = tokenize(findkeysforcommand(from)); // uses '...' strings
+ for(j = 0; j < n; ++j)
+ {
+ k = stof(argv(j));
+ if(k != -1)
+ localcmd("\nbind \"", keynumtostring(k), "\" \"", to, "\"\n");
+ }
+}
void XonoticKeyBinder_configureXonoticKeyBinder(entity me)
{
me.configureXonoticListBox(me);
Xonotic_KeyBinds_Read();
me.nItems = Xonotic_KeyBinds_Count;
me.setSelected(me, 0);
+
+ // TEMP: Xonotic 0.1 to later
+ replace_bind("impulse 1", "weapon_group_1");
+ replace_bind("impulse 2", "weapon_group_2");
+ replace_bind("impulse 3", "weapon_group_3");
+ replace_bind("impulse 4", "weapon_group_4");
+ replace_bind("impulse 5", "weapon_group_5");
+ replace_bind("impulse 6", "weapon_group_6");
+ replace_bind("impulse 7", "weapon_group_7");
+ replace_bind("impulse 8", "weapon_group_8");
+ replace_bind("impulse 9", "weapon_group_9");
+ replace_bind("impulse 14", "weapon_group_0");
}
void XonoticKeyBinder_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
{
i.configureDialog(i);
me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+ i = spawnXonoticHUDCenterprintDialog();
+ i.configureDialog(i);
+ me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
me.advancedDialog = i = spawnXonoticAdvancedDialog();
i.configureDialog(i);
me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", MapInfo_Map_bspname), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);
if(included)
draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);
- s = draw_TextShortenToWidth(strcat(MapInfo_Map_bspname, ": ", MapInfo_Map_title), me.columnNameSize, 0, me.realFontSize);
+ s = draw_TextShortenToWidth(MapInfo_Map_titlestring, me.columnNameSize, 0, me.realFontSize);
draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);
s = draw_TextShortenToWidth(MapInfo_Map_author, me.columnNameSize, 0, me.realFontSize);
draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, theAlpha, 0);
{
float i;
string s;
- MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN, 0); // all
+ MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN | MAPINFO_FLAG_HIDDEN, 0); // all
s = "";
for(i = 0; i < MapInfo_count; ++i)
s = strcat(s, " ", MapInfo_BSPName_ByID(i));
m = SLIST_MASK_AND - 1;
resethostcachemasks();
+
+ // ping: reject negative ping (no idea why this happens in the first place, engine bug)
+ sethostcachemasknumber(++m, SLIST_FIELD_PING, 0, SLIST_TEST_GREATEREQUAL);
+
if(!me.filterShowFull)
{
sethostcachemasknumber(++m, SLIST_FIELD_FREESLOTS, 1, SLIST_TEST_GREATEREQUAL); // legacy
float _Nex_ExtResponseSystem_Queried;
string _Nex_ExtResponseSystem_UpdateTo;
+string _Nex_ExtResponseSystem_UpdateToURL;
void URI_Get_Callback(float id, float status, string data)
{
// update needed
if(n >= 2)
print(sprintf(_("Update can be downloaded at:\n%s\n"), argv(1)));
+ if(n >= 3)
+ _Nex_ExtResponseSystem_UpdateToURL = strzone(argv(2));
}
_Nex_ExtResponseSystem_UpdateTo = strzone(_Nex_ExtResponseSystem_UpdateTo);
// TODO rather turn this into a dialog
fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;
line = eY * fs_y;
- sz_x = draw_TextWidth(" http://www.xonotic.org/ ", 0, fs);
+ string l1, l2;
+ l1 = sprintf(_("Update to %s now!"), _Nex_ExtResponseSystem_UpdateTo);
+ l2 = "http://www.xonotic.org/";
+ if(_Nex_ExtResponseSystem_UpdateToURL)
+ l2 = _Nex_ExtResponseSystem_UpdateToURL;
+
+ sz_x = draw_TextWidth(" ", 0, fs) + max(
+ draw_TextWidth(l1, 0, fs),
+ draw_TextWidth(l2, 0, fs)
+ );
sz_y = 3 * fs_y;
- draw_alpha = sin(time * 0.112 - 0.3) * 10;
+ draw_alpha = bound(0, sin(time * 0.112 - 0.3) * 10, 1);
mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))
+ eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));
draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);
- draw_CenterText(mid - 1 * line, sprintf(_("Update to %s now!"), _Nex_ExtResponseSystem_UpdateTo), fs, '1 0 0', 1, 0);
- draw_CenterText(mid - 0 * line, "http://www.xonotic.org/", fs, '0 0 1', 1, 0);
+ draw_CenterText(mid - 1 * line, l1, fs, '1 0 0', 1, 0);
+ draw_CenterText(mid - 0 * line, l2, fs, '0 0 1', 1, 0);
}
if not(campaign_name_previous)
campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal
float have_dds, have_jpg, have_tga;
float can_dds;
have_dds = (fexists("dds/particles/particlefont.dds"));
- have_dds = (fexists("particles/particlefont.jpg"));
- have_dds = (fexists("particles/particlefont.tga"));
+ have_jpg = (fexists("particles/particlefont.jpg"));
+ have_tga = (fexists("particles/particlefont.tga"));
can_dds = GL_Have_TextureCompression();
if(have_dds && (have_jpg || have_tga))
{
// but ONLY if we actually support it!
if(can_dds)
{
+ // these builds are meant to have GOOD quality, so let's not compress non-skinframes
cvar_set("gl_texturecompression", "0");
return 1;
+
+ //cvar_set("gl_texturecompression", cvar_string("r_texture_dds_load"));
+ //return 2;
}
else
{
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="qc-client" />
- <Option makefile="client" />
- <Option makefile_is_custom="1" />
- <Option pch_mode="2" />
- <Option compiler="qaukec" />
- <Build>
- <Target title="Debug">
- <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Debug\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <MakeCommands>
- <Build command="$make -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- <Target title="Release">
- <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Release\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <MakeCommands>
- <Build command="$make -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- </Compiler>
- <Unit filename="client\Defs.qc" />
- <Unit filename="client\Main.qc" />
- <Unit filename="client\View.qc" />
- <Unit filename="client\autocvars.qh" />
- <Unit filename="client\bgmscript.qc" />
- <Unit filename="client\bgmscript.qh" />
- <Unit filename="client\casings.qc" />
- <Unit filename="client\csqc_builtins.qc" />
- <Unit filename="client\csqc_constants.qc" />
- <Unit filename="client\ctf.qc" />
- <Unit filename="client\damage.qc" />
- <Unit filename="client\effects.qc" />
- <Unit filename="client\gibs.qc" />
- <Unit filename="client\hook.qc" />
- <Unit filename="client\interpolate.qc" />
- <Unit filename="client\interpolate.qh" />
- <Unit filename="client\laser.qc" />
- <Unit filename="client\main.qh" />
- <Unit filename="client\mapvoting.qc" />
- <Unit filename="client\miscfunctions.qc" />
- <Unit filename="client\modeleffects.qc" />
- <Unit filename="client\movetypes.qc" />
- <Unit filename="client\movetypes.qh" />
- <Unit filename="client\particles.qc" />
- <Unit filename="client\prandom.qc" />
- <Unit filename="client\prandom.qh" />
- <Unit filename="client\pre.qh" />
- <Unit filename="client\progs.src" />
- <Unit filename="client\projectile.qc" />
- <Unit filename="client\rubble.qc" />
- <Unit filename="client\sbar.qc" />
- <Unit filename="client\sortlist.qc" />
- <Unit filename="client\teamplay.qc" />
- <Unit filename="client\teamradar.qc" />
- <Unit filename="client\teamradar.qh" />
- <Unit filename="client\tuba.qc" />
- <Unit filename="client\wall.qc" />
- <Unit filename="client\waypointsprites.qc" />
- <Unit filename="client\waypointsprites.qh" />
- <Extensions>
- <code_completion />
- <debugger />
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="qc-common" />
- <Option makefile="none" />
- <Option makefile_is_custom="1" />
- <Option pch_mode="2" />
- <Option compiler="qaukec" />
- <Build>
- <Target title="Debug">
- <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Debug\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <MakeCommands>
- <Build command="$make -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- <Target title="Release">
- <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Release\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <MakeCommands>
- <Build command="$make -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- </Compiler>
- <Unit filename="common\campaign_common.qh" />
- <Unit filename="common\campaign_file.qc" />
- <Unit filename="common\campaign_setup.qc" />
- <Unit filename="common\constants.qh" />
- <Unit filename="common\gamecommand.qc" />
- <Unit filename="common\items.qc" />
- <Unit filename="common\items.qh" />
- <Unit filename="common\mapinfo.qc" />
- <Unit filename="common\mapinfo.qh" />
- <Unit filename="common\util-pre.qh" />
- <Unit filename="common\util.qc" />
- <Unit filename="common\util.qh" />
- <Extensions>
- <code_completion />
- <debugger />
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="qc-server" />
- <Option makefile="server/" />
- <Option makefile_is_custom="1" />
- <Option pch_mode="2" />
- <Option compiler="qaukec" />
- <Build>
- <Target title="Debug">
- <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Debug\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-g" />
- </Compiler>
- <MakeCommands>
- <Build command="$make -DVEHICLES_ENABLED -DRELEASE -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- <Target title="Release">
- <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
- <Option object_output="obj\Release\" />
- <Option type="1" />
- <Option compiler="qaukec" />
- <Compiler>
- <Add option="-O2" />
- </Compiler>
- <Linker>
- <Add option="-s" />
- </Linker>
- <MakeCommands>
- <Build command="$make -DVEHICLES_ENABLED -DRELEASE -src $makefile" />
- <CompileFile command="" />
- <Clean command="" />
- <DistClean command="" />
- </MakeCommands>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- </Compiler>
- <Unit filename="anticheat.qc" />
- <Unit filename="anticheat.qh" />
- <Unit filename="antilag.qc" />
- <Unit filename="antilag.qh" />
- <Unit filename="arena.qc" />
- <Unit filename="assault.qc" />
- <Unit filename="bot\aim.qc" />
- <Unit filename="bot\aim.qh" />
- <Unit filename="bot\bot.qc" />
- <Unit filename="bot\bot.qh" />
- <Unit filename="bot\havocbot\havocbot.qc" />
- <Unit filename="bot\havocbot\havocbot.qh" />
- <Unit filename="bot\havocbot\role_ctf.qc" />
- <Unit filename="bot\havocbot\role_keyhunt.qc" />
- <Unit filename="bot\havocbot\role_onslaught.qc" />
- <Unit filename="bot\havocbot\roles.qc" />
- <Unit filename="bot\navigation.qc" />
- <Unit filename="bot\navigation.qh" />
- <Unit filename="bot\scripting.qc" />
- <Unit filename="bot\waypoints.qc" />
- <Unit filename="bot\waypoints.qh" />
- <Unit filename="builtins.qh" />
- <Unit filename="campaign.qc" />
- <Unit filename="campaign.qh" />
- <Unit filename="cheats.qc" />
- <Unit filename="cheats.qh" />
- <Unit filename="cl_client.qc" />
- <Unit filename="cl_impulse.qc" />
- <Unit filename="cl_physics.qc" />
- <Unit filename="cl_player.qc" />
- <Unit filename="cl_weapons.qc" />
- <Unit filename="cl_weaponsystem.qc" />
- <Unit filename="clientcommands.qc" />
- <Unit filename="constants.qh" />
- <Unit filename="csqceffects.qc" />
- <Unit filename="csqcprojectile.qc" />
- <Unit filename="csqcprojectile.qh" />
- <Unit filename="ctf.qc" />
- <Unit filename="defs.qh" />
- <Unit filename="domination.qc" />
- <Unit filename="ent_cs.qc" />
- <Unit filename="extensions.qh" />
- <Unit filename="func_breakable.qc" />
- <Unit filename="g_casings.qc" />
- <Unit filename="g_damage.qc" />
- <Unit filename="g_hook.qc" />
- <Unit filename="g_hook.qh" />
- <Unit filename="g_lights.qc" />
- <Unit filename="g_models.qc" />
- <Unit filename="g_subs.qc" />
- <Unit filename="g_swamp.qc" />
- <Unit filename="g_tetris.qc" />
- <Unit filename="g_triggers.qc" />
- <Unit filename="g_violence.qc" />
- <Unit filename="g_world.qc" />
- <Unit filename="gamecommand.qc" />
- <Unit filename="ipban.qc" />
- <Unit filename="ipban.qh" />
- <Unit filename="miscfunctions.qc" />
- <Unit filename="mode_onslaught.qc" />
- <Unit filename="monsters\ai.qc" />
- <Unit filename="monsters\defs.qc" />
- <Unit filename="monsters\fight.qc" />
- <Unit filename="monsters\m_monsters.qc" />
- <Unit filename="monsters\mode_management.qc" />
- <Unit filename="monsters\monster_zombie.qc" />
- <Unit filename="movelib.qc" />
- <Unit filename="mutators\base.qc" />
- <Unit filename="mutators\base.qh" />
- <Unit filename="mutators\gamemode_keyhunt.qc" />
- <Unit filename="mutators\gamemode_keyhunt.qh" />
- <Unit filename="mutators\mutator_dodging.qc" />
- <Unit filename="mutators\mutator_dodging.qh" />
- <Unit filename="mutators\mutator_nix.qc" />
- <Unit filename="mutators\mutators.qh" />
- <Unit filename="nexball.qc" />
- <Unit filename="pathlib.qc" />
- <Unit filename="pathlib\costs.qc" />
- <Unit filename="pathlib\debug.qc" />
- <Unit filename="pathlib\expandnode.qc" />
- <Unit filename="pathlib\main.qc" />
- <Unit filename="pathlib\movenode.qc" />
- <Unit filename="pathlib\pathlib.qh" />
- <Unit filename="pathlib\utility.qc" />
- <Unit filename="playerdemo.qc" />
- <Unit filename="playerdemo.qh" />
- <Unit filename="portals.qc" />
- <Unit filename="portals.qh" />
- <Unit filename="post-builtins.qh" />
- <Unit filename="pre-builtins.qh" />
- <Unit filename="progs.src" />
- <Unit filename="race.qc" />
- <Unit filename="race.qh" />
- <Unit filename="runematch.qc" />
- <Unit filename="scores.qc" />
- <Unit filename="scores.qh" />
- <Unit filename="scores_rules.qc" />
- <Unit filename="steerlib.qc" />
- <Unit filename="sv_main.qc" />
- <Unit filename="sv_stats.qc" />
- <Unit filename="sys.qh" />
- <Unit filename="t_halflife.qc" />
- <Unit filename="t_items.qc" />
- <Unit filename="t_jumppads.qc" />
- <Unit filename="t_plats.qc" />
- <Unit filename="t_quake.qc" />
- <Unit filename="t_quake3.qc" />
- <Unit filename="t_swamp.qc" />
- <Unit filename="t_teleporters.qc" />
- <Unit filename="target_spawn.qc" />
- <Unit filename="teamplay.qc" />
- <Unit filename="tturrets\include\turrets.qh" />
- <Unit filename="tturrets\include\turrets_early.qh" />
- <Unit filename="tturrets\system\system_aimprocs.qc" />
- <Unit filename="tturrets\system\system_damage.qc" />
- <Unit filename="tturrets\system\system_main.qc" />
- <Unit filename="tturrets\system\system_misc.qc" />
- <Unit filename="tturrets\system\system_scoreprocs.qc" />
- <Unit filename="tturrets\units\unit_checkpoint.qc" />
- <Unit filename="tturrets\units\unit_common.qc" />
- <Unit filename="tturrets\units\unit_ewheel.qc" />
- <Unit filename="tturrets\units\unit_flac.qc" />
- <Unit filename="tturrets\units\unit_fusionreactor.qc" />
- <Unit filename="tturrets\units\unit_hellion.qc" />
- <Unit filename="tturrets\units\unit_hk.qc" />
- <Unit filename="tturrets\units\unit_machinegun.qc" />
- <Unit filename="tturrets\units\unit_mlrs.qc" />
- <Unit filename="tturrets\units\unit_phaser.qc" />
- <Unit filename="tturrets\units\unit_plasma.qc" />
- <Unit filename="tturrets\units\unit_targettrigger.qc" />
- <Unit filename="tturrets\units\unit_tessla.qc" />
- <Unit filename="tturrets\units\unit_walker.qc" />
- <Unit filename="vehicles\racer.qc" />
- <Unit filename="vehicles\raptor.qc" />
- <Unit filename="vehicles\spiderbot.qc" />
- <Unit filename="vehicles\vehicles.qc" />
- <Unit filename="vehicles\vehicles.qh" />
- <Unit filename="verbstack.qc" />
- <Unit filename="vote.qc" />
- <Unit filename="vote.qh" />
- <Unit filename="w_all.qc" />
- <Unit filename="w_campingrifle.qc" />
- <Unit filename="w_common.qc" />
- <Unit filename="w_crylink.qc" />
- <Unit filename="w_electro.qc" />
- <Unit filename="w_fireball.qc" />
- <Unit filename="w_grenadelauncher.qc" />
- <Unit filename="w_minelayer.qc" />
- <Unit filename="w_hagar.qc" />
- <Unit filename="w_hlac.qc" />
- <Unit filename="w_hook.qc" />
- <Unit filename="w_laser.qc" />
- <Unit filename="w_minstanex.qc" />
- <Unit filename="w_nex.qc" />
- <Unit filename="w_porto.qc" />
- <Unit filename="w_rocketlauncher.qc" />
- <Unit filename="w_shotgun.qc" />
- <Unit filename="w_tuba.qc" />
- <Unit filename="w_uzi.qc" />
- <Unit filename="waypointsprites.qc" />
- <Extensions>
- <code_completion />
- <debugger />
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
.float accuracy_fired[WEP_MAXCOUNT];
.float accuracy_cnt_hit[WEP_MAXCOUNT];
.float accuracy_cnt_fired[WEP_MAXCOUNT];
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_hit);
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_fired);
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_cnt_hit);
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_cnt_fired);
float accuracy_byte(float n, float d)
{
entity spawnqueue_first;
entity spawnqueue_last;
entity champion;
-string champion_name;
float warmup;
-float ca_players;
-float required_ca_players;
+float ca_teams_ok;
.float caplayer;
void PutObserverInServer();
float redalive, bluealive, yellowalive, pinkalive;
float totalalive;
.float redalive_stat, bluealive_stat, yellowalive_stat, pinkalive_stat;
-float redspawned, bluespawned, yellowspawned, pinkspawned;
-float totalspawned;
+float red_players, blue_players, yellow_players, pink_players;
+float total_players;
/**
* Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
self.team = self.team_saved;
if(self.flags & FL_PROJECTILE) // remove any projectiles left
- {
- stopsound(self, CHAN_PAIN);
remove(self);
- }
}
// Waypoints and assault start come LAST
}
if(g_keyhunt)
- kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round+(game_starttime - time), "", kh_StartRound);
+ kh_Controller_SetThink_NoMsg(autocvar_g_balance_keyhunt_delay_round+(game_starttime - time), kh_StartRound);
if(g_arena)
if(champion && champion.classname == "player" && player_count > 1)
void Arena_Warmup()
{
float f;
- string msg;
entity e;
if((!g_arena && !g_ca && !g_freezetag) || (g_arena && !arena_roundbased) || (time < game_starttime))
return;
f = ceil(warmup - time);
- if(f > 0)
- champion = world; // this is done because a if(champion) will not execute if champion = world
allowed_to_spawn = 0;
if(inWarmupStage)
allowed_to_spawn = 1;
- if(ca_players < required_ca_players)
+ if(g_ca && !ca_teams_ok)
allowed_to_spawn = 1;
- msg = NEWLINES;
if(time < warmup && !inWarmupStage)
{
if (g_ca)
allowed_to_spawn = 1;
if(champion && g_arena)
- msg = strcat("The Champion is ", champion_name, "^7\n");
- //centerprint(self, strcat(msg, "The Champion is ", champion.netname, "^7\n"));
+ {
+ FOR_EACH_PLAYER(e)
+ centerprint(e, strcat("The Champion is ", champion.netname));
+ }
if(f != roundStartTime_prev) {
- msg = strcat(msg, "Round will start in ", ftos(f),"\n");
- //centerprint(self, strcat("Round will start in ", ftos(f),"\n"));
roundStartTime_prev = f;
if(f == 5)
Announce("prepareforbattle");
else if(f == 1)
Announce("1");
- FOR_EACH_PLAYER(e)
- centerprint(e, msg);
+ FOR_EACH_PLAYER(e)
+ Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "Round will start in %d", 1, f);
}
if (g_arena) {
self.movement = '0 0 0';
}
}
-
else if(f > -1 && f != roundStartTime_prev)
{
roundStartTime_prev = f;
Announce("begin");
- centerprint(self, "^1Begin!\n");
+ FOR_EACH_PLAYER(e)
+ Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "^1Begin!", 1, 0);
if(g_ca) {
- ca_players = 0;
+ float start_red_ca_players, start_blue_ca_players;
- FOR_EACH_PLAYER(e)
- ca_players += 1;
+ FOR_EACH_PLAYER(e) {
+ if (e.team == COLOR_TEAM1)
+ start_red_ca_players += 1;
+ else if (e.team == COLOR_TEAM2)
+ start_blue_ca_players += 1;
+ }
+ // teams are ok if there's at least 1 player in each team
+ ca_teams_ok = (start_red_ca_players && start_blue_ca_players);
}
if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE)
self.movetype = MOVETYPE_WALK;
+
}
+
+ // clear champion to avoid centerprinting again the champion msg
+ if (champion)
+ champion = world;
}
-void count_spawned_players()
+void count_players()
{
- // TODO fix "*spawned" name, it should rather be "*players" or so
- // not doing this now to prevent merge hell with Tag
- // fix after merging with Tag
-
// count amount of players in each team
- totalspawned = redspawned = bluespawned = yellowspawned = pinkspawned = 0;
+ total_players = red_players = blue_players = yellow_players = pink_players = 0;
FOR_EACH_PLAYER(self) {
if (self.team == COLOR_TEAM1)
{
- redspawned += 1;
- totalspawned += 1;
+ red_players += 1;
+ total_players += 1;
}
else if (self.team == COLOR_TEAM2)
{
- bluespawned += 1;
- totalspawned += 1;
+ blue_players += 1;
+ total_players += 1;
}
else if (self.team == COLOR_TEAM3)
{
- yellowspawned += 1;
- totalspawned += 1;
+ yellow_players += 1;
+ total_players += 1;
}
else if (self.team == COLOR_TEAM4)
{
- pinkspawned += 1;
- totalspawned += 1;
+ pink_players += 1;
+ total_players += 1;
}
}
}
*
* Gets called in StartFrame()
*/
+float warntime;
void Spawnqueue_Check()
{
- count_spawned_players();
+ count_players();
if(g_ca || g_freezetag) // we want to perform this before the return block below (CA)...
{
count_alive_players();
return;
if(g_ca) {
- required_ca_players = max(2, fabs(autocvar_bot_vs_human + 1));
-
- if(ca_players < required_ca_players && (redspawned && bluespawned)) {
+ if(!ca_teams_ok && (red_players && blue_players)) {
reset_map(TRUE);
}
- else if(ca_players < required_ca_players) {
- FOR_EACH_PLAYER(self)
- centerprint(self, strcat("^1Need at least 1 player in each team to play CA", "^7\n"));
+ else if(!ca_teams_ok) {
+ if (time > warntime)
+ {
+ FOR_EACH_PLAYER(self)
+ Send_CSQC_Centerprint_Generic(self, CPID_ROUND_STARTING, "^1Need at least 1 player in each team to play CA", 2, 0);
+ warntime = time + 1;
+ }
return;
}
else if(!next_round) {
- if((redspawned && !bluespawned) || (bluespawned && !redspawned)) {
+ if((red_players && !blue_players) || (blue_players && !red_players)) {
next_round = time + 5;
- champion = find(world, classname, "player");
- if(champion_name)
- strunzone(champion_name);
- champion_name = strzone(champion.netname);
}
- else if((!redspawned && !bluespawned) || time - warmup > autocvar_g_ca_round_timelimit) {
- FOR_EACH_CLIENT(self) centerprint(self, strcat("^7Round tied.", "^7\n"));
+ else if((!red_players && !blue_players) || time - warmup > autocvar_g_ca_round_timelimit) {
+ FOR_EACH_CLIENT(self) centerprint(self, "^7Round tied");
next_round = time + 5;
}
if(redalive && !bluealive)
{
play2all("ctf/red_capture.wav");
- FOR_EACH_CLIENT(self) centerprint(self, "^1 RED ^7team wins the round.\n");
+ FOR_EACH_CLIENT(self) centerprint(self, "^1RED ^7team wins the round");
TeamScore_AddToTeam(COLOR_TEAM1, ST_SCORE, +1);
stopalivecheck = TRUE;
}
else if(bluealive && !redalive)
{
play2all("ctf/blue_capture.wav");
- FOR_EACH_CLIENT(self) centerprint(self, "^4 BLUE ^7team wins the round.\n");
+ FOR_EACH_CLIENT(self) centerprint(self, "^4BLUE ^7team wins the round");
TeamScore_AddToTeam(COLOR_TEAM2, ST_SCORE, +1);
stopalivecheck = TRUE;
}
}
void assault_objective_use() {
- if(other.classname == "info_player_deathmatch") // a spawn, a spawn
- return;
-
// activate objective
self.health = 100;
//print("^2Activated objective ", self.targetname, "=", etos(self), "\n");
centerprint(player, s);
}
}
-
+
oldactivator = activator;
activator = oldself;
SUB_UseTargets();
ent.sprite = world;
}
- spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
+ spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite, RADARICON_OBJECTIVE, '1 0.5 0');
spr.assault_decreaser = self;
spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
spr.classname = "sprite_waypoint";
}
else
WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
- WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
}
}
return;
}
self.spawnflags = 3;
+ self.classname = "func_assault_destructible";
if(assault_attacker_team == COLOR_TEAM1) {
self.team = COLOR_TEAM2;
} else {
activator = self;
SUB_UseTargets();
-
+
#ifdef TTURRETS_ENABLED
entity ent, oldself;
// trigger new round
// reset objectives, toggle spawnpoints, reset triggers, ...
-void assault_new_round() {
+void vehicles_clearrturn();
+void vehicles_spawn();
+void assault_new_round()
+{
+ entity oldself;
//bprint("ASSAULT: new round\n");
+ oldself = self;
+ // Eject players from vehicles
+ FOR_EACH_PLAYER(self)
+ {
+ if(self.vehicle)
+ vehicles_exit(VHEF_RELESE);
+ }
+
+ self = findchainflags(vehicle_flags, VHF_ISVEHICLE);
+ while(self)
+ {
+ vehicles_clearrturn();
+ vehicles_spawn();
+ self = self.chain;
+ }
+
+ self = oldself;
+
// up round counter
self.winning = self.winning + 1;
+float autocvar__independent_players;
float autocvar__campaign_index;
string autocvar__campaign_name;
float autocvar__sv_init;
float autocvar_g_balance_grenadelauncher_primary_force;
float autocvar_g_balance_grenadelauncher_primary_health;
float autocvar_g_balance_grenadelauncher_primary_lifetime;
-float autocvar_g_balance_grenadelauncher_primary_lifetime2;
+float autocvar_g_balance_grenadelauncher_primary_lifetime_stick;
float autocvar_g_balance_grenadelauncher_primary_radius;
float autocvar_g_balance_grenadelauncher_primary_refire;
float autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt;
float autocvar_g_balance_grenadelauncher_secondary_force;
float autocvar_g_balance_grenadelauncher_secondary_health;
float autocvar_g_balance_grenadelauncher_secondary_lifetime;
-float autocvar_g_balance_grenadelauncher_secondary_lifetime2;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime_stick;
float autocvar_g_balance_grenadelauncher_secondary_radius;
float autocvar_g_balance_grenadelauncher_secondary_refire;
float autocvar_g_balance_grenadelauncher_secondary_speed;
float autocvar_g_balance_hagar_secondary;
float autocvar_g_balance_hagar_secondary_load;
float autocvar_g_balance_hagar_secondary_load_speed;
+float autocvar_g_balance_hagar_secondary_load_spread;
+float autocvar_g_balance_hagar_secondary_load_spread_bias;
float autocvar_g_balance_hagar_secondary_load_max;
float autocvar_g_balance_hagar_secondary_load_hold;
float autocvar_g_balance_hagar_secondary_load_releasedeath;
float autocvar_g_balance_hagar_secondary_lifetime_rand;
float autocvar_g_balance_hagar_secondary_radius;
float autocvar_g_balance_hagar_secondary_refire;
+float autocvar_g_balance_hagar_secondary_speed;
+float autocvar_g_balance_hagar_secondary_spread;
float autocvar_g_balance_hagar_reload_ammo;
float autocvar_g_balance_hagar_reload_time;
float autocvar_g_balance_health_limit;
float autocvar_g_balance_hook_secondary_speed;
float autocvar_g_balance_keyhunt_damageforcescale;
float autocvar_g_balance_keyhunt_delay_collect;
-float autocvar_g_balance_keyhunt_delay_drop;
float autocvar_g_balance_keyhunt_delay_return;
float autocvar_g_balance_keyhunt_delay_round;
float autocvar_g_balance_keyhunt_delay_tracking;
float autocvar_g_ca_point_leadlimit;
float autocvar_g_ca_point_limit;
float autocvar_g_ca_round_timelimit;
+float autocvar_g_ca_spectate_enemies;
float autocvar_g_ca_warmup;
float autocvar_g_campaign;
-float autocvar_g_campaign_forceteam;
+#define autocvar_g_campaign_forceteam cvar("g_campaign_forceteam")
float autocvar_g_campaign_skill;
float autocvar_g_casings;
float autocvar_g_changeteam_banned;
float autocvar_g_turrets_unit_walker_std_rocket_turnrate;
float autocvar_g_turrets_unit_walker_std_rockets_range;
float autocvar_g_turrets_unit_walker_std_rockets_range_min;
+float autocvar_g_turrets_unit_walker_turn;
+float autocvar_g_turrets_unit_walker_turn_walk;
+float autocvar_g_turrets_unit_walker_turn_run;
+float autocvar_g_turrets_unit_walker_turn_strafe;
+float autocvar_g_turrets_unit_walker_turn_swim;
float autocvar_g_use_ammunition;
-float autocvar_g_vehicle_racer_afterburn_cost;
-float autocvar_g_vehicle_racer_anglestabilizer;
-float autocvar_g_vehicle_racer_downforce;
-float autocvar_g_vehicle_racer_energy;
-float autocvar_g_vehicle_racer_energy_usepause;
-float autocvar_g_vehicle_racer_health;
-float autocvar_g_vehicle_racer_laser_cost;
-float autocvar_g_vehicle_racer_laser_damage;
-float autocvar_g_vehicle_racer_laser_radius;
-float autocvar_g_vehicle_racer_laser_refire;
-float autocvar_g_vehicle_racer_laser_speed;
-float autocvar_g_vehicle_racer_pitchspeed;
-float autocvar_g_vehicle_racer_power_air;
-float autocvar_g_vehicle_racer_power_min;
-float autocvar_g_vehicle_racer_power_solid;
-float autocvar_g_vehicle_racer_reload;
-float autocvar_g_vehicle_racer_respawntime;
-float autocvar_g_vehicle_racer_rocket_accel;
-float autocvar_g_vehicle_racer_rocket_damage;
-float autocvar_g_vehicle_racer_rocket_radius;
-float autocvar_g_vehicle_racer_rocket_refire;
-float autocvar_g_vehicle_racer_rocket_speed;
-float autocvar_g_vehicle_racer_rocket_turnrate;
-float autocvar_g_vehicle_racer_shield;
-float autocvar_g_vehicle_racer_speed_afterburn;
-float autocvar_g_vehicle_racer_speed_forward;
-float autocvar_g_vehicle_racer_speed_strafe;
-float autocvar_g_vehicle_racer_springlength;
-float autocvar_g_vehicle_racer_turnroll;
-float autocvar_g_vehicle_racer_turnspeed;
-float autocvar_g_vehicle_raptor_reload;
-float autocvar_g_vehicle_spiderbot_crush_dmg;
-float autocvar_g_vehicle_spiderbot_crush_force;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
-float autocvar_g_vehicle_spiderbot_head_pitchspeed;
-float autocvar_g_vehicle_spiderbot_head_turnlimit;
-float autocvar_g_vehicle_spiderbot_head_turnspeed;
-float autocvar_g_vehicle_spiderbot_health;
-float autocvar_g_vehicle_spiderbot_minigun_cooldown;
-float autocvar_g_vehicle_spiderbot_minigun_damage;
-float autocvar_g_vehicle_spiderbot_minigun_heat;
-float autocvar_g_vehicle_spiderbot_minigun_refire;
-float autocvar_g_vehicle_spiderbot_minigun_spread;
-float autocvar_g_vehicle_spiderbot_movement_inertia;
-float autocvar_g_vehicle_spiderbot_respawntime;
-float autocvar_g_vehicle_spiderbot_rocket_damage;
-float autocvar_g_vehicle_spiderbot_rocket_edgedamage;
-float autocvar_g_vehicle_spiderbot_rocket_force;
-float autocvar_g_vehicle_spiderbot_rocket_health;
-float autocvar_g_vehicle_spiderbot_rocket_lifetime;
-float autocvar_g_vehicle_spiderbot_rocket_noise;
-float autocvar_g_vehicle_spiderbot_rocket_radius;
-float autocvar_g_vehicle_spiderbot_rocket_refire;
-float autocvar_g_vehicle_spiderbot_rocket_reload;
-float autocvar_g_vehicle_spiderbot_rocket_speed;
-float autocvar_g_vehicle_spiderbot_rocket_turnrate;
-float autocvar_g_vehicle_spiderbot_shield;
-float autocvar_g_vehicle_spiderbot_speed_stop;
-float autocvar_g_vehicle_spiderbot_speed_strafe;
-float autocvar_g_vehicle_spiderbot_speed_walk;
-float autocvar_g_vehicle_spiderbot_turnspeed;
float autocvar_g_waypointeditor;
float autocvar_g_waypoints_for_items;
float autocvar_g_waypointsprite_deadlifetime;
float autocvar_welcome_message_time;
float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
float autocvar_g_trueaim_minrange;
+float autocvar_g_debug_defaultsounds;
+entity ka_ball;
// traces multiple trajectories to find one that will impact the target
// 'end' vector is the place it aims for,
// returns TRUE only if it hit targ (don't target non-solid entities)
float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, float shotspeed, float shotspeedupward, float maxtime, float shotdelay, entity ignore)
{
local float c, savesolid, shottime;
- local vector dir, end, v;
+ local vector dir, end, v, o;
if (shotspeed < 1)
return FALSE; // could cause division by zero if calculated
if (targ.solid < SOLID_BBOX) // SOLID_NOT and SOLID_TRIGGER
setsize(tracetossent, m1, m2);
savesolid = targ.solid;
targ.solid = SOLID_NOT;
- shottime = ((vlen(targ.origin - org) / shotspeed) + shotdelay);
- v = targ.velocity * shottime + targ.origin;
- tracebox(targ.origin, targ.mins, targ.maxs, v, FALSE, targ);
+ o = (targ.absmin + targ.absmax) * 0.5;
+ shottime = ((vlen(o - org) / shotspeed) + shotdelay);
+ v = targ.velocity * shottime + o;
+ tracebox(o, targ.mins, targ.maxs, v, FALSE, targ);
v = trace_endpos;
end = v + (targ.mins + targ.maxs) * 0.5;
if ((vlen(end - org) / shotspeed + 0.2) > maxtime)
{
if (e == self)
return FALSE;
- if (teams_matter)
+ if (teamplay)
if (e.team != 0)
return FALSE;
}
if(e.freezetag_frozen)
return FALSE;
- if(teams_matter)
+ // If neither player has ball then don't attack unless the ball is on the
+ // ground.
+ if (g_keepaway)
+ if (!e.ballcarried && !self.ballcarried && ka_ball.owner)
+ return FALSE;
+
+ if(teamplay)
{
if(e.team==0)
return FALSE;
float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float applygravity)
{
- local float f, r;
+ local float f, r, hf, distanceratio;
local vector v;
/*
eprint(self);
dprint(", ", ftos(applygravity));
dprint(");\n");
*/
+
+ hf = self.dphitcontentsmask;
+ self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
+
shotspeed *= g_weaponspeedfactor;
shotspeedupward *= g_weaponspeedfactor;
if (!shotspeed)
shotorg = self.origin + self.view_ofs;
shotdir = v_forward;
v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency);
- local float distanceratio;
- distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
+ distanceratio = sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
distanceratio = bound(0,distanceratio,1);
r = (autocvar_bot_ai_aimskill_firetolerance_maxdegrees-autocvar_bot_ai_aimskill_firetolerance_mindegrees)
* (1-distanceratio) + autocvar_bot_ai_aimskill_firetolerance_mindegrees;
if (applygravity && self.bot_aimtarg)
{
if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self))
+ {
+ self.dphitcontentsmask = hf;
return FALSE;
+ }
+
f = bot_aimdir(findtrajectory_velocity - shotspeedupward * '0 0 1', r);
}
else
if (trace_fraction < 1)
if (trace_ent != self.enemy)
if (!bot_shouldattack(trace_ent))
+ {
+ self.dphitcontentsmask = hf;
return FALSE;
+ }
}
//if (r > maxshottime * shotspeed)
// return FALSE;
+ self.dphitcontentsmask = hf;
return TRUE;
};
local float besttime;
local entity best, head;
- if(teams_matter)
+ if(teamplay)
{
bot_removefromlargestteam();
return;
head.totalfrags_lastcheck = head.totalfrags;
}
+void bot_calculate_stepheightvec(void)
+{
+ stepheightvec = autocvar_sv_stepheight * '0 0 1';
+ jumpstepheightvec = stepheightvec +
+ ((autocvar_sv_jumpvelocity * autocvar_sv_jumpvelocity) / (2 * autocvar_sv_gravity)) * '0 0 0.85';
+ // 0.75 factor is for safety to make the jumps easy
+}
+
void bot_serverframe()
{
float realplayers, bots, activerealplayers;
if (time < 2)
return;
- stepheightvec = autocvar_sv_stepheight * '0 0 1';
+ bot_calculate_stepheightvec();
bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
if(time > autoskill_nextthink)
// But don't remove bots immediately on level change, as the real players
// usually haven't rejoined yet
bots_would_leave = FALSE;
- if (teams_matter && autocvar_bot_vs_human && (c3==-1 && c4==-1))
+ if (teamplay && autocvar_bot_vs_human && (c3==-1 && c4==-1))
bots = min(ceil(fabs(autocvar_bot_vs_human) * activerealplayers), maxclients - realplayers);
else if ((realplayers || autocvar_bot_join_empty || (currentbots > 0 && time < 5)))
{
float c1, c2, c3, c4;
void CheckAllowedTeams(entity for_whom); void GetTeamCounts(entity other);
float JoinBestTeam(entity pl, float only_return_best, float forcebestteam);
+
+void bot_calculate_stepheightvec(void);
#include "role_ctf.qc"
#include "role_onslaught.qc"
#include "role_keyhunt.qc"
+#include "role_freezetag.qc"
+#include "role_keepaway.qc"
+#include "role_assault.qc"
#include "roles.qc"
void havocbot_ai()
local vector now,v,next;//,heading;
local float aimdistance,skillblend,distanceblend,blend;
- next = now = self.goalcurrent.origin - (self.origin + self.view_ofs);
+ next = now = ( (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5) - (self.origin + self.view_ofs);
aimdistance = vlen(now);
//heading = self.velocity;
//dprint(self.goalstack01.classname,etos(self.goalstack01),"\n");
self.goalstack01 != self && self.goalstack01 != world && self.aistatus & AI_STATUS_RUNNING == 0 &&
!(self.goalcurrent.wpflags & WAYPOINTFLAG_TELEPORT)
)
- next = self.goalstack01.origin - (self.origin + self.view_ofs);
+ next = ((self.goalstack01.absmin + self.goalstack01.absmax) * 0.5) - (self.origin + self.view_ofs);
skillblend=bound(0,(skill+self.bot_moveskill-2.5)*0.5,1); //lower skill player can't preturn
distanceblend=bound(0,aimdistance/autocvar_bot_ai_keyboard_distance,1);
local float bunnyhopdistance;
local vector deviation;
local float maxspeed;
+ vector gco, gno;
if(autocvar_g_midair)
return;
- // Don't jump when using some weapons
- /*
+ // Don't jump when attacking
if(self.aistatus & AI_STATUS_ATTACKING)
- if(self.weapon == WEP_RIFLE)
return;
if(self.goalcurrent.classname == "player")
return;
- */
maxspeed = autocvar_sv_maxspeed;
self.bot_timelastseengoal = 0;
}
- bunnyhopdistance = vlen(self.origin - self.goalcurrent.origin);
+ gco = (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5;
+ bunnyhopdistance = vlen(self.origin - gco);
// Run only to visible goals
if(self.flags & FL_ONGROUND)
if(self.aistatus & AI_STATUS_ROAMING)
if(self.goalcurrent.classname=="waypoint")
if not(self.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL)
- if(fabs(self.goalcurrent.origin_z - self.origin_z) < self.maxs_z - self.mins_z)
+ if(fabs(gco_z - self.origin_z) < self.maxs_z - self.mins_z)
if(self.goalstack01!=world)
{
- deviation = vectoangles(self.goalstack01.origin - self.origin) - vectoangles(self.goalcurrent.origin - self.origin);
+ gno = (self.goalstack01.absmin + self.goalstack01.absmax) * 0.5;
+ deviation = vectoangles(gno - self.origin) - vectoangles(gco - self.origin);
while (deviation_y < -180) deviation_y = deviation_y + 360;
while (deviation_y > 180) deviation_y = deviation_y - 360;
if(fabs(deviation_y) < 20)
- if(bunnyhopdistance < vlen(self.origin - self.goalstack01.origin))
- if(fabs(self.goalstack01.origin_z - self.goalcurrent.origin_z) < self.maxs_z - self.mins_z)
+ if(bunnyhopdistance < vlen(self.origin - gno))
+ if(fabs(gno_z - gco_z) < self.maxs_z - self.mins_z)
{
- if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > autocvar_bot_ai_bunnyhop_startdistance)
+ if(vlen(gco - gno) > autocvar_bot_ai_bunnyhop_startdistance)
if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
{
checkdistance = FALSE;
self.bot_timelastseengoal = 0;
}
+#if 0
// Release jump button
if(!cvar("sv_pogostick"))
if(self.flags & FL_ONGROUND == 0)
}
}
+#endif
};
void havocbot_movetogoal()
local vector evadelava;
local float s;
local float maxspeed;
+ local vector gco;
//local float dist;
local vector dodge;
//if (self.goalentity)
float db, v, d;
vector dxy;
- dxy = self.origin - self.goalcurrent.origin; dxy_z = 0;
+ dxy = self.origin - ( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ); dxy_z = 0;
d = vlen(dxy);
v = vlen(self.velocity - self.velocity_z * '0 0 1');
db = (pow(v,2) / (autocvar_g_jetpack_acceleration_side * 2)) + 100;
// Handling of jump pads
if(self.jumppadcount)
{
- // If got stuck on the jump pad try to reach the farthest visible item
+ // If got stuck on the jump pad try to reach the farthest visible waypoint
if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
{
if(fabs(self.velocity_z)<50)
local entity head, newgoal;
local float distance, bestdistance;
- for (head = findchainfloat(bot_pickup, TRUE); head; head = head.chain)
+ for (head = findchain(classname, "waypoint"); head; head = head.chain)
{
- if(head.classname=="worldspawn")
- continue;
distance = vlen(head.origin - self.origin);
if(distance>1000)
continue;
- traceline(self.origin + self.view_ofs , head.origin, TRUE, world);
+ traceline(self.origin + self.view_ofs , ( ( head.absmin + head.absmax ) * 0.5 ), TRUE, world);
if(trace_fraction<1)
continue;
{
if(self.velocity_z>0)
{
- local float threshold;
+ float threshold, sxy;
+ vector velxy = self.velocity; velxy_z = 0;
+ sxy = vlen(velxy);
threshold = maxspeed * 0.2;
- if(fabs(self.velocity_x) < threshold && fabs(self.velocity_y) < threshold)
+ if(sxy < threshold)
{
- dprint("Warning: ", self.netname, " got stuck on a jumppad, trying to get out of it now\n");
+ dprint("Warning: ", self.netname, " got stuck on a jumppad (velocity in xy is ", ftos(sxy), "), trying to get out of it now\n");
self.aistatus |= AI_STATUS_OUT_JUMPPAD;
}
return;
if(self.goalcurrent==world)
dir = v_forward;
else
- dir = normalize(self.goalcurrent.origin - self.origin);
+ dir = normalize(( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ) - self.origin);
local vector xyvelocity = self.velocity; xyvelocity_z = 0;
local float xyspeed = xyvelocity * dir;
return;
}
+
if(autocvar_bot_debug_goalstack)
debuggoalstack();
dir = normalize(diff);
flatdir = diff;flatdir_z = 0;
flatdir = normalize(flatdir);
+ gco = (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5;
//if (self.bot_dodgevector_time < time)
{
}
else
{
- if(self.velocity_z >= 0 && !(self.watertype == CONTENT_WATER && self.goalcurrent.origin_z < self.origin_z) &&
+ if(self.velocity_z >= 0 && !(self.watertype == CONTENT_WATER && gco_z < self.origin_z) &&
( !(self.waterlevel == WATERLEVEL_WETFEET && self.watertype == CONTENT_WATER) || self.aistatus & AI_STATUS_OUT_WATER))
self.BUTTON_JUMP = TRUE;
else
if (trace_plane_normal_z < 0.7)
{
s = trace_fraction;
- tracebox(self.origin + '0 0 16', self.mins, self.maxs, self.origin + self.velocity * 0.2 + '0 0 16', FALSE, self);
+ tracebox(self.origin + stepheightvec, self.mins, self.maxs, self.origin + self.velocity * 0.2 + stepheightvec, FALSE, self);
if (trace_fraction < s + 0.01)
if (trace_plane_normal_z < 0.7)
{
s = trace_fraction;
- tracebox(self.origin + '0 0 48', self.mins, self.maxs, self.origin + self.velocity * 0.2 + '0 0 48', FALSE, self);
+ tracebox(self.origin + jumpstepheightvec, self.mins, self.maxs, self.origin + self.velocity * 0.2 + jumpstepheightvec, FALSE, self);
if (trace_fraction > s)
self.BUTTON_JUMP = 1;
}
// (only when the bot is on the ground or jumping intentionally)
self.aistatus &~= AI_STATUS_DANGER_AHEAD;
- if(trace_fraction == 1 && self.jumppadcount == 0)
+ if(trace_fraction == 1 && self.jumppadcount == 0 && !self.goalcurrent.wphardwired )
if(self.flags & FL_ONGROUND || self.aistatus & AI_STATUS_RUNNING || self.BUTTON_JUMP == TRUE)
{
// Look downwards
if(tracebox_hits_trigger_hurt(dst_ahead, self.mins, self.maxs, trace_endpos))
{
// Remove dangerous dynamic goals from stack
- if (self.goalcurrent.classname == "player" || self.goalcurrent.classname == "droppedweapon")
- navigation_poproute();
- // try to stop
- flatdir = '0 0 0';
- evadeobstacle = normalize(self.velocity) * -1;
+ dprint("bot ", self.netname, " avoided the goal ", self.goalcurrent.classname, " ", etos(self.goalcurrent), " because it led to a dangerous path; goal stack cleared\n");
+ navigation_clearroute();
+ return;
}
}
}
dodge = havocbot_dodge();
dodge = dodge * bound(0,0.5+(skill+self.bot_dodgeskill)*0.1,1);
evadelava = evadelava * bound(1,3-(skill+self.bot_dodgeskill),3); //Noobs fear lava a lot and take more distance from it
- traceline(self.origin, self.enemy.origin, TRUE, world);
+ traceline(self.origin, ( ( self.enemy.absmin + self.enemy.absmax ) * 0.5 ), TRUE, world);
if(trace_ent.classname == "player")
dir = dir * bound(0,(skill+self.bot_dodgeskill)/7,1);
void havocbot_chooseenemy()
{
local entity head, best, head2;
- local float rating, bestrating, i, f;
+ local float rating, bestrating, i, hf;
local vector eye, v;
if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
{
// and not really really far away
// and we're not severely injured
// then keep tracking for a half second into the future
- traceline(self.origin+self.view_ofs, self.enemy.origin+self.enemy.view_ofs*0.5,FALSE,world);
+ traceline(self.origin+self.view_ofs, ( self.enemy.absmin + self.enemy.absmax ) * 0.5,FALSE,world);
if (trace_ent == self.enemy || trace_fraction == 1)
- if (vlen(self.enemy.origin - self.origin) < 1000)
+ if (vlen((( self.enemy.absmin + self.enemy.absmax ) * 0.5) - self.origin) < 1000)
if (self.health > 30)
{
// remain tracking him for a shot while (case he went after a small corner or pilar
- self.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
+ self.havocbot_chooseenemy_finished = time + 0.5;
return;
}
// enemy isn't visible, or is far away, or we're injured severely
bestrating = 100000000;
head = head2 = findchainfloat(bot_attack, TRUE);
+ // Backup hit flags
+ hf = self.dphitcontentsmask;
+
// Search for enemies, if no enemy can be seen directly try to look through transparent objects
+
+ self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
+
for(;;)
{
while (head)
break;
// Set flags to see through transparent objects
- f = self.dphitcontentsmask;
- self.dphitcontentsmask = DPCONTENTS_OPAQUE;
+ self.dphitcontentsmask |= DPCONTENTS_OPAQUE;
head = head2;
++i;
}
- // Restore hit flags if needed
- if(i)
- self.dphitcontentsmask = f;
+ // Restore hit flags
+ self.dphitcontentsmask = hf;
self.enemy = best;
self.havocbot_stickenemy = TRUE;
enemyvel = self.enemy.velocity;
if (!self.enemy.waterlevel)
enemyvel_z = 0;
- lag_additem(time + self.ping, 0, 0, self.enemy, self.origin, selfvel, self.enemy.origin, enemyvel);
+ lag_additem(time + self.ping, 0, 0, self.enemy, self.origin, selfvel, (self.enemy.absmin + self.enemy.absmax) * 0.5, enemyvel);
}
else
- lag_additem(time + self.ping, 0, 0, world, self.origin, selfvel, self.goalcurrent.origin, '0 0 0');
+ lag_additem(time + self.ping, 0, 0, world, self.origin, selfvel, ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5, '0 0 0');
};
float havocbot_moveto_refresh_route()
debuggoalstack();
// Heading
- local vector dir = self.goalcurrent.origin - (self.origin + self.view_ofs);
+ local vector dir = ( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ) - (self.origin + self.view_ofs);
dir_z = 0;
bot_aimdir(dir, -1);
--- /dev/null
+#define HAVOCBOT_AST_ROLE_NONE 0
+#define HAVOCBOT_AST_ROLE_DEFENSE 2
+#define HAVOCBOT_AST_ROLE_OFFENSE 4
+
+.float havocbot_role_flags;
+.float havocbot_attack_time;
+
+.void() havocbot_role;
+.void() havocbot_previous_role;
+
+void() havocbot_role_ast_defense;
+void() havocbot_role_ast_offense;
+.entity havocbot_ast_target;
+
+void(entity bot) havocbot_ast_reset_role;
+
+void(float ratingscale, vector org, float sradius) havocbot_goalrating_items;
+void(float ratingscale, vector org, float sradius) havocbot_goalrating_enemyplayers;
+
+void havocbot_goalrating_ast_targets(float ratingscale)
+{
+ entity ad, best, pl, wp, tod;
+ float radius, found, bestvalue, c;
+ vector p;
+
+ ad = findchain(classname, "func_assault_destructible");
+
+ for (; ad; ad = ad.chain)
+ {
+ if (ad.target == "")
+ continue;
+
+ if not(ad.bot_attack)
+ continue;
+
+ found = FALSE;
+ for(tod = world; (tod = find(tod, targetname, ad.target)); )
+ {
+ if(tod.classname == "target_objective_decrease")
+ {
+ if(tod.enemy.health > 0 && tod.enemy.health < ASSAULT_VALUE_INACTIVE)
+ {
+ // dprint(etos(ad),"\n");
+ found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if(!found)
+ {
+ /// dprint("target not found\n");
+ continue;
+ }
+ /// dprint("target #", etos(ad), " found\n");
+
+
+ p = 0.5 * (ad.absmin + ad.absmax);
+ // dprint(vtos(ad.origin), " ", vtos(ad.absmin), " ", vtos(ad.absmax),"\n");
+ // te_knightspike(p);
+ // te_lightning2(world, '0 0 0', p);
+
+ // Find and rate waypoints around it
+ found = FALSE;
+ best = world;
+ bestvalue = 99999999999;
+ for(radius=0; radius<1500 && !found; radius+=500)
+ {
+ for(wp=findradius(p, radius); wp; wp=wp.chain)
+ {
+ if(!(wp.wpflags & WAYPOINTFLAG_GENERATED))
+ if(wp.classname=="waypoint")
+ if(checkpvs(wp.origin, ad))
+ {
+ found = TRUE;
+ if(wp.cnt<bestvalue)
+ {
+ best = wp;
+ bestvalue = wp.cnt;
+ }
+ }
+ }
+ }
+
+ if(best)
+ {
+ /// dprint("waypoints around target were found\n");
+ // te_lightning2(world, '0 0 0', best.origin);
+ // te_knightspike(best.origin);
+
+ navigation_routerating(best, ratingscale, 4000);
+ best.cnt += 1;
+
+ self.havocbot_attack_time = 0;
+
+ if(checkpvs(self.view_ofs,ad))
+ if(checkpvs(self.view_ofs,best))
+ {
+ // dprint("increasing attack time for this target\n");
+ self.havocbot_attack_time = time + 2;
+ }
+ }
+ }
+}
+
+void havocbot_role_ast_offense()
+{
+ if(self.deadflag != DEAD_NO)
+ {
+ self.havocbot_attack_time = 0;
+ havocbot_ast_reset_role(self);
+ return;
+ }
+
+ // Set the role timeout if necessary
+ if (!self.havocbot_role_timeout)
+ self.havocbot_role_timeout = time + 120;
+
+ if (time > self.havocbot_role_timeout)
+ {
+ havocbot_ast_reset_role(self);
+ return;
+ }
+
+ if(self.havocbot_attack_time>time)
+ return;
+
+ if (self.bot_strategytime < time)
+ {
+ navigation_goalrating_start();
+ havocbot_goalrating_enemyplayers(20000, self.origin, 650);
+ havocbot_goalrating_ast_targets(20000);
+ havocbot_goalrating_items(15000, self.origin, 10000);
+ navigation_goalrating_end();
+
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+ }
+};
+
+void havocbot_role_ast_defense()
+{
+ if(self.deadflag != DEAD_NO)
+ {
+ self.havocbot_attack_time = 0;
+ havocbot_ast_reset_role(self);
+ return;
+ }
+
+ // Set the role timeout if necessary
+ if (!self.havocbot_role_timeout)
+ self.havocbot_role_timeout = time + 120;
+
+ if (time > self.havocbot_role_timeout)
+ {
+ havocbot_ast_reset_role(self);
+ return;
+ }
+
+ if(self.havocbot_attack_time>time)
+ return;
+
+ if (self.bot_strategytime < time)
+ {
+ navigation_goalrating_start();
+ havocbot_goalrating_enemyplayers(20000, self.origin, 3000);
+ havocbot_goalrating_ast_targets(20000);
+ havocbot_goalrating_items(15000, self.origin, 10000);
+ navigation_goalrating_end();
+
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+ }
+};
+
+void havocbot_role_ast_setrole(entity bot, float role)
+{
+ switch(role)
+ {
+ case HAVOCBOT_AST_ROLE_DEFENSE:
+ bot.havocbot_role = havocbot_role_ast_defense;
+ bot.havocbot_role_flags = HAVOCBOT_AST_ROLE_DEFENSE;
+ bot.havocbot_role_timeout = 0;
+ break;
+ case HAVOCBOT_AST_ROLE_OFFENSE:
+ bot.havocbot_role = havocbot_role_ast_offense;
+ bot.havocbot_role_flags = HAVOCBOT_AST_ROLE_OFFENSE;
+ bot.havocbot_role_timeout = 0;
+ break;
+ }
+};
+
+void havocbot_ast_reset_role(entity bot)
+{
+ local entity head;
+ local float c;
+
+ if(self.deadflag != DEAD_NO)
+ return;
+
+ if(bot.team==assault_attacker_team)
+ havocbot_role_ast_setrole(bot, HAVOCBOT_AST_ROLE_OFFENSE);
+ else
+ havocbot_role_ast_setrole(bot, HAVOCBOT_AST_ROLE_DEFENSE);
+};
+
+void havocbot_chooserole_ast()
+{
+ havocbot_ast_reset_role(self);
+};
float havocbot_ctf_teamcount(entity bot, vector org, float radius)
{
- if not(teams_matter)
+ if not(teamplay)
return 0;
float c;
if(mf.cnt == FLAG_BASE)
return;
- navigation_routerating(mf, ratingscale, 10000);
+ if(mf.tag_entity)
+ navigation_routerating(mf.tag_entity, ratingscale, 10000);
};
void havocbot_goalrating_ctf_droppedflags(float ratingscale, vector org, float radius)
bot.havocbot_role = havocbot_role_ctf_carrier;
bot.havocbot_role_timeout = 0;
bot.havocbot_cantfindflag = time + 10;
+ bot.bot_strategytime = 0;
break;
case HAVOCBOT_CTF_ROLE_DEFENSE:
dprint("defense");
bot.havocbot_previous_role = bot.havocbot_role;
bot.havocbot_role = havocbot_role_ctf_retriever;
bot.havocbot_role_timeout = time + 10;
+ bot.bot_strategytime = 0;
break;
case HAVOCBOT_CTF_ROLE_ESCORT:
dprint("escort");
bot.havocbot_previous_role = bot.havocbot_role;
bot.havocbot_role = havocbot_role_ctf_escort;
bot.havocbot_role_timeout = time + 30;
+ bot.bot_strategytime = 0;
break;
}
dprint("\n");
--- /dev/null
+void() havocbot_role_ft_freeing;
+void() havocbot_role_ft_offense;
+
+void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius)
+{
+ local entity head;
+ float distance;
+
+ FOR_EACH_PLAYER(head)
+ {
+ if ((head != self) && (head.team == self.team))
+ {
+ if (head.freezetag_frozen)
+ {
+ distance = vlen(head.origin - org);
+ if (distance > sradius)
+ continue;
+ navigation_routerating(head, ratingscale, 2000);
+ }
+ else
+ {
+ // If teamate is not frozen still seek them out as fight better
+ // in a group.
+ navigation_routerating(head, ratingscale/3, 2000);
+ }
+ }
+ }
+};
+
+void havocbot_role_ft_offense()
+{
+ local entity head;
+ float unfrozen;
+
+ if(self.deadflag != DEAD_NO)
+ return;
+
+ if (!self.havocbot_role_timeout)
+ self.havocbot_role_timeout = time + random() * 10 + 20;
+
+ // Count how many players on team are unfrozen.
+ unfrozen = 0;
+ FOR_EACH_PLAYER(head)
+ {
+ if ((head.team == self.team) && (!head.freezetag_frozen))
+ unfrozen++;
+ }
+
+ // If only one left on team or if role has timed out then start trying to free players.
+ if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout))
+ {
+ dprint("changing role to freeing\n");
+ self.havocbot_role = havocbot_role_ft_freeing;
+ self.havocbot_role_timeout = 0;
+ return;
+ }
+
+ if (time > self.bot_strategytime)
+ {
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+ navigation_goalrating_start();
+ havocbot_goalrating_items(10000, self.origin, 10000);
+ havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+ havocbot_goalrating_freeplayers(9000, self.origin, 10000);
+ //havocbot_goalrating_waypoints(1, self.origin, 1000);
+ navigation_goalrating_end();
+ }
+};
+
+void havocbot_role_ft_freeing()
+{
+ if(self.deadflag != DEAD_NO)
+ return;
+
+ if (!self.havocbot_role_timeout)
+ self.havocbot_role_timeout = time + random() * 10 + 20;
+
+ if (time > self.havocbot_role_timeout)
+ {
+ dprint("changing role to offense\n");
+ self.havocbot_role = havocbot_role_ft_offense;
+ self.havocbot_role_timeout = 0;
+ return;
+ }
+
+ if (time > self.bot_strategytime)
+ {
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+ navigation_goalrating_start();
+ havocbot_goalrating_items(8000, self.origin, 10000);
+ havocbot_goalrating_enemyplayers(10000, self.origin, 10000);
+ havocbot_goalrating_freeplayers(20000, self.origin, 10000);
+ //havocbot_goalrating_waypoints(1, self.origin, 1000);
+ navigation_goalrating_end();
+ }
+};
+
+void havocbot_chooserole_ft()
+{
+ if(self.deadflag != DEAD_NO)
+ return;
+
+ if (random() < 0.5)
+ self.havocbot_role = havocbot_role_ft_freeing;
+ else
+ self.havocbot_role = havocbot_role_ft_offense;
+};
--- /dev/null
+void() havocbot_role_ka_carrier;
+void() havocbot_role_ka_collector;
+void() havocbot_chooserole_ka;
+
+entity ka_ball;
+
+// Keepaway
+// If you don't have the ball, get it; if you do, kill people.
+
+void havocbot_goalrating_ball(float ratingscale, vector org)
+{
+ local float t;
+ local entity ball_owner;
+ ball_owner = ka_ball.owner;
+
+ if (ball_owner == self)
+ return;
+
+ // If ball is carried by player then hunt them down.
+ if (ball_owner)
+ {
+ t = (self.health + self.armorvalue) / (ball_owner.health + ball_owner.armorvalue);
+ navigation_routerating(ball_owner, t * ratingscale, 2000);
+ }
+
+ // Ball has been dropped so collect.
+ navigation_routerating(ka_ball, ratingscale, 2000);
+};
+
+void havocbot_role_ka_carrier()
+{
+ if (self.deadflag != DEAD_NO)
+ return;
+
+ if (time > self.bot_strategytime)
+ {
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+ navigation_goalrating_start();
+ havocbot_goalrating_items(10000, self.origin, 10000);
+ havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+ //havocbot_goalrating_waypoints(1, self.origin, 1000);
+ navigation_goalrating_end();
+ }
+
+ if (!self.ballcarried)
+ {
+ self.havocbot_role = havocbot_role_ka_collector;
+ self.bot_strategytime = 0;
+ }
+};
+
+void havocbot_role_ka_collector()
+{
+ if (self.deadflag != DEAD_NO)
+ return;
+
+ if (time > self.bot_strategytime)
+ {
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+ navigation_goalrating_start();
+ havocbot_goalrating_items(10000, self.origin, 10000);
+ havocbot_goalrating_enemyplayers(1000, self.origin, 10000);
+ havocbot_goalrating_ball(20000, self.origin);
+ navigation_goalrating_end();
+ }
+
+ if (self.ballcarried)
+ {
+ self.havocbot_role = havocbot_role_ka_carrier;
+ self.bot_strategytime = 0;
+ }
+};
+
+void havocbot_chooserole_ka()
+{
+ if (self.ballcarried)
+ self.havocbot_role = havocbot_role_ka_carrier;
+ else
+ self.havocbot_role = havocbot_role_ka_collector;
+};
local entity head;
local entity player;
local float rating, d, discard, distance, friend_distance, enemy_distance;
+ vector o;
ratingscale = ratingscale * 0.0001; // items are rated around 10000 already
head = findchainfloat(bot_pickup, TRUE);
while (head)
{
- distance = vlen(head.origin - org);
+ o = (head.absmin + head.absmax) * 0.5;
+ distance = vlen(o - org);
friend_distance = 10000; enemy_distance = 10000;
rating = 0;
// Check if the item can be picked up safely
if(head.classname == "droppedweapon")
{
- traceline(head.origin, head.origin + '0 0 -1500', TRUE, world);
+ traceline(o, o + '0 0 -1500', TRUE, world);
d = pointcontents(trace_endpos + '0 0 1');
if(d & CONTENT_WATER || d & CONTENT_SLIME || d & CONTENT_LAVA)
}
}
- if(teams_matter)
+ if(teamplay)
{
discard = FALSE;
if ( self == player || player.deadflag )
continue;
- d = vlen(player.origin - head.origin); // distance between player and item
+ d = vlen(player.origin - o); // distance between player and item
if ( player.team == self.team )
{
head = findchain(classname, "dom_controlpoint");
while (head)
{
- if (vlen(head.origin - org) < sradius)
+ if (vlen(( ( head.absmin + head.absmax ) * 0.5 ) - org) < sradius)
{
if(head.cnt > -1) // this is just being fought for
navigation_routerating(head, ratingscale, 5000);
{
local entity head;
local float t, noteam, distance;
- noteam = ((self.team == 0) || !teams_matter); // fteqcc sucks
+ noteam = ((self.team == 0) || !teamplay); // fteqcc sucks
if (autocvar_bot_nofire)
return;
if (distance < 100 || distance > sradius)
continue;
+ if (head.freezetag_frozen)
+ continue;
+
if(g_minstagib)
if(head.items & IT_STRENGTH)
continue;
continue;
}
+ // TODO: rate waypoints near the targetted player at that moment, instead of the player itself
+ // adding a player as a goal seems to be quite dangerous, especially on space maps
+ // remove hack in navigation_poptouchedgoals() after performing this change
+
t = (self.health + self.armorvalue ) / (head.health + head.armorvalue );
navigation_routerating(head, t * ratingscale, 2000);
}
}
};
-// Keepaway
-// If you don't have the ball, get it; if you do, kill people.
-void havocbot_role_ka()
-{
- if(self.deadflag != DEAD_NO)
- return;
-
- if (self.bot_strategytime < time)
- {
- self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
- navigation_goalrating_start();
- havocbot_goalrating_items(10000, self.origin, 10000);
- havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
- //havocbot_goalrating_waypoints(1, self.origin, 1000);
- navigation_goalrating_end();
- }
-}
-
void havocbot_chooserole_dm()
{
self.havocbot_role = havocbot_role_dm;
self.havocbot_role = havocbot_role_dom;
};
-void havocbot_chooserole_ka()
-{
- self.havocbot_role = havocbot_role_ka;
-}
-
void havocbot_chooserole()
{
dprint("choosing a role...\n");
havocbot_chooserole_ons();
else if (g_keepaway)
havocbot_chooserole_ka();
+ else if (g_freezetag)
+ havocbot_chooserole_ft();
+ else if (g_assault)
+ havocbot_chooserole_ast();
else // assume anything else is deathmatch
havocbot_chooserole_dm();
};
// hit something
if (trace_fraction < 1)
{
- // check if we can walk over this obstacle
+ // check if we can walk over this obstacle, possibly by jumpstepping
tracebox(org + stepheightvec, m1, m2, move + stepheightvec, movemode, e);
if (trace_fraction < 1 || trace_startsolid)
{
- if(autocvar_bot_debug_tracewalk)
- debugnodestatus(trace_endpos, DEBUG_NODE_WARNING);
-
- // check for doors
- traceline( org, move, movemode, e);
- if ( trace_ent.classname == "door_rotating" || trace_ent.classname == "door")
+ tracebox(org + jumpstepheightvec, m1, m2, move + jumpstepheightvec, movemode, e);
+ if (trace_fraction < 1 || trace_startsolid)
{
- local vector nextmove;
- move = trace_endpos;
- while(trace_ent.classname == "door_rotating" || trace_ent.classname == "door")
+ if(autocvar_bot_debug_tracewalk)
+ debugnodestatus(trace_endpos, DEBUG_NODE_WARNING);
+
+ // check for doors
+ traceline( org, move, movemode, e);
+ if ( trace_ent.classname == "door_rotating" || trace_ent.classname == "door")
{
- nextmove = move + (dir * stepdist);
- traceline( move, nextmove, movemode, e);
- move = nextmove;
+ local vector nextmove;
+ move = trace_endpos;
+ while(trace_ent.classname == "door_rotating" || trace_ent.classname == "door")
+ {
+ nextmove = move + (dir * stepdist);
+ traceline( move, nextmove, movemode, e);
+ move = nextmove;
+ }
}
- }
- else
- {
- if(autocvar_bot_debug_tracewalk)
- debugnodestatus(trace_endpos, DEBUG_NODE_FAIL);
+ else
+ {
+ if(autocvar_bot_debug_tracewalk)
+ debugnodestatus(trace_endpos, DEBUG_NODE_FAIL);
- //print("tracewalk: ", vtos(start), " hit something when trying to reach ", vtos(end), "\n");
- //te_explosion(trace_endpos);
- //print(ftos(e.dphitcontentsmask), "\n");
- return FALSE; // failed
+ //print("tracewalk: ", vtos(start), " hit something when trying to reach ", vtos(end), "\n");
+ //te_explosion(trace_endpos);
+ //print(ftos(e.dphitcontentsmask), "\n");
+ return FALSE; // failed
+ }
}
+ else
+ move = trace_endpos;
}
else
move = trace_endpos;
void navigation_routerating(entity e, float f, float rangebias)
{
entity nwp;
+ vector o;
if (!e)
return;
+ if(e.blacklisted)
+ return;
+
+ o = (e.absmin + e.absmax) * 0.5;
+
//print("routerating ", etos(e), " = ", ftos(f), " - ", ftos(rangebias), "\n");
// Evaluate path using jetpack
if(g_jetpack)
if(self.items & IT_JETPACK)
if(autocvar_bot_ai_navigation_jetpack)
- if(vlen(self.origin - e.origin) > autocvar_bot_ai_navigation_jetpack_mindistance)
+ if(vlen(self.origin - o) > autocvar_bot_ai_navigation_jetpack_mindistance)
{
vector pointa, pointb;
pointa = trace_endpos - '0 0 1';
// Point B
- traceline(e.origin, e.origin + '0 0 65535', MOVE_NORMAL, e);
+ traceline(o, o + '0 0 65535', MOVE_NORMAL, e);
pointb = trace_endpos - '0 0 1';
// Can I see these two points from the sky?
}
else
{
+ float search;
+
+ search = TRUE;
+
+ if(e.flags & FL_ITEM)
+ {
+ if not(e.flags & FL_WEAPON)
+ if(e.nearestwaypoint)
+ search = FALSE;
+ }
+ else if (e.flags & FL_WEAPON)
+ {
+ if(e.classname != "droppedweapon")
+ if(e.nearestwaypoint)
+ search = FALSE;
+ }
+
+ if(search)
if (time > e.nearestwaypointtimeout)
{
nwp = navigation_findnearestwaypoint(e, TRUE);
if(nwp)
e.nearestwaypoint = nwp;
else
+ {
dprint("FAILED to find a nearest waypoint to '", e.classname, "' #", etos(e), "\n");
+ if(e.flags & FL_ITEM)
+ e.blacklisted = TRUE;
+ else if (e.flags & FL_WEAPON)
+ {
+ if(e.classname != "droppedweapon")
+ e.blacklisted = TRUE;
+ }
+
+ if(e.blacklisted)
+ {
+ dprint("The entity '", e.classname, "' is going to be excluded from path finding during this match\n");
+ return;
+ }
+ }
+
// TODO: Cleaner solution, probably handling this timeout from ctf.qc
if(e.classname=="item_flag_team")
e.nearestwaypointtimeout = time + 2;
{
//te_wizspike(nwp.wpnearestpoint);
// dprint(e.classname, " ", ftos(f), "/(1+", ftos((nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint))), "/", ftos(rangebias), ") = ");
- f = f * rangebias / (rangebias + (nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint)));
+ f = f * rangebias / (rangebias + (nwp.wpcost + vlen(o - nwp.wpnearestpoint)));
//dprint("considering ", e.classname, " (with rating ", ftos(f), ")\n");
//dprint(ftos(f));
if (navigation_bestrating < f)
return TRUE;
// if it can reach the goal there is nothing more to do
- if (tracewalk(self, startposition, PL_MIN, PL_MAX, e.origin, bot_navigation_movemode))
+ if (tracewalk(self, startposition, PL_MIN, PL_MAX, (e.absmin + e.absmax) * 0.5, bot_navigation_movemode))
return TRUE;
// see if there are waypoints describing a path to the item
}
}
+ // If for some reason the bot is closer to the next goal, pop the current one
+ if(self.goalstack01)
+ if(vlen(self.goalcurrent.origin - self.origin) > vlen(self.goalstack01.origin - self.origin))
+ if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
+ if(tracewalk(self, self.origin, self.mins, self.maxs, (self.goalstack01.absmin + self.goalstack01.absmax) * 0.5, bot_navigation_movemode))
+ {
+ /// dprint("path optimized for ", self.netname, ", removed a goal from the queue\n");
+ navigation_poproute();
+ // TODO this may also be a nice idea to do "early" (e.g. by
+ // manipulating the vlen() comparisons) to shorten paths in
+ // general - this would make bots walk more "on rails" than
+ // "zigzagging" which they currently do with sufficiently
+ // random-like waypoints, and thus can make a nice bot
+ // personality property
+ }
+
+ // HACK: remove players/bots as goals, they can lead a bot to unexpected places (cliffs, lava, etc)
+ // TODO: rate waypoints near the targetted player at that moment, instead of the player itself
+ if(self.goalcurrent.classname=="player")
+ navigation_poproute();
+
+ // aid for detecting jump pads better (distance based check fails sometimes)
+ if(self.goalcurrent.wpflags & WAYPOINTFLAG_TELEPORT && self.jumppadcount > 0 )
+ navigation_poproute();
+
// Loose goal touching check when running
if(self.aistatus & AI_STATUS_RUNNING)
+ if(self.speed >= autocvar_sv_maxspeed) // if -really- running
if(self.goalcurrent.classname=="waypoint")
{
if(vlen(self.origin - self.goalcurrent.origin)<150)
void botframe_updatedangerousobjects(float maxupdate)
{
local entity head, bot_dodgelist;
- local vector m1, m2, v;
+ local vector m1, m2, v, o;
local float c, d, danger;
c = 0;
bot_dodgelist = findchainfloat(bot_dodge, TRUE);
v_x = bound(m1_x, v_x, m2_x);
v_y = bound(m1_y, v_y, m2_y);
v_z = bound(m1_z, v_z, m2_z);
- d = head.bot_dodgerating - vlen(head.origin - v);
+ o = (head.absmin + head.absmax) * 0.5;
+ d = head.bot_dodgerating - vlen(o - v);
if (d > 0)
{
- traceline(head.origin, v, TRUE, world);
+ traceline(o, v, TRUE, world);
if (trace_fraction == 1)
danger = danger + d;
}
while(head)
{
if(head.classname=="waypoint")
- if(!(head.wpflags & WAYPOINTFLAG_GENERATED))
+ // if(!(head.wpflags & WAYPOINTFLAG_GENERATED))
{
if(bot_waypoint_queue_goal)
bot_waypoint_queue_goal.bot_waypoint_queue_nextgoal = head;
void debuggoalstack()
{
local entity goal;
- local vector org;
+ local vector org, go;
if(self.goalcounter==0)goal=self.goalcurrent;
else if(self.goalcounter==1)goal=self.goalstack01;
org = self.lastposition;
- te_lightning2(world, org, goal.origin);
- self.lastposition = goal.origin;
+ go = ( goal.absmin + goal.absmax ) * 0.5;
+ te_lightning2(world, org, go);
+ self.lastposition = go;
self.goalcounter++;
}
float bot_navigation_movemode;
float navigation_testtracewalk;
+vector jumpstepheightvec;
vector stepheightvec;
entity botframe_dangerwaypoint;
.float navigation_hasgoals;
.float lastteleporttime;
+.float blacklisted;
+
.entity navigation_jetpack_goal;
.vector navigation_jetpack_point;
}
bufstr_set(bot.bot_cmdqueuebuf, bot.bot_cmdqueuebuf_end, cmdstring);
+
+ // if the command was a "sound" command, precache the sound NOW
+ // this prevents lagging!
+ {
+ float sp;
+ string parm;
+ string cmdstr;
+
+ sp = strstrofs(cmdstr, " ", 0);
+ if(sp < 0)
+ {
+ parm = "";
+ }
+ else
+ {
+ parm = substring(cmdstr, sp + 1, -1);
+ cmdstr = substring(cmdstr, 0, sp);
+ }
+ if(cmdstr == "sound")
+ precache_sound(cmdstr);
+ }
+
bot.bot_cmdqueuebuf_end += 1;
}
#define MAX_BOT_PLACES 4
.float bot_places_count;
-.entity bot_places[MAX_BOT_PLACES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(bot_places);
-.string bot_placenames[MAX_BOT_PLACES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(bot_placenames);
+.entity bot_places[MAX_BOT_PLACES];
+.string bot_placenames[MAX_BOT_PLACES];
entity bot_getplace(string placename)
{
entity e;
#define BOT_CMD_BARRIER 20
#define BOT_CMD_CONSOLE 21
#define BOT_CMD_SOUND 22
-#define BOT_CMD_WHILE 23 // TODO: Not implemented yet
-#define BOT_CMD_WEND 24 // TODO: Not implemented yet
-#define BOT_CMD_CHASE 25 // TODO: Not implemented yet
+#define BOT_CMD_DEBUG_ASSERT_CANFIRE 23
+#define BOT_CMD_WHILE 24 // TODO: Not implemented yet
+#define BOT_CMD_WEND 25 // TODO: Not implemented yet
+#define BOT_CMD_CHASE 26 // TODO: Not implemented yet
-#define BOT_CMD_COUNTER 23 // Update this value if you add/remove a command
+#define BOT_CMD_COUNTER 24 // Update this value if you add/remove a command
// NOTE: Following commands should be implemented on the bot ai
// If a new command should be handled by the target ai(s) please declare it here
bot_cmd_string[BOT_CMD_SOUND] = "sound";
bot_cmd_parm_type[BOT_CMD_SOUND] = BOT_CMD_PARAMETER_STRING;
+ bot_cmd_string[BOT_CMD_DEBUG_ASSERT_CANFIRE] = "debug_assert_canfire";
+ bot_cmd_parm_type[BOT_CMD_DEBUG_ASSERT_CANFIRE] = BOT_CMD_PARAMETER_FLOAT;
+
bot_cmds_initialized = TRUE;
}
case BOT_CMD_SOUND:
print("play sound file at bot location");
break;
+ case BOT_CMD_DEBUG_ASSERT_CANFIRE:
+ print("verify the state of the weapon entity");
+ break;
default:
print("This command has no description yet.");
break;
f = bot_cmd.bot_cmd_parm_string;
precache_sound(f);
- sound(self, CHAN_WEAPON2, f, VOL_BASE, ATTN_MIN);
+ sound(self, CH_WEAPON_B, f, VOL_BASE, ATTN_MIN);
+
+ return CMD_STATUS_FINISHED;
+}
+
+.entity tuba_note;
+float bot_cmd_debug_assert_canfire()
+{
+ float f;
+ f = bot_cmd.bot_cmd_parm_float;
+
+ if(self.weaponentity.state != WS_READY)
+ {
+ if(f)
+ {
+ self.colormod = '0 8 8';
+ print("Bot wants to fire, inhibited by weaponentity state\n");
+ }
+ }
+ else if(ATTACK_FINISHED(self) > time)
+ {
+ if(f)
+ {
+ self.colormod = '8 0 8';
+ print("Bot wants to fire, inhibited by ATTACK_FINISHED\n");
+ }
+ }
+ else if(self.tuba_note)
+ {
+ if(f)
+ {
+ self.colormod = '8 0 0';
+ print("Bot wants to fire, bot still has an active tuba note\n");
+ }
+ }
+ else
+ {
+ if(!f)
+ {
+ self.colormod = '8 8 0';
+ print("Bot thinks it has fired, but apparently did not\n");
+ }
+ }
return CMD_STATUS_FINISHED;
}
{
local float status, ispressingkey;
- if(self.deadflag!=DEAD_NO)
- return 0;
-
// Find command
bot_setcurrentcommand();
+ // if we have no bot command, better return
+ // old logic kept pressing previously pressed keys, but that has problems
+ // (namely, it means you cannot make a bot "normal" ever again)
+ // to keep a bot walking for a while, use the "wait" bot command
+ if(bot_cmd == world)
+ return FALSE;
+
// Ignore all commands except continue when the bot is paused
if(self.bot_exec_status & BOT_EXEC_STATUS_PAUSED)
if(bot_cmd.bot_cmd_type!=BOT_CMD_CONTINUE)
// Keep pressing keys raised by the "presskey" command
ispressingkey = !!bot_presskeys();
- if(bot_cmd==world)
- return ispressingkey;
-
// Handle conditions
if not(bot_cmd.bot_cmd_type==BOT_CMD_FI||bot_cmd.bot_cmd_type==BOT_CMD_ELSE)
if(self.bot_cmd_condition_status & CMD_CONDITION_TRUE && self.bot_cmd_condition_status & CMD_CONDITION_FALSE_BLOCK)
case BOT_CMD_SOUND:
status = bot_cmd_sound();
break;
+ case BOT_CMD_DEBUG_ASSERT_CANFIRE:
+ status = bot_cmd_debug_assert_canfire();
+ break;
default:
print(strcat("ERROR: Invalid command on queue with id '",ftos(bot_cmd.bot_cmd_type),"'\n"));
return 0;
setsize(w, m1 - w.origin, m2 - w.origin);
if (vlen(w.size) > 0)
w.wpisbox = TRUE;
-
+
if(!w.wpisbox)
{
setsize(w, PL_MIN - '1 1 0', PL_MAX + '1 1 0');
local entity e;
local vector sv, sm1, sm2, ev, em1, em2, dv;
- stepheightvec = autocvar_sv_stepheight * '0 0 1';
+ bot_calculate_stepheightvec();
+
bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
//dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n");
if(!found)
{
- // can't find that waypoint
- fclose(file);
- return FALSE;
+ dprint("waypoint_load_links: couldn't find 'from' waypoint at ", vtos(wp_from.origin),"\n");
+ continue;
}
+
}
// Search "to" waypoint
if(!found)
{
- // can't find that waypoint
- fclose(file);
- return FALSE;
+ dprint("waypoint_load_links: couldn't find 'to' waypoint at ", vtos(wp_to.origin),"\n");
+ continue;
}
++c;
// Search "from" waypoint
if(wp_from.origin!=wp_from_pos)
{
- wp_from = findradius(wp_from_pos, 1);
+ wp_from = findradius(wp_from_pos, 5);
found = FALSE;
while(wp_from)
{
- if(vlen(wp_from.origin-wp_from_pos)<1)
+ if(vlen(wp_from.origin-wp_from_pos)<5)
if(wp_from.classname == "waypoint")
{
found = TRUE;
}
// Search "to" waypoint
- wp_to = findradius(wp_to_pos, 1);
+ wp_to = findradius(wp_to_pos, 5);
found = FALSE;
while(wp_to)
{
- if(vlen(wp_to.origin-wp_to_pos)<1)
+ if(vlen(wp_to.origin-wp_to_pos)<5)
if(wp_to.classname == "waypoint")
{
found = TRUE;
++c;
waypoint_addlink(wp_from, wp_to);
+ wp_from.wphardwired = TRUE;
+ wp_to.wphardwired = TRUE;
}
fclose(file);
waypoint_spawnforitem_force(e, e.origin);
};
-void waypoint_spawnforteleporter(entity e, vector destination, float timetaken)
+void waypoint_spawnforteleporter_boxes(entity e, vector org1, vector org2, vector destination1, vector destination2, float timetaken)
{
local entity w;
local entity dw;
- w = waypoint_spawn(e.absmin, e.absmax, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_NORELINK);
- dw = waypoint_spawn(destination, destination, WAYPOINTFLAG_GENERATED);
+ w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_NORELINK);
+ dw = waypoint_spawn(destination1, destination2, WAYPOINTFLAG_GENERATED);
// one way link to the destination
w.wp00 = dw;
w.wp00mincost = timetaken; // this is just for jump pads
e.nearestwaypointtimeout = time + 1000000000;
};
+void waypoint_spawnforteleporter_v(entity e, vector org, vector destination, float timetaken)
+{
+ org = waypoint_fixorigin(org);
+ destination = waypoint_fixorigin(destination);
+ waypoint_spawnforteleporter_boxes(e, org, org, destination, destination, timetaken);
+};
+
+void waypoint_spawnforteleporter(entity e, vector destination, float timetaken)
+{
+ destination = waypoint_fixorigin(destination);
+ waypoint_spawnforteleporter_boxes(e, e.absmin, e.absmax, destination, destination, timetaken);
+};
+
entity waypoint_spawnpersonal(vector position)
{
entity w;
.float wp16mincost, wp17mincost, wp18mincost, wp19mincost, wp20mincost, wp21mincost, wp22mincost, wp23mincost;
.float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost;
-.float wpfire, wpcost, wpconsidered, wpisbox, wpflags, wplinked;
+.float wpfire, wpcost, wpconsidered, wpisbox, wpflags, wplinked, wphardwired;
.vector wpnearestpoint;
void changelevel (string s) = #70;
void cvar_set (string var, string val) = #72;
-//void(entity client, string s) centerprint = #73;
+void(entity client, string s) centerprint = #73;
void ambientsound (vector pos, string samp, float vol, float atten) = #74;
string precache_model2 (string s) = #75;
string precache_sound2 (string s) = #76;
title = campaign_shortdesc[0];
title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));
- campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));
+ campaign_message = strzone(strcat(title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));
strunzone(title);
}
if(campaign_entries < 2)
{
// I have won
- savevar = strcat("g_campaign", campaign_name, "_won");
- CampaignSaveCvar(savevar, 1);
- // advance level (for menu to show it right)
- CampaignSaveCvar(campaign_index_var, campaign_level + 1);
+ if(campaign_level == cvar_normal(campaign_index_var))
+ {
+ savevar = strcat("g_campaign", campaign_name, "_won");
+ CampaignSaveCvar(savevar, 1);
+ // advance level (for menu to show it right)
+ CampaignSaveCvar(campaign_index_var, campaign_level + 1);
+ }
}
else if(campaign_level == cvar_normal(campaign_index_var))
{
void CampaignLevelWarp(float n)
{
+ if(n < 0)
+ n = campaign_level + 1;
CampaignFile_Unload();
CampaignFile_Load(n, 1);
if(campaign_entries)
e2 = spawn();
setorigin(e2, org);
pointparticles(particleeffectnum("rocket_explode"), org, '0 0 0', 1);
- sound(e2, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(e2, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
RadiusDamage(e2, e, 1000, 0, 128, e, 500, DEATH_CHEAT, world);
remove(e2);
}
// arguments:
// effectname
effectnum = particleeffectnum(argv(1));
- W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
+ W_SetupShot(self, FALSE, FALSE, "", CH_WEAPON_A, 0);
traceline(w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, MOVE_NORMAL, self);
trailparticles(self, effectnum, w_shotorg, trace_endpos);
DID_CHEAT();
// arguments:
// modelname mode
f = stof(argv(2));
- W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
+ W_SetupShot(self, FALSE, FALSE, "", CH_WEAPON_A, 0);
traceline(w_shotorg, w_shotorg + w_shotdir * 2048, MOVE_NORMAL, self);
if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || trace_fraction == 1)
{
remove(e);
DID_CHEAT();
break;
- case "warp":
- IS_CHEAT(0, argc, 0);
- if(argc == 2) if(autocvar_g_campaign)
- {
- CampaignLevelWarp(stof(argv(1)));
- DID_CHEAT();
- }
- break;
case "god":
IS_CHEAT(0, argc, 0);
BITXOR_ASSIGN(self.flags, FL_GODMODE);
void spawnpoint_use()
{
- if(teams_matter)
+ if(teamplay)
if(have_team_spawns > 0)
{
self.team = activator.team;
void PutObserverInServer (void)
{
entity spot;
-
+ self.hud = HUD_NORMAL;
race_PreSpawnObserver();
spot = SelectSpawnPoint (TRUE);
DropAllRunes(self);
MUTATOR_CALLHOOK(MakePlayerObserver);
+ if (g_minstagib)
+ minstagib_stop_countdown();
+
Portal_ClearAll(self);
if(self.alivetime)
self.alivetime = 0;
}
+ if(self.vehicle)
+ vehicles_exit(VHEF_RELESE);
+
if(self.flagcarried)
DropFlag(self.flagcarried, world, world);
accuracy_resend(self);
self.spectatortime = time;
-
+
self.classname = "observer";
self.iscreature = FALSE;
self.health = -666;
self.takedamage = DAMAGE_NO;
self.solid = SOLID_NOT;
- self.movetype = MOVETYPE_NOCLIP;
+ self.movetype = MOVETYPE_FLY_WORLDONLY; //(self.cvar_cl_clippedspectating ? MOVETYPE_NOCLIP : MOVETYPE_FLY); // it's too early for this anyway, lets just set it in playerprethink
self.flags = FL_CLIENT | FL_NOTARGET;
self.armorvalue = 666;
self.effects = 0;
self.fixangle = TRUE;
self.crouch = FALSE;
- self.view_ofs = PL_VIEW_OFS;
+ self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
setorigin (self, spot.origin);
- setsize (self, '0 0 0', '0 0 0');
+ setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
self.prevorigin = self.origin;
self.items = 0;
self.weapons = 0;
self.model = "";
self.modelindex = 0;
self.weapon = 0;
+ self.weaponname = "";
+ self.switchingweapon = 0;
self.weaponmodel = "";
self.weaponentity = world;
self.exteriorweaponentity = world;
else
self.frags = FRAGS_LMS_LOSER;
}
+ else if(g_ca)
+ {
+ if(self.caplayer)
+ self.frags = FRAGS_LMS_LOSER;
+ else
+ self.frags = FRAGS_SPECTATOR;
+ }
else
self.frags = FRAGS_SPECTATOR;
}
if(autocvar_sv_defaultcharacter == 1) {
defaultskin = 0;
- if(teams_matter)
+ if(teamplay)
{
string s;
s = Team_ColorNameLowerCase(self.team);
if(chmdl || oldskin != self.skinindex)
self.species = player_getspecies(); // model or skin has changed
- if(!teams_matter)
+ if(!teamplay)
if(strlen(autocvar_sv_defaultplayercolors))
if(self.clientcolors != stof(autocvar_sv_defaultplayercolors))
setcolor(self, stof(autocvar_sv_defaultplayercolors));
if(clienttype(self) == CLIENTTYPE_BOT && autocvar_g_botclip_collisions)
self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
self.frags = FRAGS_PLAYER;
- if(independent_players)
+ if(INDEPENDENT_PLAYERS)
MAKE_INDEPENDENT_PLAYER(self);
self.flags = FL_CLIENT;
self.takedamage = DAMAGE_AIM;
self.oldorigin = self.origin;
self.prevorigin = self.origin;
self.lastrocket = world; // stop rocket guiding, no revenge from the grave!
+ self.lastteleporttime = time; // prevent insane speeds due to changing origin
if(g_arena)
{
self.killcount = 0;
}
- self.cnt = WEP_LASER;
-
CL_SpawnWeaponentity();
self.alpha = default_player_alpha;
self.colormod = '1 1 1' * autocvar_g_player_brightness;
//stuffcmd(self, "set viewsize $tmpviewsize \n");
if (autocvar_g_spawnsound)
- sound (self, CHAN_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
if(g_assault) {
if(self.team == assault_attacker_team)
if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
self.weapon_load[j] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
}
- self.weapon_forbidchange = FALSE;
oldself = self;
self = spot;
activator = oldself;
+ string s;
+ s = self.target;
+ self.target = string_null;
SUB_UseTargets();
+ self.target = s;
activator = world;
self = oldself;
MUTATOR_CALLHOOK(PlayerSpawn);
self.switchweapon = w_getbestweapon(self);
- self.cnt = self.switchweapon;
+ self.cnt = -1; // W_LastWeapon will not complain
self.weapon = 0;
+ self.weaponname = "";
+ self.switchingweapon = 0;
if(!self.alivetime)
self.alivetime = time;
void ClientKill_Now()
{
- remove(self.killindicator);
+ if(self.vehicle)
+ {
+ vehicles_exit(VHEF_RELESE);
+ if(!self.killindicator_teamchange)
+ {
+ self.vehicle_health = -1;
+ Damage(self, self, self, 1 , DEATH_KILL, self.origin, '0 0 0');
+ }
+ }
+
+ if(self.killindicator && !wasfreed(self.killindicator))
+ remove(self.killindicator);
+
self.killindicator = world;
if(self.killindicator_teamchange)
}
void KillIndicator_Think()
{
+ if (gameover)
+ {
+ self.owner.killindicator = world;
+ remove(self);
+ return;
+ }
+
if (!self.owner.modelindex)
{
self.owner.killindicator = world;
{
if(self.cnt <= 10)
AnnounceTo(self.owner, strcat(ftos(self.cnt), ""));
- if(self.owner.killindicator_teamchange)
- {
- if(self.owner.killindicator_teamchange == -1)
- centerprint(self.owner, strcat("Changing team in ", ftos(self.cnt), " seconds"));
- else if(self.owner.killindicator_teamchange == -2)
- centerprint(self.owner, strcat("Spectating in ", ftos(self.cnt), " seconds"));
- else
- centerprint(self.owner, strcat("Changing to ", ColoredTeamName(self.owner.killindicator_teamchange), " in ", ftos(self.cnt), " seconds"));
- }
- else
- centerprint(self.owner, strcat("^1Suicide in ", ftos(self.cnt), " seconds"));
}
self.nextthink = time + 1;
self.cnt -= 1;
}
}
+float clientkilltime;
void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 = spec
{
float killtime;
+ float starttime;
entity e;
+
+ if (gameover)
+ return;
+
killtime = autocvar_g_balance_kill_delay;
if(g_race_qualifying || g_cts)
}
else
{
+ starttime = max(time, clientkilltime);
+
self.killindicator = spawn();
self.killindicator.owner = self;
self.killindicator.scale = 0.5;
setattachment(self.killindicator, self, "");
setorigin(self.killindicator, '0 0 52');
self.killindicator.think = KillIndicator_Think;
- self.killindicator.nextthink = time + (self.lip) * 0.05;
+ self.killindicator.nextthink = starttime + (self.lip) * 0.05;
+ clientkilltime = max(clientkilltime, self.killindicator.nextthink + 0.05);
self.killindicator.cnt = ceil(killtime);
self.killindicator.count = bound(0, ceil(killtime), 10);
//sprint(self, strcat("^1You'll be dead in ", ftos(self.killindicator.cnt), " seconds\n"));
setattachment(e.killindicator, e, "");
setorigin(e.killindicator, '0 0 52');
e.killindicator.think = KillIndicator_Think;
- e.killindicator.nextthink = time + (e.lip) * 0.05;
+ e.killindicator.nextthink = starttime + (e.lip) * 0.05;
+ clientkilltime = max(clientkilltime, e.killindicator.nextthink + 0.05);
e.killindicator.cnt = ceil(killtime);
}
self.lip = 0;
if(self.killindicator)
{
if(targetteam == 0) // just die
+ {
self.killindicator.colormod = '0 0 0';
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ if(self.killindicator.cnt > 0)
+ Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "^1Suicide in %d seconds", 1, self.killindicator.cnt);
+ }
else if(targetteam == -1) // auto
+ {
self.killindicator.colormod = '0 1 0';
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ if(self.killindicator.cnt > 0)
+ Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Changing team in %d seconds", 1, self.killindicator.cnt);
+ }
else if(targetteam == -2) // spectate
+ {
self.killindicator.colormod = '0.5 0.5 0.5';
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ if(self.killindicator.cnt > 0)
+ Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Spectating in %d seconds", 1, self.killindicator.cnt);
+ }
else
+ {
self.killindicator.colormod = TeamColor(targetteam);
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ if(self.killindicator.cnt > 0)
+ Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, strcat("Changing to ", ColoredTeamName(targetteam), " in %d seconds"), 1, self.killindicator.cnt);
+ }
}
+
}
void ClientKill (void)
{
+ if (gameover)
+ return;
+
if((g_arena || g_ca) && ((champion && champion.classname == "player" && player_count > 1) || player_count == 1)) // don't allow a kill in this case either
{
// do nothing
e.lip = 0;
}
-void DoTeamChange(float destteam)
-{
- float t, c0;
- if(!teams_matter)
- {
- if(destteam >= 0)
- SetPlayerColors(self, destteam);
- return;
- }
- if(self.classname == "player")
- if(destteam == -1)
- {
- CheckAllowedTeams(self);
- t = FindSmallestTeam(self, TRUE);
- switch(self.team)
- {
- case COLOR_TEAM1: c0 = c1; break;
- case COLOR_TEAM2: c0 = c2; break;
- case COLOR_TEAM3: c0 = c3; break;
- case COLOR_TEAM4: c0 = c4; break;
- default: c0 = 999;
- }
- switch(t)
- {
- case 1:
- if(c0 > c1)
- destteam = COLOR_TEAM1;
- break;
- case 2:
- if(c0 > c2)
- destteam = COLOR_TEAM2;
- break;
- case 3:
- if(c0 > c3)
- destteam = COLOR_TEAM3;
- break;
- case 4:
- if(c0 > c4)
- destteam = COLOR_TEAM4;
- break;
- }
- if(destteam == -1)
- return;
- }
- if(destteam == self.team && destteam >= 0 && !self.killindicator)
- return;
- ClientKill_TeamChange(destteam);
-}
-
void FixClientCvars(entity e)
{
// send prediction settings to the client
playerdemo_init();
anticheat_init();
-
+
race_PreSpawnObserver();
//if(g_domination)
else
self.team_forced = 0;
- if(!teams_matter)
+ if(!teamplay)
if(self.team_forced > 0)
self.team_forced = 0;
if((autocvar_sv_spectate == 1 && !g_lms) || autocvar_g_campaign || self.team_forced < 0) {
self.classname = "observer";
} else {
- if(teams_matter)
+ if(teamplay)
{
if(autocvar_g_balance_teams || autocvar_g_balance_teams_force)
{
self.playerid = (playerid_last = playerid_last + 1);
+ PlayerStats_AddEvent(sprintf("kills-%d", self.playerid));
+
if(clienttype(self) == CLIENTTYPE_BOT)
PlayerStats_AddPlayer(self);
bprint("\n");
- self.welcomemessage_time = 0;
-
stuffcmd(self, strcat(clientstuff, "\n"));
- stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n"));
- stuffcmd(self, "cl_particles_reloadeffects\n");
+ stuffcmd(self, "cl_particles_reloadeffects\n"); // TODO do we still need this?
FixClientCvars(self);
GetCvars(0);
// notify about available teams
- if(teams_matter)
+ if(teamplay)
{
CheckAllowedTeams(self);
t = 0; if(c1 >= 0) t |= 1; if(c2 >= 0) t |= 2; if(c3 >= 0) t |= 4; if(c4 >= 0) t |= 8;
set_dom_state(self);
CheatInitClient();
+
+ if(!autocvar_g_campaign)
+ Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0);
}
/*
void ReadyCount();
void ClientDisconnect (void)
{
+ if(self.vehicle)
+ vehicles_exit(VHEF_RELESE);
+
if not(self.flags & FL_CLIENT)
{
print("Warning: ClientDisconnect without ClientConnect\n");
local float c;
c = self.clientcolors & 15;
// LordHavoc: only bothering to support white, green, red, yellow, blue
- if (!teams_matter) self.colormod = '0 0 0';
+ if (!teamplay) self.colormod = '0 0 0';
else if (c == 0) self.colormod = '1.00 1.00 1.00';
else if (c == 3) self.colormod = '0.10 1.73 0.10';
else if (c == 4) self.colormod = '1.73 0.10 0.10';
if(clienttype(self) == CLIENTTYPE_REAL)
if(floor(finished - time - frametime) != floor(finished - time))
if(finished - time < 6)
- sound (self, CHAN_AUTO, samp, VOL_BASE, ATTN_NORM);
-}
-
-/**
- * When sv_timeout is used this function returs strings like
- * "Timeout begins in 2 seconds!\n" or "Timeout ends in 23 seconds!\n".
- * Called by centerprint functions
- * @param addOneSecond boolean, set to 1 if the welcome-message centerprint asks for the text
- */
-string getTimeoutText(float addOneSecond) {
- if (!autocvar_sv_timeout || !timeoutStatus)
- return "";
-
- local string retStr;
- if (timeoutStatus == 1) {
- if (addOneSecond == 1) {
- retStr = strcat("Timeout begins in ", ftos(remainingLeadTime + 1), " seconds!\n");
- }
- else {
- retStr = strcat("Timeout begins in ", ftos(remainingLeadTime), " seconds!\n");
- }
- return retStr;
- }
- else if (timeoutStatus == 2) {
- if (addOneSecond) {
- retStr = strcat("Timeout ends in ", ftos(remainingTimeoutTime + 1), " seconds!\n");
- //don't show messages like "Timeout ends in 0 seconds"...
- if ((remainingTimeoutTime + 1) > 0)
- return retStr;
- else
- return "";
- }
- else {
- retStr = strcat("Timeout ends in ", ftos(remainingTimeoutTime), " seconds!\n");
- //don't show messages like "Timeout ends in 0 seconds"...
- if (remainingTimeoutTime > 0)
- return retStr;
- else
- return "";
- }
- }
- else return "";
+ sound (self, CH_INFO, samp, VOL_BASE, ATTN_NORM);
}
void player_powerups (void)
{
// add a way to see what the items were BEFORE all of these checks for the mutator hook
olditems = self.items;
-
+
if((self.items & IT_USING_JETPACK) && !self.deadflag)
{
- SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+ SoundEntity_StartSound(self, CH_TRIGGER_SINGLE, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
self.modelflags |= MF_ROCKET;
}
else
{
- SoundEntity_StopSound(self, CHAN_PLAYER);
+ SoundEntity_StopSound(self, CH_TRIGGER_SINGLE);
self.modelflags &~= MF_ROCKET;
}
if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
return;
-
+
Fire_ApplyDamage(self);
Fire_ApplyEffect(self);
if (time < self.spawnshieldtime)
self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
}
-
+
MUTATOR_CALLHOOK(PlayerPowerups);
}
self.pressedkeys = spectatee.pressedkeys;
self.weapons = spectatee.weapons;
self.switchweapon = spectatee.switchweapon;
+ self.switchingweapon = spectatee.switchingweapon;
self.weapon = spectatee.weapon;
self.nex_charge = spectatee.nex_charge;
self.nex_chargepool_ammo = spectatee.nex_chargepool_ammo;
self.dmg_save = spectatee.dmg_save;
self.dmg_inflictor = spectatee.dmg_inflictor;
self.angles = spectatee.v_angle;
- self.fixangle = TRUE;
+ if(!self.BUTTON_USE)
+ self.fixangle = TRUE;
setorigin(self, spectatee.origin);
setsize(self, spectatee.mins, spectatee.maxs);
SetZoomState(spectatee.zoomstate);
anticheat_spectatecopy(spectatee);
+
+ //self.vehicle = spectatee.vehicle;
+
+ self.hud = spectatee.hud;
+ if(spectatee.vehicle)
+ {
+ setorigin(self, spectatee.origin);
+ self.velocity = spectatee.vehicle.velocity;
+ self.v_angle += spectatee.vehicle.angles;
+ //self.v_angle_x *= -1;
+ self.vehicle_health = spectatee.vehicle_health;
+ self.vehicle_shield = spectatee.vehicle_shield;
+ self.vehicle_energy = spectatee.vehicle_energy;
+ self.vehicle_ammo1 = spectatee.vehicle_ammo1;
+ self.vehicle_ammo2 = spectatee.vehicle_ammo2;
+ self.vehicle_reload1 = spectatee.vehicle_reload1;
+ self.vehicle_reload2 = spectatee.vehicle_reload2;
+
+ msg_entity = self;
+ WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+ WriteEntity(MSG_ONE, spectatee);
+ //self.tur_head = spectatee.vehicle.vehicle_viewport;
+ }
}
float SpectateUpdate() {
if(!self.enemy)
- return 0;
+ return 0;
if (self == self.enemy)
return 0;
return 1;
}
-float SpectateNext() {
- other = find(self.enemy, classname, "player");
- if (!other)
+// Returns next available player to spectate if g_ca_spectate_enemies == 0
+entity CA_SpectateNext(entity start) {
+ if (start.team == self.team) {
+ return start;
+ }
+
+ other = start;
+ // continue from current player
+ while(other && other.team != self.team) {
other = find(other, classname, "player");
+ }
+
+ if (!other) {
+ // restart from begining
+ other = find(other, classname, "player");
+ while(other && other.team != self.team) {
+ other = find(other, classname, "player");
+ }
+ }
+
+ return other;
+}
+float SpectateNext() {
+ other = find(self.enemy, classname, "player");
+ if (g_ca && !autocvar_g_ca_spectate_enemies && self.caplayer) {
+ // CA and ca players when spectating enemies is forbidden
+ other = CA_SpectateNext(other);
+ } else {
+ // other modes and ca spectators or spectating enemies is allowed
+ if (!other)
+ other = find(other, classname, "player");
+ }
+
if (other)
self.enemy = other;
if(self.enemy.classname == "player") {
- msg_entity = self;
- WriteByte(MSG_ONE, SVC_SETVIEW);
- WriteEntity(MSG_ONE, self.enemy);
- //stuffcmd(self, "set viewsize $tmpviewsize \n");
- self.movetype = MOVETYPE_NONE;
- accuracy_resend(self);
-
- if(!SpectateUpdate())
- PutObserverInServer();
-
- return 1;
+ if(self.enemy.vehicle)
+ {
+ msg_entity = self;
+ WriteByte(MSG_ONE, SVC_SETVIEWPORT);
+ WriteEntity(MSG_ONE, self.enemy);
+ //stuffcmd(self, "set viewsize $tmpviewsize \n");
+ self.movetype = MOVETYPE_NONE;
+ accuracy_resend(self);
+ }
+ else
+ {
+ msg_entity = self;
+ WriteByte(MSG_ONE, SVC_SETVIEW);
+ WriteEntity(MSG_ONE, self.enemy);
+ //stuffcmd(self, "set viewsize $tmpviewsize \n");
+ self.movetype = MOVETYPE_NONE;
+ accuracy_resend(self);
+
+ if(!SpectateUpdate())
+ PutObserverInServer();
+ }
+ return 1;
} else {
return 0;
}
}
}
+.float prevent_join_msgtime;
void LeaveSpectatorMode()
{
if(nJoinAllowed(1)) {
- if(!teams_matter || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
+ if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
self.classname = "player";
if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force)
bprint ("^4", self.netname, "^4 is playing now\n");
if(!autocvar_g_campaign)
- centerprint(self,""); // clear MOTD
+ if (time < self.jointime + autocvar_welcome_message_time)
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); // clear MOTD
+
+ if (self.prevent_join_msgtime)
+ {
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_PREVENT_JOIN);
+ self.prevent_join_msgtime = 0;
+ }
return;
} else {
}
else {
//player may not join because of g_maxplayers is set
- centerprint_atprio(self, CENTERPRIO_MAPVOTE, PREVENT_JOIN_TEXT);
+ if (time - self.prevent_join_msgtime > 2)
+ {
+ Send_CSQC_Centerprint_Generic(self, CPID_PREVENT_JOIN, PREVENT_JOIN_TEXT, 0, 0);
+ self.prevent_join_msgtime = time;
+ }
}
}
}
}
+.float motd_actived_time; // used for both motd and campaign_message
+void PrintWelcomeMessage()
+{
+ if (self.motd_actived_time == 0) { // is there already a message showing?
+ if (autocvar_g_campaign) {
+ if ((self.classname == "player" && self.BUTTON_INFO) || (self.classname != "player")) {
+ self.motd_actived_time = time;
+ Send_CSQC_Centerprint_Generic(self, CPID_MOTD, campaign_message, -1, 0);
+ }
+ } else {
+ if ((time - self.jointime > autocvar_welcome_message_time) && self.BUTTON_INFO) {
+ self.motd_actived_time = time;
+ Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), -1, 0);
+ }
+ }
+ } else { // showing MOTD or campaign message
+ if (autocvar_g_campaign) {
+ if (self.BUTTON_INFO)
+ self.motd_actived_time = time;
+ else if ((time - self.motd_actived_time > 2) && self.classname == "player") { // hide it some seconds after BUTTON_INFO has been released
+ self.motd_actived_time = 0;
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD);
+ }
+ } else {
+ if ((time - self.jointime) > autocvar_welcome_message_time) {
+ if (self.BUTTON_INFO)
+ self.motd_actived_time = time;
+ else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released
+ self.motd_actived_time = 0;
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD);
+ }
+ }
+ }
+ }
+}
+
void ObserverThink()
{
+ float prefered_movetype;
if (self.flags & FL_JUMPRELEASED) {
if (self.BUTTON_JUMP && !self.version_mismatch) {
- self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
self.flags |= FL_SPAWNING;
} else if(self.BUTTON_ATCK && !self.version_mismatch) {
- self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
if(SpectateNext() == 1) {
self.classname = "spectator";
}
+ } else {
+ prefered_movetype = ((!self.BUTTON_USE ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP);
+ if (self.movetype != prefered_movetype)
+ self.movetype = prefered_movetype;
}
} else {
if (!(self.BUTTON_ATCK || self.BUTTON_JUMP)) {
}
}
}
- PrintWelcomeMessage(self);
+
+ PrintWelcomeMessage();
}
void SpectatorThink()
{
if (self.flags & FL_JUMPRELEASED) {
if (self.BUTTON_JUMP && !self.version_mismatch) {
- self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
self.flags |= FL_SPAWNING;
} else if(self.BUTTON_ATCK) {
- self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
if(SpectateNext() == 1) {
self.classname = "spectator";
PutClientInServer();
}
} else if (self.BUTTON_ATCK2) {
- self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
self.classname = "observer";
PutClientInServer();
return;
}
}
+ if(!SpectateUpdate())
+ PutObserverInServer();
}
- PrintWelcomeMessage(self);
+ PrintWelcomeMessage();
self.flags |= FL_CLIENT | FL_NOTARGET;
}
+float ctf_usekey();
+void PlayerUseKey()
+{
+ if(self.classname != "player")
+ return;
+
+ if(self.vehicle)
+ {
+ vehicles_exit(VHEF_NORMAL);
+ return;
+ }
+
+ // a use key was pressed; call handlers
+ if(ctf_usekey())
+ return;
+
+ MUTATOR_CALLHOOK(PlayerUseKey);
+}
+
.float touchexplode_time;
/*
Called every frame for each client before the physics are run
=============
*/
+.float usekeypressed;
void() ctf_setstatus;
void() nexball_setstatus;
.float items_added;
if(self.cvar_g_xonoticversion)
if(time > self.version_nagtime)
{
- if(strstr(self.cvar_g_xonoticversion, "git", 0) < 0)
+ // don't notify git users
+ if(strstr(self.cvar_g_xonoticversion, "git", 0) < 0 && strstr(self.cvar_g_xonoticversion, "autobuild", 0) < 0)
{
- if(strstr(autocvar_g_xonoticversion, "git", 0) >= 0)
+ if(strstr(autocvar_g_xonoticversion, "git", 0) >= 0 || strstr(autocvar_g_xonoticversion, "autobuild", 0) >= 0)
{
+ // notify release users if connecting to git
dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
}
r = vercmp(self.cvar_g_xonoticversion, autocvar_g_xonoticversion);
if(r < 0)
{
- dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n");
- sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n"));
+ // give users new version
+ dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n");
+ sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n"));
}
else if(r > 0)
{
- dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
+ // notify users about old server version
+ print("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
}
}
MUTATOR_CALLHOOK(PlayerPreThink);
+ if(self.BUTTON_USE && !self.usekeypressed)
+ PlayerUseKey();
+ self.usekeypressed = self.BUTTON_USE;
+
+ PrintWelcomeMessage();
+
if(self.classname == "player") {
// if(self.netname == "Wazat")
// bprint(self.classname, "\n");
CheckRules_Player();
- PrintWelcomeMessage(self);
-
if (intermission_running)
{
IntermissionThink (); // otherwise a button could be missed between
player_powerups();
}
+ if (g_minstagib)
+ minstagib_ammocheck();
+
if (self.deadflag != DEAD_NO)
{
float button_pressed, force_respawn;
}
return;
}
+ // FIXME from now on self.deadflag is always 0 (and self.health is never < 1)
+ // so (self.deadflag == DEAD_NO) is always true in the code below
if(g_touchexplode)
if(time > self.touchexplode_time)
if(frametime)
player_anim();
- if (g_minstagib)
- minstagib_ammocheck();
-
if(g_ctf)
ctf_setstatus();
oldself = self; self = self.teamkill_soundsource;
oldpusher = self.pusher; self.pusher = oldself;
- PlayerSound(playersound_teamshoot, CHAN_VOICE, VOICETYPE_LASTATTACKER_ONLY);
+ PlayerSound(playersound_teamshoot, CH_VOICE, VOICETYPE_LASTATTACKER_ONLY);
self.pusher = oldpusher;
self = oldself;
if(time > self.taunt_soundtime)
{
self.taunt_soundtime = 0;
- PlayerSound(playersound_taunt, CHAN_VOICE, VOICETYPE_AUTOTAUNT);
+ PlayerSound(playersound_taunt, CH_VOICE, VOICETYPE_AUTOTAUNT);
}
target_voicescript_next(self);
{
// WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
float timeleft;
+ if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10
+ {
+ if(self.idlekick_lasttimeleft)
+ {
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING);
+ self.idlekick_lasttimeleft = 0;
+ }
+ return;
+ }
timeleft = ceil(sv_maxidle - (time - self.parm_idlesince));
+ if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10
+ {
+ if(!self.idlekick_lasttimeleft)
+ Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft);
+ }
if(timeleft <= 0)
{
bprint("^3", self.netname, "^3 was kicked for idling.\n");
else if(timeleft <= 10)
{
if(timeleft != self.idlekick_lasttimeleft)
- {
- centerprint_atprio(self, CENTERPRIO_IDLEKICK, strcat("^3Stop idling!\n^3Disconnecting in ", ftos(timeleft), "..."));
- AnnounceTo(self, strcat(ftos(timeleft), ""));
- }
- }
- else
- {
- centerprint_expire(self, CENTERPRIO_IDLEKICK);
+ AnnounceTo(self, ftos(timeleft));
+ self.idlekick_lasttimeleft = timeleft;
}
- self.idlekick_lasttimeleft = timeleft;
}
#ifdef TETRIS
CheatFrame();
+ //CheckPlayerJump();
+
if(self.classname == "player") {
CheckRules_Player();
UpdateChatBubble();
} else if (self.classname == "spectator") {
//do nothing
}
-
+
/*
float i;
for(i = 0; i < 1000; ++i)
if(self.waypointsprite_attachedforcarrier)
WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
-
+
if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
{
if(!self.showheadshotbbox)
else
{
if(self.showheadshotbbox)
- remove(self.showheadshotbbox);
+ if(self.showheadshotbbox && !wasfreed(self.showheadshotbbox))
+ remove(self.showheadshotbbox);
}
playerdemo_write();
W_NextWeapon (0);
break;
case 11:
- W_SwitchWeapon (self.cnt); // previously used
+ W_LastWeapon();
break;
case 12:
W_PreviousWeapon (0);
else
self.impulse = imp; // retry in next frame
}
+ else if(imp == 21)
+ {
+ PlayerUseKey ();
+ }
else if(imp >= 200 && imp <= 229)
{
if(self.deadflag == DEAD_NO)
switch(imp)
{
case 30:
- wp = WaypointSprite_DeployPersonal("waypoint", self.origin);
+ wp = WaypointSprite_DeployPersonal("waypoint", self.origin, RADARICON_WAYPOINT, '0 1 1');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
WaypointSprite_Ping(wp);
- }
sprint(self, "personal waypoint spawned at location\n");
break;
case 31:
WarpZone_crosshair_trace(self);
- wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos);
+ wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos, RADARICON_WAYPOINT, '0 1 1');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
WaypointSprite_Ping(wp);
- }
sprint(self, "personal waypoint spawned at crosshair\n");
break;
case 32:
if(vlen(self.death_origin))
{
- wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin);
+ wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin, RADARICON_WAYPOINT, '0 1 1');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
WaypointSprite_Ping(wp);
- }
sprint(self, "personal waypoint spawned at death location\n");
}
break;
case 33:
- if(self.deadflag == DEAD_NO && teams_matter)
+ if(self.deadflag == DEAD_NO && teamplay)
{
- wp = WaypointSprite_Attach("helpme", TRUE);
- if(wp)
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_HELPME, '1 0.5 0'); // TODO choose better color
+ wp = WaypointSprite_Attach("helpme", TRUE, RADARICON_HELPME, '1 0.5 0');
if(!wp)
- wp = self.waypointsprite_attachedforcarrier; // flag sprite?
- if(wp)
+ WaypointSprite_HelpMePing(self.waypointsprite_attachedforcarrier);
+ else
WaypointSprite_Ping(wp);
sprint(self, "HELP ME attached\n");
}
break;
case 34:
- wp = WaypointSprite_DeployFixed("here", FALSE, self.origin);
+ wp = WaypointSprite_DeployFixed("here", FALSE, self.origin, RADARICON_HERE, '0 1 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "HERE spawned at location\n");
break;
case 35:
WarpZone_crosshair_trace(self);
- wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos);
+ wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos, RADARICON_HERE, '0 1 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "HERE spawned at crosshair\n");
break;
case 36:
if(vlen(self.death_origin))
{
- wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin);
+ wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin, RADARICON_HERE, '0 1 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "HERE spawned at death location\n");
}
break;
case 37:
- wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin);
+ wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin, RADARICON_DANGER, '1 0.5 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "DANGER spawned at location\n");
break;
case 38:
WarpZone_crosshair_trace(self);
- wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos);
+ wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos, RADARICON_DANGER, '1 0.5 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "DANGER spawned at crosshair\n");
break;
case 39:
if(vlen(self.death_origin))
{
- wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin);
+ wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin, RADARICON_DANGER, '1 0.5 0');
if(wp)
- {
- WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
WaypointSprite_Ping(wp);
- }
sprint(self, "DANGER spawned at death location\n");
}
break;
case 107:
for(e = findchain(classname, "waypoint"); e; e = e.chain)
{
- e.colormod_x = 1;
+ e.colormod = '0.5 0.5 0.5';
e.effects &~= EF_NODEPTHTEST | EF_RED | EF_BLUE;
}
e2 = navigation_findnearestwaypoint(self, FALSE);
if(e.wpcost >= 10000000)
{
print("unreachable: ", etos(e), " ", vtos(e.origin), "\n");
- e.colormod_x = 0.1;
+ e.colormod_z = 8;
e.effects |= EF_NODEPTHTEST | EF_BLUE;
++i;
++m;
if(e.wpcost >= 10000000)
{
print("cannot reach me: ", etos(e), " ", vtos(e.origin), "\n");
- e.colormod_x = 0.1;
+ e.colormod_x = 8;
if not(e.effects & EF_NODEPTHTEST) // not already reported before
++m;
e.effects |= EF_NODEPTHTEST | EF_RED;
setmodel(e, self.model);
e.frame = self.frame;
e.skin = self.skin;
+ e.colormod = '8 0.5 8';
setsize(e, '0 0 0', '0 0 0');
++i;
}
}
if(i)
print(ftos(i), " spawnpoints have no nearest waypoint (marked by player model)\n");
+ i = 0;
+ entity start;
+ start = findchainflags(flags, FL_ITEM);
+ for(e = start; e; e = e.chain)
+ {
+ e.effects &~= EF_NODEPTHTEST | EF_RED | EF_BLUE;
+ e.colormod = '0.5 0.5 0.5';
+ }
+ for(e = start; e; e = e.chain)
+ {
+ if(navigation_findnearestwaypoint(e, FALSE))
+ {
+ }
+ else
+ {
+ print("item without waypoint: ", etos(e), " ", vtos(e.origin), "\n");
+ e.effects |= EF_NODEPTHTEST | EF_RED;
+ e.colormod_x = 8;
+ ++i;
+ }
+ }
+ if(i)
+ print(ftos(i), " items have no nearest waypoint and cannot be walked away from (marked with red light)\n");
+ i = 0;
+ for(e = start; e; e = e.chain)
+ {
+ org = e.origin;
+ if(navigation_findnearestwaypoint(e, TRUE))
+ {
+ }
+ else
+ {
+ print("item without waypoint: ", etos(e), " ", vtos(e.origin), "\n");
+ e.effects |= EF_NODEPTHTEST | EF_BLUE;
+ e.colormod_z = 8;
+ ++i;
+ }
+ }
+ if(i)
+ print(ftos(i), " items have no nearest waypoint and cannot be walked to (marked with blue light)\n");
break;
}
}
{
tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
+ {
doublejump = TRUE;
+
+ // we MUST clip velocity here!
+ float f;
+ f = self.velocity * trace_plane_normal;
+ if(f < 0)
+ self.velocity -= f * trace_plane_normal;
+ }
}
mjumpheight = autocvar_sv_jumpvelocity;
if (!(self.flags & FL_ONGROUND))
return;
- if(!sv_pogostick)
+ if(self.cvar_cl_movement_track_canjump)
if (!(self.flags & FL_JUMPRELEASED))
return;
setanim(self, self.anim_jump, FALSE, TRUE, TRUE);
if(g_jump_grunt)
- PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
self.restart_jump = -1; // restart jump anim next time
// value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
}
-
void CheckWaterJump()
{
local vector start, end;
}
}
};
+void CheckPlayerJump()
+{
+ if(self.flags & FL_ONGROUND)
+ {
+ if (autocvar_g_multijump > 0)
+ self.multijump_count = 0;
+ else
+ self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
+ }
+
+ if (self.BUTTON_JUMP)
+ PlayerJump ();
+ else
+ self.flags |= FL_JUMPRELEASED;
+
+ if (self.waterlevel == WATERLEVEL_SWIMMING)
+ CheckWaterJump ();
+ self.prevjumpbutton = self.BUTTON_JUMP;
+}
float racecar_angle(float forward, float down)
{
}
if(self.flags & FL_ONGROUND)
+ if(self.classname == "player") // no fall sounds for observers thank you very much
if(self.wasFlying)
{
self.wasFlying = 0;
if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
{
if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
- GlobalSound(globalsound_metalfall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ GlobalSound(globalsound_metalfall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
else
- GlobalSound(globalsound_fall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ GlobalSound(globalsound_fall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
}
}
}
self.wasFlying = 1;
if(self.classname == "player")
- {
- if(self.flags & FL_ONGROUND)
- {
- if (autocvar_g_multijump > 0)
- self.multijump_count = 0;
- else
- self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
- }
-
- if (self.BUTTON_JUMP)
- PlayerJump ();
- else
- self.flags |= FL_JUMPRELEASED;
-
- if (self.waterlevel == WATERLEVEL_SWIMMING)
- CheckWaterJump ();
- self.prevjumpbutton = self.BUTTON_JUMP;
- }
+ CheckPlayerJump();
if (self.flags & FL_WATERJUMP )
{
{
RaceCarPhysics();
}
- else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
+ else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY || self.movetype == MOVETYPE_FLY_WORLDONLY)
{
// noclipping or flying
self.flags &~= FL_ONGROUND;
.entity accuracy;
.float accuracy_frags[WEP_MAXCOUNT];
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_frags);
float weaponstats_buffer;
#define WEAPONSTATS_GETINDEX(awep,abot,vwep,vbot) (((vwep) + (awep) * (WEP_LAST - WEP_FIRST + 1) - (WEP_FIRST + WEP_FIRST * (WEP_LAST - WEP_FIRST + 1))) * 4 + (abot) * 2 + (vbot))
-void WeaponStats_Shutdown()
+void WeaponStats_ready(entity fh, entity pass, float status)
{
- float i, j, ibot, jbot, idx;
- float fh;
+ float i, j, n, ibot, jbot, idx;
vector v;
- string prefix;
- if(weaponstats_buffer < 0)
- return;
- prefix = strcat(autocvar_hostname, "\t", GetGametype(), "_", GetMapname(), "\t");
- if(autocvar_sv_weaponstats_file != "")
+ string prefix, s;
+ switch(status)
{
- fh = fopen(autocvar_sv_weaponstats_file, FILE_APPEND);
- if(fh >= 0)
- {
- fputs(fh, "#begin statsfile\n");
- fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
- fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_changes)), "\n"));
+ case URL_READY_CANWRITE:
+ // url_fopen returned, we can write
+ prefix = strcat(autocvar_hostname, "\t", GetGametype(), "_", GetMapname(), "\t");
+ url_fputs(fh, "#begin statsfile\n");
+ url_fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
+#ifdef WATERMARK
+ url_fputs(fh, strcat("#version ", WATERMARK(), "\n"));
+#endif
+ url_fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_purechanges)), "\n"));
+ url_fputs(fh, strcat("#cvar_purechanges ", ftos(cvar_purechanges_count), "\n"));
+ n = tokenizebyseparator(cvar_purechanges, "\n");
+ for(i = 0; i < n; ++i)
+ url_fputs(fh, strcat("#cvar_purechange ", argv(i), "\n"));
for(i = WEP_FIRST; i <= WEP_LAST; ++i) for(ibot = 0; ibot <= 1; ++ibot)
for(j = WEP_FIRST; j <= WEP_LAST; ++j) for(jbot = 0; jbot <= 1; ++jbot)
{
if(v != '0 0 0')
{
//vector is: kills hits damage
- fputs(fh, sprintf("%s%d %d\t%d %d\t", prefix, i, ibot, j, jbot));
- fputs(fh, sprintf("%d %d %g\n", v_x, v_y, v_z));
+ url_fputs(fh, sprintf("%s%d %d\t%d %d\t", prefix, i, ibot, j, jbot));
+ url_fputs(fh, sprintf("%d %d %g\n", v_x, v_y, v_z));
}
}
- fputs(fh, "#end\n\n");
- fclose(fh);
+ url_fputs(fh, "#end\n\n");
+ url_fclose(fh, WeaponStats_ready, world);
+ buf_del(weaponstats_buffer);
+ weaponstats_buffer = -1;
+ break;
+ case URL_READY_CANREAD:
+ // url_fclose is processing, we got a response for writing the data
+ // this must come from HTTP
+ print("Got response from weapon stats server:\n");
+ while((s = url_fgets(fh)))
+ print(" ", s, "\n");
+ print("End of response.\n");
+ url_fclose(fh, WeaponStats_ready, world);
+ break;
+ case URL_READY_CLOSED:
+ // url_fclose has finished
print("Weapon stats written\n");
- }
+ break;
+ case URL_READY_ERROR:
+ default:
+ print("Weapon stats writing failed: ", ftos(status), "\n");
+ break;
+ }
+}
+
+void WeaponStats_Shutdown()
+{
+ if(weaponstats_buffer < 0)
+ return;
+ if(autocvar_sv_weaponstats_file != "")
+ {
+ url_fopen(autocvar_sv_weaponstats_file, FILE_APPEND, WeaponStats_ready, world);
+ }
+ else
+ {
+ buf_del(weaponstats_buffer);
+ weaponstats_buffer = -1;
}
- buf_del(weaponstats_buffer);
- weaponstats_buffer = -1;
}
void WeaponStats_LogItem(float awep, float abot, float vwep, float vbot, vector item)
if(sound_allowed(MSG_BROADCAST, attacker))
{
if (save > 10)
- sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
else if (take > 30)
- sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
else if (take > 10)
- sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
}
if (take > 50)
float valid_damage_for_weaponstats;
float excess;
- if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage)
+ if((g_arena && numspawned < 2) || (g_ca && !ca_teams_ok) && !inWarmupStage)
return;
dh = max(self.health, 0);
if(sound_allowed(MSG_BROADCAST, attacker))
{
if (save > 10)
- sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
else if (take > 30)
- sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
else if (take > 10)
- sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
+ sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
}
if (take > 50)
// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
{
if(deathtype == DEATH_FALL)
- PlayerSound(playersound_fall, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_fall, CH_PAIN, VOICETYPE_PLAYERSOUND);
else if(self.health > 75) // TODO make a "gentle" version?
- PlayerSound(playersound_pain100, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_pain100, CH_PAIN, VOICETYPE_PLAYERSOUND);
else if(self.health > 50)
- PlayerSound(playersound_pain75, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_pain75, CH_PAIN, VOICETYPE_PLAYERSOUND);
else if(self.health > 25)
- PlayerSound(playersound_pain50, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_pain50, CH_PAIN, VOICETYPE_PLAYERSOUND);
else
- PlayerSound(playersound_pain25, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_pain25, CH_PAIN, VOICETYPE_PLAYERSOUND);
}
}
// escape a lava pit or similar
//self.pushltime = 0;
}
- else if(attacker.classname == "player" || attacker.classname == "gib")
+ else if(attacker.classname == "player")
{
self.pusher = attacker;
self.pushltime = time + autocvar_g_maxpushtime;
awep = DEATH_WEAPONOF(deathtype);
valid_damage_for_weaponstats = 1;
}
-
+
if(valid_damage_for_weaponstats)
{
dh = dh - max(self.health, 0);
if(sound_allowed(MSG_BROADCAST, attacker))
{
if(deathtype == DEATH_DROWN)
- PlayerSound(playersound_drown, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_drown, CH_PAIN, VOICETYPE_PLAYERSOUND);
else
- PlayerSound(playersound_death, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_death, CH_PAIN, VOICETYPE_PLAYERSOUND);
}
// get rid of kill indicator
if(self.flagcarried)
{
- if(attacker.classname != "player" && attacker.classname != "gib")
+ if(attacker.classname != "player")
DropFlag(self.flagcarried, self, attacker); // penalty for flag loss by suicide
else if(attacker.team == self.team)
DropFlag(self.flagcarried, attacker, attacker); // penalty for flag loss by suicide/teamkill
if(source.classname != "player")
colorstr = "^0"; // black for spectators
- else if(teams_matter)
+ else if(teamplay)
colorstr = Team_ColorCode(source.team);
else
teamsay = FALSE;
self.skinindex_for_playersound = self.skinindex;
ClearPlayerSounds();
LoadPlayerSounds("sound/player/default.sounds", 1);
- if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
- LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
+ if(!autocvar_g_debug_defaultsounds)
+ if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
+ LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
}
void FakeGlobalSound(string sample, float chan, float voicetype)
break;
case VOICETYPE_TEAMRADIO:
FOR_EACH_REALCLIENT(msg_entity)
- if(!teams_matter || msg_entity.team == self.team)
+ if(!teamplay || msg_entity.team == self.team)
{
if(msg_entity.cvar_cl_voice_directional == 1)
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
flood = Say(self, ownteam, world, msg, 1);
if (flood > 0)
- GlobalSound(self.sample, CHAN_VOICE, voicetype);
+ GlobalSound(self.sample, CH_VOICE, voicetype);
else if (flood < 0)
- FakeGlobalSound(self.sample, CHAN_VOICE, voicetype);
+ FakeGlobalSound(self.sample, CH_VOICE, voicetype);
}
void MoveToTeam(entity client, float team_colour, float type, float show_message)
W_CycleWeapon(self.cvar_cl_weaponpriority, +1);
}
+// previously used if exists and has ammo, (second) best otherwise
+void W_LastWeapon()
+{
+ if(client_hasweapon(self, self.cnt, TRUE, FALSE))
+ W_SwitchWeapon(self.cnt);
+ else
+ W_SwitchToOtherWeapon(self);
+}
+
float w_getbestweapon(entity e)
{
return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, FALSE, TRUE);
w = self.weapon;
if (w == 0)
return; // just in case
- if(self.weapon_forbidchange)
- return;
if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon))
return;
if(!autocvar_g_weapon_throwable)
if(!self.switchweapon)
{
self.weapon = 0;
+ self.switchingweapon = 0;
self.weaponentity.state = WS_CLEAR;
self.weaponname = "";
self.items &~= IT_AMMO;
{
if (self.weaponentity.state == WS_CLEAR)
{
+ // end switching!
+ self.switchingweapon = self.switchweapon;
+
//setanim(self, self.anim_draw, FALSE, TRUE, TRUE);
self.weaponentity.state = WS_RAISE;
weapon_action(self.switchweapon, WR_SETUP);
weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_weaponswitchdelay, w_ready);
weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');
}
+ else if (self.weaponentity.state == WS_DROP)
+ {
+ // in dropping phase we can switch at any time
+ self.switchingweapon = self.switchweapon;
+ }
else if (self.weaponentity.state == WS_READY)
{
+ // start switching!
+ self.switchingweapon = self.switchweapon;
+
#ifndef INDEPENDENT_ATTACK_FINISHED
if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5)
{
#endif
- // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
- sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_SINGLE, "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_DONTCHANGE, autocvar_g_balance_weaponswitchdelay, w_clear);
c = c + 1;
if(wb && ((self.weapons & wb) == 0))
{
- W_SwitchWeapon_Force(self, w_getbestweapon(self));
+ if(self.weapon == self.switchweapon)
+ W_SwitchWeapon_Force(self, w_getbestweapon(self));
wb = 0;
}
+
+ v_forward = fo;
+ v_right = ri;
+ v_up = up;
+
if(wb)
- {
- v_forward = fo;
- v_right = ri;
- v_up = up;
weapon_action(self.weapon, WR_THINK);
- }
+ else
+ weapon_action(self.weapon, WR_GONETHINK);
+
if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink)
{
if(self.weapon_think)
void W_SwitchWeapon_Force(entity e, float w)
{
- // don't switch to another weapon if we're not allowed to
- if(e.weapon_forbidchange)
- return;
-
e.cnt = e.switchweapon;
e.switchweapon = w;
e.selectweapon = w;
(time > ent.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)
) // prevent insane sound spam
{
- sound(ent, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+ sound(ent, CH_TRIGGER, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
ent.prevstrengthsound = time;
}
ent.prevstrengthsoundattempt = time;
.vector weapon_morph4origin;
.vector weapon_morph4angles;
.float weapon_morph4time;
-.string weaponname;
#define QCWEAPONANIMATION_ORIGIN(e) ((weapon_offset_x + e.view_ofs_x) * v_forward - (weapon_offset_y + e.view_ofs_y) * v_right + (weapon_offset_z + e.view_ofs_z) * v_up + weapon_adjust)
/*
self.weaponentity.model = "";
return;
}
- if (self.cnt != self.owner.weapon || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
+ if (self.weaponname != self.owner.weaponname || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
{
- self.cnt = self.owner.weapon;
+ self.weaponname = self.owner.weaponname;
self.dmg = self.owner.modelindex;
self.deadflag = self.owner.deadflag;
self.model = "";
return;
}
- if (self.cnt != self.owner.weapon || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
+ if (self.weaponname != self.owner.weaponname || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
{
- self.cnt = self.owner.weapon;
+ self.weaponname = self.owner.weaponname;
self.dmg = self.owner.modelindex;
self.deadflag = self.owner.deadflag;
if (self.owner.weaponname != "")
world, e.origin,
self, 0,
world, enemy,
- 0
+ 0,
+ RADARICON_NONE, '0 0 0'
);
}
}
void w_clear()
{
if (self.weapon != -1)
+ {
self.weapon = 0;
+ self.switchingweapon = 0;
+ }
if (self.weaponentity)
{
self.weaponentity.state = WS_CLEAR;
// the two weapon entities will notice this has changed and update their models
self.weapon = windex;
+ self.switchingweapon = windex; // to make sure
self.weaponname = e.mdl;
self.bulletcounter = 0;
};
if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
{
- sound (self, CHAN_AUTO, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
self.prevdryfire = time;
}
// now begin the reloading process
- sound (self, CHAN_WEAPON2, self.reload_sound, VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_B, self.reload_sound, VOL_BASE, ATTN_NORM);
// do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon,
// then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
entity nagger;
float readycount;
+
float Nagger_SendEntity(entity to, float sendflags)
{
float nags, i, f, b;
entity e;
WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER);
+ // bits:
+ // 1 = ready
+ // 2 = player needs to ready up
+ // 4 = vote
+ // 8 = player needs to vote
+ // 16 = warmup
+ // sendflags:
+ // 64 = vote counts
+ // 128 = vote string
+
nags = 0;
if(readycount)
{
if(inWarmupStage)
nags |= 16;
+ if(sendflags & 64)
+ nags |= 64;
+
if(sendflags & 128)
nags |= 128;
+ if(!(nags & 4)) // no vote called? send no string
+ nags &~= (64 | 128);
+
WriteByte(MSG_ENTITY, nags);
- if(nags & 128)
+ if(nags & 64)
{
- WriteString(MSG_ENTITY, votecalledvote_display);
+ WriteByte(MSG_ENTITY, vote_yescount);
+ WriteByte(MSG_ENTITY, vote_nocount);
+ WriteByte(MSG_ENTITY, vote_needed_absolute);
+ WriteChar(MSG_ENTITY, to.vote_vote);
}
+ if(nags & 128)
+ WriteString(MSG_ENTITY, votecalledvote_display);
+
if(nags & 1)
{
for(i = 1; i <= maxclients; i += 8)
void Nagger_VoteCountChanged()
{
if(nagger)
- nagger.SendFlags |= 1;
+ nagger.SendFlags |= 64;
}
void Nagger_ReadyCounted()
{
ClientKill_TeamChange(-2); // observe
} else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) {
//JoinBestTeam(self, FALSE, TRUE);
- } else if(teams_matter && !autocvar_sv_spectate && !(self.team_forced > 0)) {
+ } else if(teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) {
self.classname = "observer";
stuffcmd(self,"menu_showteamselect\n");
}
if(self.classname == "player" && autocvar_sv_spectate == 1) {
ClientKill_TeamChange(-2); // observe
}
+ if(g_ca && self.caplayer && (self.classname == "spectator" || self.classname == "observer")) {
+ // in CA, allow a dead player to move to spectatators (without that, caplayer!=0 will be moved back to the player list)
+ sprint(self, "WARNING: you will spectate in the next round.\n");
+ self.caplayer = 0;
+ }
} else if(cmd == "join") {
if not(self.flags & FL_CLIENT)
return;
}
else {
//player may not join because of g_maxplayers is set
- centerprint_atprio(self, CENTERPRIO_MAPVOTE, PREVENT_JOIN_TEXT);
+ centerprint(self, PREVENT_JOIN_TEXT);
}
}
} else if( cmd == "selectteam" ) {
if not(self.flags & FL_CLIENT)
return;
- if( !teams_matter ) {
+ if( !teamplay ) {
sprint( self, "selectteam can only be used in teamgames\n");
} else if(autocvar_g_campaign) {
//JoinBestTeam(self, 0);
} else if(lockteams) {
sprint( self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n");
} else if( argv(1) == "red" ) {
- ClientKill_TeamChange(COLOR_TEAM1);
+ if(self.team != COLOR_TEAM1 || self.deadflag != DEAD_NO)
+ ClientKill_TeamChange(COLOR_TEAM1);
+ else
+ sprint( self, "^7You already are on that team.\n");
} else if( argv(1) == "blue" ) {
- ClientKill_TeamChange(COLOR_TEAM2);
+ if(self.team != COLOR_TEAM2 || self.deadflag != DEAD_NO)
+ ClientKill_TeamChange(COLOR_TEAM2);
+ else
+ sprint( self, "^7You already are on that team.\n");
} else if( argv(1) == "yellow" ) {
- ClientKill_TeamChange(COLOR_TEAM3);
+ if(self.team != COLOR_TEAM3 || self.deadflag != DEAD_NO)
+ ClientKill_TeamChange(COLOR_TEAM3);
+ else
+ sprint( self, "^7You already are on that team.\n");
} else if( argv(1) == "pink" ) {
- ClientKill_TeamChange(COLOR_TEAM4);
+ if(self.team != COLOR_TEAM4 || self.deadflag != DEAD_NO)
+ ClientKill_TeamChange(COLOR_TEAM4);
+ else
+ sprint( self, "^7You already are on that team.\n");
} else if( argv(1) == "auto" ) {
ClientKill_TeamChange(-1);
} else {
readycount = 0;
Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client
- if(autocvar_teamplay_lockonrestart && teams_matter) {
+ if(autocvar_teamplay_lockonrestart && teamplay) {
lockteams = 1;
bprint("^1The teams are now locked.\n");
}
float MOVETYPE_BOUNCE = 10;
float MOVETYPE_BOUNCEMISSILE = 11; // Like bounce but doesn't lose speed on bouncing
//float MOVETYPE_FOLLOW = 12; // 'Attaches' the entity to its aim_ent
+//float MOVETYPE_FLY_WORLDONLY = 33;
float SOLID_NOT = 0;
float SOLID_TRIGGER = 1;
e.SendFlags |= 0x08;
}
}
-
-.void(void) csqcprojectile_oldthink;
-.float csqcprojectile_oldnextthink;
-
-void CSQCProjectile_Update_Think()
-{
- UpdateCSQCProjectile(self);
- self.think = self.csqcprojectile_oldthink;
- self.nextthink = max(time, self.csqcprojectile_oldnextthink);
-}
-
-void UpdateCSQCProjectileNextFrame(entity e)
-{
- if(e.SendEntity == CSQCProjectile_SendEntity)
- if(e.think != CSQCProjectile_Update_Think)
- {
- e.csqcprojectile_oldthink = e.think;
- e.csqcprojectile_oldnextthink = e.nextthink;
- e.think = CSQCProjectile_Update_Think;
- e.nextthink = time;
- }
-}
void CSQCProjectile(entity e, float clientanimate, float type, float docull);
void UpdateCSQCProjectile(entity e);
void UpdateCSQCProjectileAfterTeleport(entity e);
-void UpdateCSQCProjectileNextFrame(entity e);
void CSQCProjectile_Check(entity e);
// player is in the worse half, if >= half the players are better than him, or consequently, if < half of the players are worse
// use this rule here
-
+
if(players_worseeq >= players_total * captureshield_max_ratio)
return FALSE;
{
if(should)
{
- centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Make some defensive scores before trying again.");
+ Send_CSQC_Centerprint_Generic(other, CPID_CTF_CAPTURESHIELD, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.", 5, 0);
// TODO csqc notifier for this
}
else
{
- centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.");
+ Send_CSQC_Centerprint_Generic(p, CPID_CTF_CAPTURESHIELD, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.", 5, 0);
// TODO csqc notifier for this
}
p.ctf_captureshielded = should;
return TRUE;
}
+.float ctf_captureshield_touch_msgtime;
void ctf_captureshield_touch()
{
if not(other.ctf_captureshielded)
mymid = (self.absmin + self.absmax) * 0.5;
othermid = (other.absmin + other.absmax) * 0.5;
Damage(other, self, self, 0, DEATH_HURTTRIGGER, mymid, normalize(othermid - mymid) * captureshield_force);
- centerprint_atprio(other, CENTERPRIO_SHIELDING, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.");
+ if (time - other.ctf_captureshield_touch_msgtime > 2)
+ Send_CSQC_Centerprint_Generic(other, CPID_CTF_CAPTURESHIELD, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.", 5, 0);
+ other.ctf_captureshield_touch_msgtime = time;
}
void ctf_flag_spawnstuff()
self.basewaypoint = self.nearestwaypoint;
if(self.team == COLOR_TEAM1)
- {
- WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite);
- WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
- }
+ WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
else
- {
- WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite);
- WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
- }
+ WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
}
float ctf_score_value(string parameter)
ctf_captureshield_update(p, 0); // shield only
e.playerid = attacker.playerid;
e.ctf_droptime = time;
- WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE);
+ WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
+ WaypointSprite_Ping(e.waypointsprite_attachedforcarrier);
if(p.waypointsprite_attachedforcarrier)
{
- WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
WaypointSprite_DetachCarrier(p);
}
else
backtrace("Flag carrier had no flag sprite?!?");
}
LogCTF("dropped", p.team, p);
- sound (self, CHAN_TRIGGER, self.noise4, VOL_BASE, ATTN_NONE);
+ sound (p, CH_TRIGGER, self.noise4, VOL_BASE, ATTN_NONE);
setattachment(e, world, "");
e.damageforcescale = autocvar_g_balance_ctf_damageforcescale;
{
bprint("The ", self.netname, " became impatient after ", ftos_decimals(flagcaptimerecord, 2), " seconds and returned itself\n");
- sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
+ sound (self, CH_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
self.owner.impulse = 141; // returning!
e = self;
if (time > self.pain_finished)
{
bprint("The ", self.netname, " has returned to base\n");
- sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
+ sound (self, CH_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
LogCTF("returned", self.team, world);
ReturnFlag(self);
}
DropFlag(self, world, world);
return;
}
-
- if(autocvar_g_ctf_allow_drop)
- if(e.BUTTON_USE)
- DropFlag(self, e, world);
};
+float ctf_usekey()
+{
+ if(self.flagcarried)
+ {
+ DropFlag(self.flagcarried, self, world);
+ return TRUE;
+ }
+ return FALSE;
+}
+
void flag_cap_ring_spawn(vector org)
{
shockwave_spawn("models/ctf/shockwavetransring.md3", org - '0 0 15', -0.8, 0, 1);
}
}
- sound (other, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
+ sound (other, CH_TRIGGER, self.noise2, VOL_BASE, ATTN_NONE);
WaypointSprite_DetachCarrier(other);
if(self.speedrunning)
FakeTimeLimit(other, -1);
{
if (other.next_take_time > time)
return;
-
+
if (autocvar_g_ctf_flag_pickup_effects) // pickup effect
pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-
+
// pick up
self.flagpickuptime = time; // used for timing runs
self.speedrunning = other.speedrunning; // if speedrunning, flag will self-return and teleport the owner back after the record
self.dropperid = other.playerid;
PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
LogCTF("steal", self.team, other);
- sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+ sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
FOR_EACH_PLAYER(player)
if(player.team == self.team)
self.movetype = MOVETYPE_NONE;
setorigin(self, FLAG_CARRY_POS);
setattachment(self, other, "");
- WaypointSprite_AttachCarrier("flagcarrier", other);
- WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+ WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
WaypointSprite_Ping(self.sprite);
return;
}
PlayerScore_Add(other, SP_CTF_RETURNS, 1);
LogCTF("return", self.team, other);
- sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
+ sound (other, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NONE);
ReturnFlag(self);
}
else if (!other.flagcarried && (other.playerid != self.dropperid || time > self.ctf_droptime + autocvar_g_balance_ctf_delay_collect))
if (autocvar_g_ctf_flag_pickup_effects) // field pickup effect
pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-
+
// pick up
self.solid = SOLID_NOT;
setorigin(self, self.origin); // relink
UpdateFrags(other, f);
PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
LogCTF("pickup", self.team, other);
- sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+ sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
FOR_EACH_PLAYER(player)
if(player.team == self.team)
setattachment(self, other, "");
self.damageforcescale = 0;
self.takedamage = DAMAGE_NO;
- WaypointSprite_AttachCarrier("flagcarrier", other);
- WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+ WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
}
}
};
if(self.team == COLOR_TEAM2)
// Blue
self.glow_color = 210;
-
+
self.glow_size = 25;
self.glow_trail = 1;
}
(default ctf/respawn.wav)
*/
+void spawnfunc_item_flag_team2();
void spawnfunc_item_flag_team1()
{
if (!g_ctf)
return;
}
+ if (g_ctf_reverse)
+ {
+ float old_g_ctf_reverse = g_ctf_reverse;
+ g_ctf_reverse = 0; // avoid an endless loop
+ spawnfunc_item_flag_team2();
+ g_ctf_reverse = old_g_ctf_reverse;
+ return;
+ }
+
// link flag into ctf_worldflaglist
self.ctf_worldflagnext = ctf_worldflaglist;
ctf_worldflaglist = self;
self.classname = "item_flag_team";
- if(g_ctf_reverse)
- {
- self.team = COLOR_TEAM2; // color 13 team (blue)
- self.items = IT_KEY1; // silver key (bluish enough)
- }
- else
- {
- self.team = COLOR_TEAM1; // color 4 team (red)
- self.items = IT_KEY2; // gold key (redish enough)
- }
+ self.team = COLOR_TEAM1; // color 4 team (red)
+ self.items = IT_KEY2; // gold key (redish enough)
self.netname = "^1RED^7 flag";
self.target = "###item###";
self.skin = autocvar_g_ctf_flag_red_skin;
return;
}
+ if (g_ctf_reverse)
+ {
+ float old_g_ctf_reverse = g_ctf_reverse;
+ g_ctf_reverse = 0; // avoid an endless loop
+ spawnfunc_item_flag_team1();
+ g_ctf_reverse = old_g_ctf_reverse;
+ return;
+ }
+
// link flag into ctf_worldflaglist
self.ctf_worldflagnext = ctf_worldflaglist;
ctf_worldflaglist = self;
self.classname = "item_flag_team";
- if(g_ctf_reverse)
- {
- self.team = COLOR_TEAM1; // color 4 team (red)
- self.items = IT_KEY2; // gold key (redish enough)
- }
- else
- {
- self.team = COLOR_TEAM2; // color 13 team (blue)
- self.items = IT_KEY1; // silver key (bluish enough)
- }
+ self.team = COLOR_TEAM2; // color 13 team (blue)
+ self.items = IT_KEY1; // silver key (bluish enough)
self.netname = "^4BLUE^7 flag";
self.target = "###item###";
self.skin = autocvar_g_ctf_flag_blue_skin;
entity pl;
if(cteam != COLOR_TEAM1 || cteam != COLOR_TEAM2)
return world;
-
+
FOR_EACH_REALPLAYER(pl) {
if(pl.team == cteam && pl.iscommander) {
return pl;
void(float cteam) ctf_new_commander =
{
entity pl, plmax;
-
+
plmax = world;
FOR_EACH_REALPLAYER(pl) {
if(pl.team == cteam) {
void() ctf_clientconnect =
{
self.iscommander = FALSE;
-
+
if(!self.team || self.classname != "player") {
ctf_setstate(self, -1);
} else
ctf_setstate(self, 0);
self.team_saved = self.team;
-
+
if(self.team != 0 && self.classname == "player" && !ctf_team_has_commander(self.team)) {
ctf_new_commander(self.team);
}
ctf_setstate(self, -1);
ctf_new_commander(self.team_saved);
}
-
+
self.team_saved = self.team;
-
+
ctf_new_commander(self.team);
};
.entity weaponentity;
.entity exteriorweaponentity;
.vector weaponentity_glowmod;
-.float switchweapon;
+
+//.float weapon; // current weapon
+.float switchweapon; // weapon requested to switch to
+.float switchingweapon; // weapon currently being switched to (is copied from switchweapon once switch is possible)
+.string weaponname; // name of .weapon
+
.float autoswitch;
float weapon_action(float wpn, float wrequest);
float client_hasweapon(entity cl, float wpn, float andammo, float complain);
void w_ready();
// VorteX: standalone think for weapons, so normal think on weaponentity can be reserved by weaponflashes (which needs update even player dies)
.float weapon_nextthink;
-.float weapon_forbidchange;
.void() weapon_think;
//float PLAYER_WEAPONSELECTION_DELAY = );
string w_deathtypestring;
-void(entity client, string s) centerprint_builtin = #73;
.vector dest1, dest2;
float gameover;
.float runes;
-.float welcomemessage_time;
.float version;
// minstagib vars
void timeoutHandler_Think();
void evaluateTimeout();
void evaluateTimein();
-string getTimeoutText(float addOneSecond);
.float spawnshieldtime;
.float() customizeentityforclient;
.float cvar_cl_handicap;
.float cvar_cl_playerdetailreduction;
-.float cvar_scr_centertime;
+.float cvar_cl_clippedspectating;
+.float cvar_cl_movement_track_canjump;
+
.string cvar_g_xonoticversion;
.string cvar_cl_weaponpriority;
.string cvar_cl_weaponpriorities[10];
.entity jumppadsused[NUM_JUMPPADSUSED];
string gamemode_name;
-float teams_matter;
float startitem_failed;
float weaponsInMap;
-void centerprint_atprio(entity e, float prio, string s);
-void centerprint_expire(entity e, float prio);
-void centerprint(entity e, string s);
-
.float respawn_countdown; // next number to count
float bot_waypoints_for_items;
// speedrun: when 1, player auto teleports back when capture timeout happens
.float speedrunning;
-// Q3 support
-float q3acompat_machineshotgunswap;
-
// database
float ServerProgsDB;
float TemporaryDB;
float sv_maxidle;
float sv_maxidle_spectatorsareidle;
-float sv_pogostick;
float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end);
float next_pingtime;
// TODO implemented fall and falling
#define ALLPLAYERSOUNDS \
_VOICEMSG(death) \
- _VOICEMSG(fall) \
_VOICEMSG(drown) \
+ _VOICEMSG(fall) \
+ _VOICEMSG(fall) \
+ _VOICEMSG(falling) \
_VOICEMSG(gasp) \
_VOICEMSG(jump) \
+ _VOICEMSG(pain100) \
_VOICEMSG(pain25) \
_VOICEMSG(pain50) \
- _VOICEMSG(pain75) \
- _VOICEMSG(pain100)
+ _VOICEMSG(pain75)
+
#define ALLVOICEMSGS \
_VOICEMSG(attack) \
_VOICEMSG(attackinfive) \
+ _VOICEMSG(coverme) \
+ _VOICEMSG(defend) \
+ _VOICEMSG(freelance) \
+ _VOICEMSG(incoming) \
_VOICEMSG(meet) \
+ _VOICEMSG(needhelp) \
_VOICEMSG(seenflag) \
_VOICEMSG(taunt) \
_VOICEMSG(teamshoot)
ALLVOICEMSGS
#undef _VOICEMSG
-// reserved sound names for the future (models lack sounds for them):
+// reserved sound names for the future (some models lack sounds for them):
+// _VOICEMSG(flagcarriertakingdamage) \
+// _VOICEMSG(getflag) \
+// reserved sound names for the future (ALL models lack sounds for them):
// _VOICEMSG(affirmative) \
// _VOICEMSG(attacking) \
// _VOICEMSG(defending) \
// _VOICEMSG(roaming) \
// _VOICEMSG(onmyway) \
// _VOICEMSG(droppedflag) \
-// _VOICEMSG(flagcarriertakingdamage) \
// _VOICEMSG(negative) \
// _VOICEMSG(seenenemy) \
-// _VOICEMSG(fall) \
-// _VOICEMSG(getflag) \
-// _VOICEMSG(incoming) \
-// _VOICEMSG(coverme) \
-// _VOICEMSG(needhelp) \
-// _VOICEMSG(defend) \
-// _VOICEMSG(freelance) \
-// _VOICEMSG(falling) \
string globalsound_fall;
string globalsound_metalfall;
.float version_mismatch;
float independent_players;
+#define INDEPENDENT_PLAYERS (autocvar__independent_players ? (autocvar__independent_players > 0) : independent_players)
#define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
#define MAKE_INDEPENDENT_PLAYER(e) (((e).solid = SOLID_TRIGGER) + ((e).frags = FRAGS_PLAYER_NONSOLID))
// we're using + here instead of , because fteqcc sucks
.string target2;
.string target3;
.string target4;
+.float target_random;
.float trigger_reverse;
// Nexball
vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
-// the QC VM sucks
-#define BITXOR(v,b) ((v) + (b) - 2 * ((v) & (b)))
-#define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))
-
.float wasplayer;
float servertime, serverprevtime, serverframetime;
..float current_ammo;
-.float weapon_load[WEP_MAXCOUNT]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(weapon_load);
+.float weapon_load[WEP_MAXCOUNT];
.float ammo_none; // used by the reloading system, must always be 0
.float clip_load;
.float old_clip_load;
.entity muzzle_flash;
.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
+
+void PlayerUseKey();
float pps_pink;
void set_dom_state(entity e)
{
- // BIG ugly hack to make stat sending work
e.dom_total_pps = total_pps;
e.dom_pps_red = pps_red;
e.dom_pps_blue = pps_blue;
if (head.noise != "")
if(self.enemy)
- sound(self.enemy, CHAN_AUTO, head.noise, VOL_BASE, ATTN_NORM);
+ sound(self.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
else
- sound(self, CHAN_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
if (head.noise1 != "")
play2all(head.noise1);
self.delay = old_delay;
self.team = old_team;
- switch(self.team)
- {
- // "fix" pps when slightly under 0 because of approximation errors
- case COLOR_TEAM1:
- pps_red -= (points/wait_time);
- if (pps_red < 0) pps_red = 0;
- break;
- case COLOR_TEAM2:
- pps_blue -= (points/wait_time);
- if (pps_blue < 0) pps_blue = 0;
- break;
- case COLOR_TEAM3:
- pps_yellow -= (points/wait_time);
- if (pps_yellow < 0) pps_yellow = 0;
- break;
- case COLOR_TEAM4:
- pps_pink -= (points/wait_time);
- if (pps_pink < 0) pps_pink = 0;
- }
-
switch(self.goalentity.team)
{
- // "fix" pps when slightly over total_pps because of approximation errors
case COLOR_TEAM1:
- pps_red += (points/wait_time);
- if (pps_red > total_pps) pps_red = total_pps;
WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
break;
case COLOR_TEAM2:
- pps_blue += (points/wait_time);
- if (pps_blue > total_pps) pps_blue = total_pps;
WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
break;
case COLOR_TEAM3:
- pps_yellow += (points/wait_time);
- if (pps_yellow > total_pps) pps_yellow = total_pps;
WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
break;
case COLOR_TEAM4:
- pps_pink += (points/wait_time);
- if (pps_pink > total_pps) pps_pink = total_pps;
WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
}
+ total_pps = 0, pps_red = 0, pps_blue = 0, pps_yellow = 0, pps_pink = 0;
+ for(head = world; (head = find(head, classname, "dom_controlpoint")) != world; )
+ {
+ if (autocvar_g_domination_point_amt)
+ points = autocvar_g_domination_point_amt;
+ else
+ points = head.frags;
+ if (autocvar_g_domination_point_rate)
+ wait_time = autocvar_g_domination_point_rate;
+ else
+ wait_time = head.wait;
+ switch(head.goalentity.team)
+ {
+ case COLOR_TEAM1:
+ pps_red += points/wait_time;
+ break;
+ case COLOR_TEAM2:
+ pps_blue += points/wait_time;
+ break;
+ case COLOR_TEAM3:
+ pps_yellow += points/wait_time;
+ break;
+ case COLOR_TEAM4:
+ pps_pink += points/wait_time;
+ }
+ total_pps += points/wait_time;
+ }
+
WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
WaypointSprite_Ping(self.sprite);
self.wait = 5;
float points, waittime;
- if (autocvar_g_domination_point_rate)
- points = autocvar_g_domination_point_rate;
+ if (autocvar_g_domination_point_amt)
+ points = autocvar_g_domination_point_amt;
else
points = self.frags;
- if (autocvar_g_domination_point_amt)
- waittime = autocvar_g_domination_point_amt;
+ if (autocvar_g_domination_point_rate)
+ waittime = autocvar_g_domination_point_rate;
else
waittime = self.wait;
droptofloor();
waypoint_spawnforitem(self);
- WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite);
- WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');
+ WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite, RADARICON_DOMPOINT, '0 1 1');
};
return FALSE;
if(other == o)
return FALSE;
- if(other.classname == "player")
- if(!teams_matter || o.team != other.team)
+ if((other.classname == "player") || other.caplayer)
+ if(!teamplay || o.team != other.team)
if not (radar_showennemies)
return FALSE;
return TRUE;
//description:
//controls rendering scale of the object, 0 is forced to be 1, darkplaces uses 1/16th accuracy and a limit of 15.9375, can be used to make an object larger or smaller.
+//DP_ENT_TRAILEFFECTNUM
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//field definitions:
+.float traileffectnum;
+//description:
+//use a custom effectinfo.txt effect on this entity, assign it like this:
+//self.traileffectnum = particleeffectnum("mycustomeffect");
+//this will do both the dlight and particle trail as described in the effect, basically equivalent to trailparticles() in CSQC but performed on a server entity.
+
//DP_ENT_VIEWMODEL
//idea: LordHavoc
//darkplaces implementation: LordHavoc
//description:
//this is a very special capability, attachs the entity to the view of the client specified, origin and angles become relative to the view of that client, all effects can be used (multiple skins on a weapon model etc)... the entity is not visible to any other client.
-//DP_GECKO_SUPPORT
-//idea: Res2k, BlackHC
-//darkplaces implementation: Res2k, BlackHC
-//constant definitions:
-float GECKO_BUTTON_DOWN = 0;
-float GECKO_BUTTON_UP = 1;
-// either use down and up or just press but not all of them!
-float GECKO_BUTTON_PRESS = 2;
-// use this for mouse events if needed?
-float GECKO_BUTTON_DOUBLECLICK = 3;
-//builtin definitions:
-float(string name) gecko_create( string name ) = #487;
-void(string name) gecko_destroy( string name ) = #488;
-void(string name) gecko_navigate( string name, string URI ) = #489;
-float(string name) gecko_keyevent( string name, float key, float eventtype ) = #490;
-void gecko_mousemove( string name, float x, float y ) = #491;
-void gecko_resize( string name, float w, float h ) = #492;
-vector gecko_get_texture_extent( string name ) = #493;
-//engine-called QC prototypes:
-//string(string name, string query) Qecko_Query;
-//description:
-//provides an interface to the offscreengecko library and allows for internet browsing in games
-
//DP_GFX_EXTERNALTEXTURES
//idea: LordHavoc
//darkplaces implementation: LordHavoc
//description:
//MOVETYPE_BOUNCE but without gravity, and with full reflection (no speed loss like grenades have), in other words - bouncing laser bolts.
+//DP_MOVETYPEFLYWORLDONLY
+//idea: Samual
+//darkplaces implementation: Samual
+//movetype definitions:
+float MOVETYPE_FLY_WORLDONLY = 33;
+//description:
+//like MOVETYPE_FLY, but does all traces with MOVE_WORLDONLY, and is ignored by MOVETYPE_PUSH. Should only be combined with SOLID_NOT and SOLID_TRIGGER.
+
//DP_NULL_MODEL
//idea: Chris
//darkplaces implementation: divVerent
//the engine plays sound/cdtracks/track001.wav instead of cd track 1 and so on if found, this allows games and mods to have music tracks without using ambientsound.
//Note: also plays .ogg with DP_SND_OGGVORBIS extension.
+//DP_SND_SOUND7_WIP1
+//idea: divVerent
+//darkplaces implementation: divVerent
+//builtin definitions:
+void(entity e, float chan, string samp, float vol, float atten, float speed, float flags) sound7 = #8;
+float SOUNDFLAG_RELIABLE = 1;
+//description:
+//plays a sound, with some more flags
+//extensions to sound():
+//- channel may be in the range from -128 to 127; channels -128 to 0 are "auto",
+// i.e. support multiple sounds at once, but cannot be stopped/restarted
+//- a speed parameter has been reserved for later addition of pitch shifting.
+// it MUST be set to 0 for now, meaning "no pitch change"
+//- the flag SOUNDFLAG_RELIABLE can be specified, which makes the sound send
+// to MSG_ALL (reliable) instead of MSG_BROADCAST (unreliable, default);
+// similarily, SOUNDFLAG_RELIABLE_TO_ONE sends to MSG_ONE
+//- channel 0 is controlled by snd_channel0volume; channel 1 and -1 by
+// snd_channel1volume, etc. (so, a channel shares the cvar with its respective
+// auto-channel); however, the mod MUST define snd_channel8volume and upwards
+// in default.cfg if they are to be used, as the engine does not create them
+// to not litter the cvar list
+//- this extension applies to CSQC as well; CSQC_Event_Sound will get speed and
+// flags as extra 7th and 8th argument
+//- WIP2 ideas: SOUNDFLAG_RELIABLE_TO_ONE, SOUNDFLAG_NOPHS, SOUNDFLAG_FORCELOOP
+//- NOTE: to check for this, ALSO OR a check with DP_SND_SOUND7 to also support
+// the finished extension once done
+
//DP_SND_OGGVORBIS
//idea: Transfusion
//darkplaces implementation: Elric
void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
void(entity e, vector torque) physics_addtorque = #542; // add relative torque
//description: provides Open Dynamics Engine support, requires extenal dll to be present or engine compiled with statical link option
-//be sure to checkextension for it to know if library i loaded and ready, also to enable physics set "physice_ode" cvar to 1
+//be sure to checkextension for it to know if library is loaded and ready, also to enable physics set "physics_ode" cvar to 1
//note: this extension is highly experimental and may be unstable
//note: use SOLID_BSP on entities to get a trimesh collision models on them
{
self.health = self.max_health;
self.takedamage = DAMAGE_NO;
+ self.bot_attack = FALSE;
self.event_damage = SUB_Null;
self.state = 1;
func_breakable_colormod();
WaypointSprite_UpdateHealth(self.sprite, self.health);
}
self.takedamage = DAMAGE_AIM;
+ self.bot_attack = TRUE;
self.event_damage = func_breakable_damage;
self.state = 0;
self.nextthink = 0; // cancel auto respawn
func_breakable_destroyed();
if(self.noise)
- sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
if(self.dmg)
RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
Net_LinkEntity(e, FALSE, 0.2, Damage_DamageInfo_SendEntity);
}
-#define DAMAGE_CENTERPRINT_SPACER NEWLINES
-
float checkrules_firstblood;
float yoda;
float IsDifferentTeam(entity a, entity b)
{
- if(teams_matter)
+ if(teamplay)
{
if(a.team == b.team)
return 0;
{
// regular frag
PlayerScore_Add(attacker, SP_KILLS, 1);
+ if(targ.playerid)
+ PlayerStats_Event(attacker, sprintf("kills-%d", targ.playerid), 1);
}
PlayerScore_Add(targ, SP_DEATHS, 1);
void Send_KillNotification (string s1, string s2, string s3, float msg, float type)
{
WriteByte(MSG_ALL, SVC_TEMPENTITY);
- WriteByte(MSG_ALL, TE_CSQC_NOTIFY);
- WriteByte(MSG_ALL, CSQC_KILLNOTIFY);
+ WriteByte(MSG_ALL, TE_CSQC_KILLNOTIFY);
WriteString(MSG_ALL, s1);
WriteString(MSG_ALL, s2);
WriteString(MSG_ALL, s3);
}
// Function is used to send a generic centerprint whose content CSQC gets to decide (gentle version or not in the below cases)
-void Send_CSQC_Centerprint(entity e, string s1, string s2, float msg, float type)
+void Send_CSQC_KillCenterprint(entity e, string s1, string s2, float msg, float type)
{
if (clienttype(e) == CLIENTTYPE_REAL)
{
msg_entity = e;
WRITESPECTATABLE_MSG_ONE({
WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_NOTIFY);
- WriteByte(MSG_ONE, CSQC_CENTERPRINT);
+ WriteByte(MSG_ONE, TE_CSQC_KILLCENTERPRINT);
WriteString(MSG_ONE, s1);
WriteString(MSG_ONE, s2);
WriteShort(MSG_ONE, msg);
string s, a, msg;
float w, type;
- if (targ.classname == "player" || targ.classname == "corpse")
+ if (targ.classname == "player")
{
- if (targ.classname == "corpse")
- s = "A corpse";
- else
- s = targ.netname;
-
+ s = targ.netname;
a = attacker.netname;
if (targ == attacker) // suicides
if (deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
msg = ColoredTeamName(targ.team); // TODO: check if needed?
if(!g_cts) // no "killed your own dumb self" message in CTS
- Send_CSQC_Centerprint(targ, msg, "", deathtype, MSG_SUICIDE);
+ Send_CSQC_KillCenterprint(targ, msg, "", deathtype, MSG_SUICIDE);
if(deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_QUIET)
{
if (targ.killcount > 2)
msg = ftos(targ.killcount);
- if(teams_matter && deathtype == DEATH_MIRRORDAMAGE)
+ if(teamplay && deathtype == DEATH_MIRRORDAMAGE)
{
if(attacker.team == COLOR_TEAM1)
deathtype = KILL_TEAM_RED;
Send_KillNotification(s, msg, ftos(w), deathtype, MSG_SUICIDE);
}
- else if (attacker.classname == "player" || attacker.classname == "gib")
+ else if (attacker.classname == "player")
{
- if(teams_matter && attacker.team == targ.team)
+ if(teamplay && attacker.team == targ.team)
{
if(attacker.team == COLOR_TEAM1)
type = KILL_TEAM_RED;
GiveFrags(attacker, targ, -1, deathtype);
- Send_CSQC_Centerprint(attacker, s, "", type, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, "", type, MSG_KILL);
if (targ.killcount > 2) {
msg = ftos(targ.killcount);
checkrules_firstblood = TRUE;
Send_KillNotification(a, "", "", KILL_FIRST_BLOOD, MSG_KILL);
// TODO: make these print a newline if they dont
- Send_CSQC_Centerprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
- Send_CSQC_Centerprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
}
if((autocvar_sv_fragmessage_information_typefrag) && (targ.BUTTON_CHAT)) {
- Send_CSQC_Centerprint(attacker, s, GetAdvancedDeathReports(targ), KILL_TYPEFRAG, MSG_KILL);
- Send_CSQC_Centerprint(targ, a, GetAdvancedDeathReports(attacker), KILL_TYPEFRAGGED, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, GetAdvancedDeathReports(targ), KILL_TYPEFRAG, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, a, GetAdvancedDeathReports(attacker), KILL_TYPEFRAGGED, MSG_KILL);
} else {
- Send_CSQC_Centerprint(attacker, s, GetAdvancedDeathReports(targ), KILL_FRAG, MSG_KILL);
- Send_CSQC_Centerprint(targ, a, GetAdvancedDeathReports(attacker), KILL_FRAGGED, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, GetAdvancedDeathReports(targ), KILL_FRAG, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, a, GetAdvancedDeathReports(attacker), KILL_FRAGGED, MSG_KILL);
}
attacker.taunt_soundtime = time + 1;
}
else
{
- Send_CSQC_Centerprint(targ, "", "", deathtype, MSG_KILL_ACTION);
+ Send_CSQC_KillCenterprint(targ, "", "", deathtype, MSG_KILL_ACTION);
if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
msg = inflictor.message;
else if (deathtype == DEATH_CUSTOM)
}
else
{
+ /*
+ skill based bot damage? gtfo. (tZork)
if (targ.classname == "player")
if (attacker.classname == "player")
if (!targ.isbot)
if (attacker.isbot)
damage = damage * bound(0.1, (skill + 5) * 0.1, 1);
-
+ */
+
// nullify damage if teamplay is on
if(deathtype != DEATH_TELEFRAG)
if(attacker.classname == "player")
damage = 0;
force = '0 0 0';
}
- else if(teams_matter && attacker.team == targ.team)
+ else if(teamplay && attacker.team == targ.team)
{
if(autocvar_teamplay_mode == 1)
damage = 0;
if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
{
targ.armorvalue -= 1;
- centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(targ.armorvalue)));
+ centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue)));
damage = 0;
targ.hitsound += 1;
attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
if (targ != attacker)
{
if ((targ.health >= 1) && (targ.classname == "player"))
- centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "Secondary fire inflicts no damage!"));
+ centerprint(attacker, "Secondary fire inflicts no damage!");
force = '0 0 0';
// keep mirrorforce
attacker = targ;
if(deathtype & HITTYPE_HEADSHOT)
damage *= 1 + damage_headshotbonus;
- if(targ.classname == "player")
+ entity victim;
+ if((targ.vehicle_flags & VHF_ISVEHICLE) && targ.owner)
+ victim = targ.owner;
+ else
+ victim = targ;
+
+ if(victim.classname == "player" || victim.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
{
- if(IsDifferentTeam(targ, attacker))
+ if(IsDifferentTeam(victim, attacker))
{
if(damage > 0)
{
if(deathtype != DEATH_FIRE)
{
- if(targ.BUTTON_CHAT)
+ if(victim.BUTTON_CHAT)
attacker.typehitsound += 1;
else
attacker.hitsound += 1;
if not(DEATH_ISSPECIAL(deathtype))
{
+ if(targ.classname == "player") // don't do this for vehicles
if(!g_minstagib)
- if(IsFlying(targ))
+ if(IsFlying(victim))
yoda = 1;
if(g_minstagib)
- if(targ.items & IT_STRENGTH)
+ if(victim.items & IT_STRENGTH)
yoda = 1;
if(deathtype & HITTYPE_HEADSHOT)
if(attacker.armorvalue > 0)
{
attacker.armorvalue = attacker.armorvalue - 1;
- centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
+ centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
attacker.hitsound += 1;
}
mirrordamage = 0;
============================================*/
-.string aiment_classname;
-.float aiment_deadflag;
-void SetMovetypeFollow(entity ent, entity e)
-{
- // FIXME this may not be warpzone aware
- ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
- ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
- ent.aiment = e; // make the hole follow bmodel
- ent.punchangle = e.angles; // the original angles of bmodel
- ent.view_ofs = ent.origin - e.origin; // relative origin
- ent.v_angle = ent.angles - e.angles; // relative angles
- ent.aiment_classname = strzone(e.classname);
- ent.aiment_deadflag = e.deadflag;
-}
-void UnsetMovetypeFollow(entity ent)
-{
- ent.movetype = MOVETYPE_FLY;
- PROJECTILE_MAKETRIGGER(ent);
- ent.aiment = world;
-}
-float LostMovetypeFollow(entity ent)
-{
-/*
- if(ent.movetype != MOVETYPE_FOLLOW)
- if(ent.aiment)
- error("???");
-*/
- if(ent.aiment)
- {
- if(ent.aiment.classname != ent.aiment_classname)
- return 1;
- if(ent.aiment.deadflag != ent.aiment_deadflag)
- return 1;
- }
- return 0;
-}
-
.float hook_length;
.float hook_switchweapon;
//pl.disableclientprediction = FALSE;
}
+void GrapplingHookReset(void)
+{
+ if(self.realowner.hook == self)
+ RemoveGrapplingHook(self.owner);
+ else // in any case:
+ remove(self);
+}
+
void GrapplingHookThink();
void GrapplingHook_Stop()
{
pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1);
- sound (self, CHAN_PROJECTILE, "weapons/hook_impact.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "weapons/hook_impact.wav", VOL_BASE, ATTN_NORM);
self.state = 1;
self.think = GrapplingHookThink;
{
WriteByte(MSG_ENTITY, ENT_CLIENT_HOOK);
sf = sf & 0x7F;
- if(sound_allowed(MSG_BROADCAST, self.owner))
+ if(sound_allowed(MSG_BROADCAST, self.realowner))
sf |= 0x80;
WriteByte(MSG_ENTITY, sf);
if(sf & 1)
{
- WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+ WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
}
if(sf & 2)
{
{
float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch, s;
vector dir, org, end, v0, dv, v, myorg, vs;
- if(self.owner.health <= 0 || self.owner.hook != self) // how did that happen?
+ if(self.realowner.health <= 0 || self.realowner.hook != self) // how did that happen?
{ // well, better fix it anyway
remove(self);
return;
}
if(LostMovetypeFollow(self))
{
- RemoveGrapplingHook(self.owner);
+ RemoveGrapplingHook(self.realowner);
return;
}
if(self.aiment)
self.nextthink = time;
- s = self.owner.cvar_cl_gunalign;
+ s = self.realowner.cvar_cl_gunalign;
if(s != 1 && s != 2 && s != 4)
s = 3; // default value
--s;
vs = hook_shotorigin[s];
- makevectors(self.owner.v_angle);
- org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
- myorg = WarpZone_RefSys_TransformOrigin(self.owner, self, org);
+ makevectors(self.realowner.v_angle);
+ org = self.realowner.origin + self.realowner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
+ myorg = WarpZone_RefSys_TransformOrigin(self.realowner, self, org);
if(self.hook_length < 0)
self.hook_length = vlen(myorg - self.origin);
if(autocvar_g_grappling_hook_tarzan)
{
- v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity);
+ v = v0 = WarpZone_RefSys_TransformVelocity(self.realowner, self, self.realowner.velocity);
// first pull the rope...
- if(self.owner.hook_state & HOOK_PULLING)
+ if(self.realowner.hook_state & HOOK_PULLING)
{
newlength = self.hook_length;
newlength = max(newlength - pullspeed * frametime, minlength);
self.hook_length = newlength;
}
- if(self.owner.hook_state & HOOK_RELEASING)
+ if(self.realowner.hook_state & HOOK_RELEASING)
{
newlength = dist;
self.hook_length = newlength;
v = v - dv * 0.5;
self.aiment.velocity = self.aiment.velocity - dv * 0.5;
self.aiment.flags &~= FL_ONGROUND;
- self.aiment.pusher = self.owner;
+ self.aiment.pusher = self.realowner;
self.aiment.pushltime = time + autocvar_g_maxpushtime;
}
}
- self.owner.flags &~= FL_ONGROUND;
+ self.realowner.flags &~= FL_ONGROUND;
}
- self.owner.velocity = WarpZone_RefSys_TransformVelocity(self, self.owner, v);
+ self.realowner.velocity = WarpZone_RefSys_TransformVelocity(self, self.realowner, v);
}
else
{
spd = pullspeed;
if(spd < 50)
spd = 0;
- self.owner.velocity = dir*spd;
- self.owner.movetype = MOVETYPE_FLY;
+ self.realowner.velocity = dir*spd;
+ self.realowner.movetype = MOVETYPE_FLY;
- self.owner.flags &~= FL_ONGROUND;
+ self.realowner.flags &~= FL_ONGROUND;
}
}
makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
- myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin); // + v_forward * (-9);
+ myorg = WarpZone_RefSys_TransformOrigin(self, self.realowner, self.origin); // + v_forward * (-9);
if(myorg != self.hook_start)
{
void GrapplingHookTouch (void)
{
- if(SUB_OwnerCheck())
- return;
- if(SUB_NoImpactCheck())
- {
- RemoveGrapplingHook(self.owner);
- return;
- }
PROJECTILE_TOUCH;
GrapplingHook_Stop();
WarpZone_RefSys_BeginAddingIncrementally(self, self.aiment);
}
- //self.owner.disableclientprediction = TRUE;
+ //self.realowner.disableclientprediction = TRUE;
}
void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
self.health = self.health - damage;
if (self.health <= 0)
{
- if(attacker != self.owner)
+ if(attacker != self.realowner)
{
- self.owner.pusher = attacker;
- self.owner.pushltime = time + autocvar_g_maxpushtime;
+ self.realowner.pusher = attacker;
+ self.realowner.pushltime = time + autocvar_g_maxpushtime;
}
- RemoveGrapplingHook(self.owner);
+ RemoveGrapplingHook(self.realowner);
}
}
}
if((arena_roundbased && time < warmup) || (time < game_starttime))
return;
- if(self.freezetag_frozen)
- return;
+ if(self.freezetag_frozen)
+ return;
+
+ if(self.vehicle)
+ return;
makevectors(self.v_angle);
--s;
vs = hook_shotorigin[s];
- // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
- sound (self, CHAN_WEAPON2, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
+ // UGLY WORKAROUND: play this on CH_WEAPON_B so it can't cut off fire sounds
+ sound (self, CH_WEAPON_B, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
org = self.origin + self.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
tracebox(self.origin + self.view_ofs, '-3 -3 -3', '3 3 3', org, MOVE_NORMAL, self);
pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
missile = WarpZone_RefSys_SpawnSameRefSys(self);
- missile.owner = self;
+ missile.owner = missile.realowner = self;
self.hook = missile;
+ missile.reset = GrapplingHookReset;
missile.classname = "grapplinghook";
missile.movetype = MOVETYPE_FLY;
void g_model_setcolormaptoactivator (void)
{
- if(teams_matter)
+ if(teamplay)
{
if(activator.team)
self.colormap = (activator.team - 1) * 0x11;
stemp = self;
otemp = other;
+ if(stemp.target_random)
+ RandomSelection_Init();
+
for(i = 0; i < 4; ++i)
{
switch(i)
for(t = world; (t = find(t, targetname, s)); )
if(t.use)
{
- //print(stemp.classname, " ", stemp.targetname, " -> ", t.classname, " ", t.targetname, "\n");
- self = t;
- other = stemp;
- activator = act;
- self.use();
+ if(stemp.target_random)
+ {
+ RandomSelection_Add(t, 0, string_null, 1, 0);
+ }
+ else
+ {
+ self = t;
+ other = stemp;
+ activator = act;
+ self.use();
+ }
}
}
}
+ if(stemp.target_random && RandomSelection_chosen_ent)
+ {
+ self = RandomSelection_chosen_ent;
+ other = stemp;
+ activator = act;
+ self.use();
+ }
+
activator = act;
self = stemp;
other = otemp;
}
if (self.noise)
- sound (self.enemy, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self.enemy, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
// don't trigger again until reset
self.takedamage = DAMAGE_NO;
{
other.health = min(other.health + self.health, self.max_health);
other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
- sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
}
}
}
{
other.gravity = g;
if(self.noise != "")
- sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
UpdateCSQCProjectile(self.owner);
}
};
else
snd = self.noise;
msg_entity = activator;
- soundto(MSG_ONE, self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+ soundto(MSG_ONE, self, CH_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
}
void target_speaker_use_on()
{
}
else
snd = self.noise;
- sound(self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+ sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten);
if(self.spawnflags & 3)
self.use = target_speaker_use_off;
}
void target_speaker_use_off()
{
- sound(self, CHAN_TRIGGER, "misc/null.wav", VOL_BASE * self.volume, self.atten);
+ sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASE * self.volume, self.atten);
self.use = target_speaker_use_on;
}
void target_speaker_reset()
if (self.active != ACTIVE_ACTIVE)
return;
- // FIXME: Better checking for what to push and not.
- if not(other.iscreature)
- if (other.classname != "corpse")
- if (other.classname != "body")
- if (other.classname != "gib")
- if (other.classname != "missile")
- if (other.classname != "rocket")
- if (other.classname != "casing")
- if (other.classname != "grenade")
- if (other.classname != "plasma")
- if (other.classname != "plasma_prim")
- if (other.classname != "plasma_chain")
- if (other.classname != "droppedweapon")
- if (other.classname != "nexball_basketball")
- if (other.classname != "nexball_football")
- return;
-
- if (other.deadflag && other.iscreature)
+ if (!isPushable(other))
return;
EXACTTRIGGER_TOUCH;
if (self.active != ACTIVE_ACTIVE)
return;
- // FIXME: Better checking for what to push and not.
- if not(other.iscreature)
- if (other.classname != "corpse")
- if (other.classname != "body")
- if (other.classname != "gib")
- if (other.classname != "missile")
- if (other.classname != "rocket")
- if (other.classname != "casing")
- if (other.classname != "grenade")
- if (other.classname != "plasma")
- if (other.classname != "plasma_prim")
- if (other.classname != "plasma_chain")
- if (other.classname != "droppedweapon")
- if (other.classname != "nexball_basketball")
- if (other.classname != "nexball_football")
- return;
-
- if (other.deadflag && other.iscreature)
+ if (!isPushable(other))
return;
EXACTTRIGGER_TOUCH;
if (self.active != ACTIVE_ACTIVE)
return;
- // FIXME: Better checking for what to push and not.
- if not(other.iscreature)
- if (other.classname != "corpse")
- if (other.classname != "body")
- if (other.classname != "gib")
- if (other.classname != "missile")
- if (other.classname != "rocket")
- if (other.classname != "casing")
- if (other.classname != "grenade")
- if (other.classname != "plasma")
- if (other.classname != "plasma_prim")
- if (other.classname != "plasma_chain")
- if (other.classname != "droppedweapon")
- if (other.classname != "nexball_basketball")
- if (other.classname != "nexball_football")
- return;
-
- if (other.deadflag && other.iscreature)
+ if (!isPushable(other))
return;
EXACTTRIGGER_TOUCH;
* players. Also plays reminder sounds.
*/
void timeoutHandler_Think() {
- local string timeStr;
local entity plr;
if (timeoutStatus == 1) {
if (remainingLeadTime > 0) {
//centerprint the information to every player
- timeStr = getTimeoutText(0);
FOR_EACH_REALCLIENT(plr) {
if(plr.classname == "player") {
- centerprint_atprio(plr, CENTERPRIO_SPAM, timeStr);
+ Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout begins in %d seconds!", 1, remainingLeadTime);
}
}
remainingLeadTime -= 1;
}
else if (timeoutStatus == 2) {
if (remainingTimeoutTime > 0) {
- timeStr = getTimeoutText(0);
FOR_EACH_REALCLIENT(plr) {
if(plr.classname == "player") {
- centerprint_atprio(plr, CENTERPRIO_SPAM, timeStr);
+ Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout ends in %d seconds!", 1, remainingTimeoutTime);
}
}
if(remainingTimeoutTime == autocvar_sv_timeout_resumetime) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
//get rid of the countdown message
FOR_EACH_REALCLIENT(plr) {
if(plr.classname == "player") {
- centerprint_atprio(plr, CENTERPRIO_SPAM, "");
+ Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
}
}
remove(self);
else if (timeoutStatus == 0) { //if a player called the resumegame command (which set timeoutStatus to 0 already)
FOR_EACH_REALCLIENT(plr) {
if(plr.classname == "player") {
- centerprint_atprio(plr, CENTERPRIO_SPAM, "");
+ Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
}
}
remove(self);
BADCVAR("sv_vote_master_password");
BADCVAR("sys_colortranslation");
BADCVAR("sys_specialcharactertranslation");
+ BADCVAR("timeformat");
BADCVAR("timestamps");
BADPREFIX("developer_");
BADPREFIX("g_ban_");
BADPREFIX("g_chat_flood_");
+ BADPREFIX("g_playerstats_");
BADPREFIX("g_voice_flood_");
BADPREFIX("rcon_");
BADPREFIX("settemp_");
BADPREFIX("sv_weaponstats_");
// these can contain player IDs, so better hide
- BADCVAR("g_forced_team_red");
- BADCVAR("g_forced_team_blue");
- BADCVAR("g_forced_team_yellow");
- BADCVAR("g_forced_team_pink");
+ BADPREFIX("g_forced_team_");
// mapinfo
BADCVAR("fraglimit");
BADPREFIX("sv_maxidle_");
BADPREFIX("sv_vote_");
BADPREFIX("timelimit_");
+ BADCVAR("gameversion");
+ BADPREFIX("gameversion_");
// allowed changes to server admins (please sync this to server.cfg)
// vi commands:
BADCVAR("bot_number");
BADCVAR("bot_prefix");
BADCVAR("bot_suffix");
+ BADCVAR("bot_config_file");
BADCVAR("capturelimit_override");
BADCVAR("fraglimit_override");
BADCVAR("gametype");
BADCVAR("g_ctf_ignore_frags");
BADCVAR("g_ctf_win_mode");
BADCVAR("g_domination_point_limit");
+ BADCVAR("g_friendlyfire");
BADCVAR("g_fullbrightitems");
BADCVAR("g_fullbrightplayers");
BADCVAR("g_keyhunt_point_limit");
BADCVAR("g_maplist_votable_abstain");
BADCVAR("g_maplist_votable_nodetail");
BADCVAR("g_maplist_votable_suggestions");
+ BADCVAR("g_maxplayers");
BADCVAR("g_minstagib");
+ BADCVAR("g_mirrordamage");
BADCVAR("g_nexball_goallimit");
BADCVAR("g_runematch_point_limit");
BADCVAR("g_start_delay");
+ BADCVAR("g_warmup");
BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
BADCVAR("hostname");
BADCVAR("log_file");
BADCVAR("maxplayers");
- BADCVAR("g_maxplayers");
BADCVAR("minplayers");
BADCVAR("net_address");
BADCVAR("port");
BADCVAR("sv_vote_master_commands");
BADCVAR("sv_vote_master_password");
BADCVAR("sv_vote_simple_majority_factor");
+ BADCVAR("sys_ticrate");
+ BADCVAR("teamplay_mode");
BADCVAR("timelimit_override");
- BADCVAR("g_warmup");
BADPREFIX("g_warmup_");
- BADCVAR("teamplay_mode");
if(autocvar_g_minstagib)
{
if(self.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
bot_waypoints_for_items = 0;
- // for setting by mapinfo
- q3acompat_machineshotgunswap = autocvar_sv_q3acompat_machineshotgunswap;
- cvar_set("sv_q3acompat_machineshotgunswap", "0");
-
precache();
WaypointSprite_Init();
GameLogInit(); // prepare everything
if(autocvar_sv_eventlog)
{
- s = strcat(ftos(autocvar_sv_eventlog_files_counter), ".");
- s = strcat(s, ftos(random()));
+ s = sprintf("%d.%s.%06d", ftos(autocvar_sv_eventlog_files_counter), strftime(FALSE, "%s"), floor(random() * 1000000));
matchid = strzone(s);
GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
addstat(STAT_WEAPONS, AS_INT, weapons);
addstat(STAT_SWITCHWEAPON, AS_INT, switchweapon);
+ addstat(STAT_SWITCHINGWEAPON, AS_INT, switchingweapon);
addstat(STAT_GAMESTARTTIME, AS_FLOAT, stat_game_starttime);
addstat(STAT_ALLOW_OLDNEXBEAM, AS_INT, stat_allow_oldnexbeam);
Nagger_Init();
if(Map_Count == 0)
{
bprint( "Maplist is empty! Resetting it to default map list.\n" );
- cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+ cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
if(allowReset)
{
bprint( "Maplist contains no single playable map! Resetting it to default map list.\n" );
- cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+ cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
}
}
- if(teams_matter)
+ if(teamplay)
{
s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
if(to_console)
FOR_EACH_CLIENT(e)
PlayerStats_AddGlobalInfo(e);
PlayerStats_Shutdown();
+ WeaponStats_Shutdown();
if(autocvar_sv_eventlog)
GameLogEcho(":gameover");
// TODO make everything use THIS winning condition (except LMS)
WinningConditionHelper();
- if(teams_matter)
+ if(teamplay)
{
team1_score = TeamScore_GetCompareValue(COLOR_TEAM1);
team2_score = TeamScore_GetCompareValue(COLOR_TEAM2);
float mapvote_maps_suggested[MAPVOTE_COUNT];
string mapvote_suggestions[MAPVOTE_COUNT];
float mapvote_suggestion_ptr;
-float mapvote_maxlen;
float mapvote_voters;
float mapvote_votes[MAPVOTE_COUNT];
float mapvote_run;
for(j = 0; j < mapvote_count; ++j)
if(mapvote_maps[j] == nextMap)
return;
- if(strlen(nextMap) > mapvote_maxlen)
- mapvote_maxlen = strlen(nextMap);
+ // suggestions might be no longer valid/allowed after gametype switch!
+ if(isSuggestion)
+ if(!MapInfo_CheckMap(nextMap))
+ return;
mapvote_maps[mapvote_count] = strzone(nextMap);
mapvote_maps_suggested[mapvote_count] = isSuggestion;
if(mapvote_count == 0)
{
bprint( "Maplist contains no single playable map! Resetting it to default map list.\n" );
- cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+ cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
// removes the need to bound()
string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF";
-float RADAR_WIDTH_MAX = 2048;
-float RADAR_HEIGHT_MAX = 2048;
+float RADAR_WIDTH_MAX = 512;
+float RADAR_HEIGHT_MAX = 512;
float sharpen_buffer[RADAR_WIDTH_MAX * 3];
void sharpen_set(float x, float v)
return;
}
- cvar_set("timelimit", ftos(new));
+ cvar_set("timelimit", ftos(new / 60));
+}
+
+float g_clientmodel_genericsendentity (entity to, float sf);
+void modelbug_make_svqc();
+void modelbug_make_csqc()
+{
+ Net_LinkEntity(self, TRUE, 0, g_clientmodel_genericsendentity);
+ self.think = modelbug_make_svqc;
+ self.nextthink = time + 1;
+ setorigin(self, self.origin - '0 0 8');
+}
+void modelbug_make_svqc()
+{
+ self.SendEntity = func_null;
+ self.think = modelbug_make_csqc;
+ self.nextthink = time + 1;
+ setorigin(self, self.origin + '0 0 8');
+}
+
+void modelbug()
+{
+ entity e;
+ e = spawn();
+ setorigin(e, nextent(world).origin);
+ precache_model("models/portal.md3");
+ setmodel(e, "models/portal.md3");
+ e.think = modelbug_make_svqc;
+ e.nextthink = time + 1;
}
void GameCommand(string command)
print(" find classname\n");
print(" extendmatchtime\n");
print(" reducematchtime\n");
+ print(" warp [level]\n");
GameCommand_Vote("help", world);
GameCommand_Ban("help");
GameCommand_Generic("help");
}
else
{
- centerprint_atprio(client, CENTERPRIO_ADMIN, strcat("^3", admin_name(), ":\n\n^7", argv(2)));
+ centerprint(client, strcat("^3", admin_name(), ":\n\n^7", argv(2)));
sprint(client, strcat("\{1}\{13}^3", admin_name(), "^7: ", argv(2), "\n"));
}
print("Message sent to ", client.netname, "\n");
if (argv(0) == "lockteams")
{
- if(teams_matter)
+ if(teamplay)
{
lockteams = 1;
bprint("^1The teams are now locked.\n");
if (argv(0) == "unlockteams")
{
- if(teams_matter)
+ if(teamplay)
{
lockteams = 0;
bprint("^1The teams are now unlocked.\n");
// 2 (10) no centerprint, admin message
// 3 (11) no centerprint, no admin message
- if(!teams_matter) { // death match
+ if(!teamplay) { // death match
print("Currently not playing a team game\n");
return;
}
return;
}
+ if(argv(0) == "modelbug")
+ {
+ modelbug();
+ return;
+ }
+
+ if(argv(0) == "warp")
+ {
+ if(autocvar_g_campaign)
+ {
+ if(argc >= 2)
+ CampaignLevelWarp(stof(argv(1)));
+ else
+ CampaignLevelWarp(-1);
+ }
+ else
+ print("Not in campaign, can't level warp\n");
+ }
+
print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
}
string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information
{
- local float nPlayerHealth = rint(enPlayer.health);
- local float nPlayerArmor = rint(enPlayer.armorvalue);
- local float nPlayerHandicap = enPlayer.cvar_cl_handicap;
- local float nPlayerPing = rint(enPlayer.ping);
- local string strPlayerPingColor;
- local string strMessage;
+ float nPlayerHealth = rint(enPlayer.health);
+ float nPlayerArmor = rint(enPlayer.armorvalue);
+ float nPlayerHandicap = enPlayer.cvar_cl_handicap;
+ float nPlayerPing = rint(enPlayer.ping);
+ string strPlayerPingColor;
+ string strMessage;
+
if(nPlayerPing >= 150)
strPlayerPingColor = "^1";
else
strPlayerPingColor = "^2";
if((autocvar_sv_fragmessage_information_stats) && (enPlayer.health >= 1))
- strMessage = strcat(strMessage, "\n^7(Health ^1", ftos(nPlayerHealth), "^7 / Armor ^2", ftos(nPlayerArmor), "^7)");
+ strMessage = strcat(strMessage, "^7(Health ^1", ftos(nPlayerHealth), "^7 / Armor ^2", ftos(nPlayerArmor), "^7)");
if(autocvar_sv_fragmessage_information_ping) {
if(clienttype(enPlayer) == CLIENTTYPE_BOT) // Bots have no ping
} else if(autocvar_sv_fragmessage_information_handicap) {
if(autocvar_sv_fragmessage_information_handicap == 2)
if(nPlayerHandicap <= 1)
- strMessage = strcat(strMessage, "\n^7(Handicap ^2Off^7)");
+ strMessage = strcat(strMessage, "^7(Handicap ^2Off^7)");
else
- strMessage = strcat(strMessage, "\n^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
+ strMessage = strcat(strMessage, "^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
else if(nPlayerHandicap > 1)
- strMessage = strcat(strMessage, "\n^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
+ strMessage = strcat(strMessage, "^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
}
+
+ if(strMessage) // add new line to the beginning if there is a message
+ strMessage = strcat("\n", strMessage);
+
return strMessage;
}
void bcenterprint(string s)
MUTATOR_CALLHOOK(GetCvars);
GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
- GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime");
GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
+ GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating");
GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList);
GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[0], "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete);
GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[1], "cl_weaponpriority1", W_FixWeaponOrder_AllowIncomplete);
GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign");
GetCvars_handleFloat(s, f, cvar_cl_allow_uid2name, "cl_allow_uid2name");
GetCvars_handleFloat(s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking");
+ GetCvars_handleFloat(s, f, cvar_cl_movement_track_canjump, "cl_movement_track_canjump");
// fixup of switchweapon (needed for LMS or when spectating is disabled, as PutClientInServer comes too early)
if (f > 0)
return -1;
}
-#define CENTERPRIO_POINT 1
-#define CENTERPRIO_SPAM 2
-#define CENTERPRIO_VOTE 4
-#define CENTERPRIO_NORMAL 5
-#define CENTERPRIO_SHIELDING 7
-#define CENTERPRIO_MAPVOTE 9
-#define CENTERPRIO_IDLEKICK 50
-#define CENTERPRIO_ADMIN 99
-.float centerprint_priority;
-.float centerprint_expires;
-void centerprint_atprio(entity e, float prio, string s)
-{
- if (intermission_running)
- if (prio < CENTERPRIO_MAPVOTE)
- return;
- if (time > e.centerprint_expires)
- e.centerprint_priority = 0;
- if (prio >= e.centerprint_priority)
- {
- e.centerprint_priority = prio;
- if (timeoutStatus == 2)
- e.centerprint_expires = time + (e.cvar_scr_centertime * TIMEOUT_SLOWMO_VALUE);
- else
- e.centerprint_expires = time + e.cvar_scr_centertime;
- centerprint_builtin(e, s);
- }
-}
-void centerprint_expire(entity e, float prio)
-{
- if (prio == e.centerprint_priority)
- {
- e.centerprint_priority = 0;
- centerprint_builtin(e, "");
- }
-}
-void centerprint(entity e, string s)
-{
- centerprint_atprio(e, CENTERPRIO_NORMAL, s);
-}
-
// decolorizes and team colors the player name when needed
string playername(entity p)
{
string t;
- if (teams_matter && !intermission_running && p.classname == "player")
+ if (teamplay && !intermission_running && p.classname == "player")
{
t = Team_ColorCode(p.team);
return strcat(t, strdecolorize(p.netname));
g_bloodloss = cvar("g_bloodloss");
sv_maxidle = cvar("sv_maxidle");
sv_maxidle_spectatorsareidle = cvar("sv_maxidle_spectatorsareidle");
- sv_pogostick = cvar("sv_pogostick");
g_ctf_reverse = cvar("g_ctf_reverse");
sv_autotaunt = cvar("sv_autotaunt");
sv_taunt = cvar("sv_taunt");
if(!g_weapon_stay)
g_weapon_stay = cvar("g_weapon_stay");
- if (!g_weapon_stay && (cvar("deathmatch") == 2))
- g_weapon_stay = 1;
-
g_ghost_items = cvar("g_ghost_items");
if(g_ghost_items >= 1)
// Sound functions
string precache_sound (string s) = #19;
-void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8;
float precache_sound_index (string s) = #19;
#define SND_VOLUME 1
return TRUE;
}
+#ifdef COMPAT_XON010_CHANNELS
+void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8;
void sound(entity e, float chan, string samp, float vol, float atten)
{
if (!sound_allowed(MSG_BROADCAST, e))
return;
sound_builtin(e, chan, samp, vol, atten);
}
+#else
+#undef sound
+void sound(entity e, float chan, string samp, float vol, float atten)
+{
+ if (!sound_allowed(MSG_BROADCAST, e))
+ return;
+ sound7(e, chan, samp, vol, atten, 0, 0);
+}
+#endif
+
void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten)
{
float entno, idx;
sflags |= SND_VOLUME;
if (atten != 64)
sflags |= SND_ATTENUATION;
- if (entno >= 8192)
+ if (entno >= 8192 || chan < 0 || chan > 7)
sflags |= SND_LARGEENTITY;
if (idx >= 256)
sflags |= SND_LARGESOUND;
}
void soundat(entity e, vector o, float chan, string samp, float vol, float atten)
{
- soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten);
+ soundtoat(((chan & 8) ? MSG_ALL : MSG_BROADCAST), e, o, chan, samp, vol, atten);
}
void stopsoundto(float dest, entity e, float chan)
{
entno = num_for_edict(e);
- if (entno >= 8192)
+ if (entno >= 8192 || chan < 0 || chan > 7)
{
float idx, sflags;
idx = precache_sound_index("misc/null.wav");
{
//stuffcmd(e, strcat("play2 ", filename, "\n"));
msg_entity = e;
- soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE);
+ soundtoat(MSG_ONE, world, '0 0 0', CH_INFO, filename, VOL_BASE, ATTN_NONE);
}
// use this one if you might be causing spam (e.g. from touch functions that might get called more than once per frame)
if (autocvar_bot_sound_monopoly)
return;
- sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE);
+ sound(world, CH_INFO, samp, VOL_BASE, ATTN_NONE);
}
void PrecachePlayerSounds(string f);
#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
+
+void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num)
+{
+ if (clienttype(e) == CLIENTTYPE_REAL)
+ {
+ msg_entity = e;
+ WRITESPECTATABLE_MSG_ONE({
+ WriteByte(MSG_ONE, SVC_TEMPENTITY);
+ WriteByte(MSG_ONE, TE_CSQC_CENTERPRINT_GENERIC);
+ WriteByte(MSG_ONE, id);
+ WriteString(MSG_ONE, s);
+ if (id != 0 && s != "")
+ {
+ WriteByte(MSG_ONE, duration);
+ WriteByte(MSG_ONE, countdown_num);
+ }
+ });
+ }
+}
+void Send_CSQC_Centerprint_Generic_Expire(entity e, float id)
+{
+ Send_CSQC_Centerprint_Generic(e, id, "", 1, 0);
+}
// WARNING: this kills the trace globals
#define EXACTTRIGGER_TOUCH if(WarpZoneLib_ExactTrigger_Touch()) return
#define EXACTTRIGGER_INIT WarpZoneLib_ExactTrigger_Init()
void remove_unsafely(entity e)
{
+ if(e.classname == "spike")
+ error("Removing spikes is forbidden (crylink bug), please report");
remove_builtin(e);
}
#define SUB_OwnerCheck() (other && (other == self.owner))
+void RemoveGrapplingHook(entity pl);
+void W_Crylink_Dequeue(entity e);
float WarpZone_Projectile_Touch_ImpactFilter_Callback()
{
if(SUB_OwnerCheck())
return TRUE;
if(SUB_NoImpactCheck())
{
- remove(self);
+ if(self.classname == "grapplinghook")
+ RemoveGrapplingHook(self.realowner);
+ else if(self.classname == "spike")
+ {
+ W_Crylink_Dequeue(self);
+ remove(self);
+ }
+ else
+ remove(self);
return TRUE;
}
if(trace_ent && trace_ent.solid > SOLID_TRIGGER)
- UpdateCSQCProjectileNextFrame(self);
+ UpdateCSQCProjectile(self);
return FALSE;
}
#define PROJECTILE_TOUCH if(WarpZone_Projectile_Touch()) return
dprint(data);
dprint("\nEnd of data.\n");
- if (id == URI_GET_DISCARD)
+ if(url_URI_Get_Callback(id, status, data))
+ {
+ // handled
+ }
+ else if (id == URI_GET_DISCARD)
{
// discard
}
{
float m, i;
vector start, org, delta, end, enddown, mstart;
+ entity sp;
m = e.dphitcontentsmask;
e.dphitcontentsmask = goodcontents | badcontents;
if (trace_fraction >= 1)
continue;
+ // rule 4: we must "see" some spawnpoint
+ for(sp = world; (sp = find(sp, classname, "info_player_deathmatch")); )
+ if(checkpvs(mstart, sp))
+ break;
+ if(!sp)
+ {
+ for(sp = world; (sp = findflags(sp, flags, FL_ITEM)); )
+ if(checkpvs(mstart, sp))
+ break;
+ if(!sp)
+ continue;
+ }
+
// find a random vector to "look at"
end_x = org_x + random() * delta_x;
end_y = org_y + random() * delta_y;
{
switch(algn)
{
- case 1: // right
+ default:
+ case 3: // right
break;
- case 2: // left
+ case 4: // left
vecs_y = -vecs_y;
break;
- default:
- case 3:
+ case 1:
if(allowcenter) // 2: allow center handedness
{
// center
}
break;
- case 4:
+ case 2:
if(allowcenter) // 2: allow center handedness
{
// center
{
if (visual)
{
- vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn);
+ vecs_y = 0;
+ vecs_z -= 2;
}
else
{
}
else if (autocvar_g_shootfromcenter)
{
- if (visual)
- {
- vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn);
- }
- else
- {
- vecs_y = 0;
- vecs_z -= 2;
- }
+ vecs_y = 0;
+ vecs_z -= 2;
}
else if ((s = autocvar_g_shootfromfixedorigin) != "")
{
e.think = defer_think;
e.nextthink = time + fdelay;
}
+
+.string aiment_classname;
+.float aiment_deadflag;
+void SetMovetypeFollow(entity ent, entity e)
+{
+ // FIXME this may not be warpzone aware
+ ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
+ ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
+ ent.aiment = e; // make the hole follow bmodel
+ ent.punchangle = e.angles; // the original angles of bmodel
+ ent.view_ofs = ent.origin - e.origin; // relative origin
+ ent.v_angle = ent.angles - e.angles; // relative angles
+ ent.aiment_classname = strzone(e.classname);
+ ent.aiment_deadflag = e.deadflag;
+}
+void UnsetMovetypeFollow(entity ent)
+{
+ ent.movetype = MOVETYPE_FLY;
+ PROJECTILE_MAKETRIGGER(ent);
+ ent.aiment = world;
+}
+float LostMovetypeFollow(entity ent)
+{
+/*
+ if(ent.movetype != MOVETYPE_FOLLOW)
+ if(ent.aiment)
+ error("???");
+*/
+ if(ent.aiment)
+ {
+ if(ent.aiment.classname != ent.aiment_classname)
+ return 1;
+ if(ent.aiment.deadflag != ent.aiment_deadflag)
+ return 1;
+ }
+ return 0;
+}
+
+float isPushable(entity e)
+{
+ if(e.iscreature)
+ return TRUE;
+ switch(e.classname)
+ {
+ case "body":
+ case "droppedweapon":
+ case "keepawayball":
+ case "nexball_basketball":
+ case "nexball_football":
+ return TRUE;
+ case "bullet": // antilagged bullets can't hit this either
+ return FALSE;
+ }
+ if (e.projectiledeathtype)
+ return TRUE;
+ return FALSE;
+}
return 0;
}
+float overtime_msg_time;
void onslaught_generator_think()
{
local float d;
self.nextthink = ceil(time + 1);
if (!gameover)
{
- if (autocvar_timelimit)
- if (time > game_starttime + autocvar_timelimit * 60)
+ if (autocvar_timelimit && time > game_starttime + autocvar_timelimit * 60)
{
+ if (!overtime_msg_time)
+ {
+ FOR_EACH_PLAYER(e)
+ centerprint(e, "^3Now playing ^1OVERTIME^3!\n^3Generators start now to self-damaging.\n^3The more control points your team holds,\n^3the more damage the enemy generator gets.");
+ overtime_msg_time = time;
+ }
// self.max_health / 300 gives 5 minutes of overtime.
// control points reduce the overtime duration.
- sound(self, CHAN_TRIGGER, "onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
d = 1;
e = findchain(classname, "onslaught_controlpoint");
while (e)
d = d * self.max_health / 300;
Damage(self, self, self, d, DEATH_HURTTRIGGER, self.origin, '0 0 0');
}
+ else if (overtime_msg_time)
+ overtime_msg_time = 0;
}
};
if(random() < 0.01)
{
pointparticles(particleeffectnum("electro_ballexplode"), self.origin + randompos('-50 -50 -20', '50 50 50'), '0 0 0', 1);
- sound(self, CHAN_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM);
}
else
pointparticles(particleeffectnum("torch_small"), self.origin + randompos('-60 -60 -20', '60 60 60'), '0 0 0', 1);
if(self.count==40||self.count==20)
{
onslaught_generator_ring_spawn(self.origin);
- sound(self, CHAN_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTN_NORM);
}
// Throw some gibs
if(random() < 0.25)
{
te_explosion(self.origin);
- sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
}
// Particles
te_explosion(org);
onslaught_generator_shockwave_spawn(org);
pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
- sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
}
else
self.nextthink = time + 0.05;
// Throw some flaming gibs on damage, more damage = more chance for gib
if(random() < damage/220)
{
- sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
i = random();
if(i < 0.3)
ons_throwgib(hitloc + '0 0 20', force * -1, "models/onslaught/gen_gib1.md3", 5, TRUE);
//sound on every hit
if (random() < 0.5)
- sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTN_NORM);
else
- sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);
}
//throw some gibs on damage
self.think = onslaught_generator_delayed;
self.nextthink = time + 0.2;
setmodel(self, "models/onslaught/generator.md3");
+ setsize(self, '-52 -52 -14', '52 52 75');
WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
WaypointSprite_UpdateHealth(self.sprite, self.health);
self.nextthink = time + 0.2;
InitializeEntity(self, onslaught_generator_delayed, INITPRIO_LAST);
- WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+ WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
WaypointSprite_UpdateHealth(self.sprite, self.health);
pointparticles(particleeffectnum("sparks"), hitloc, force*-1, 1);
//sound on every hit
if (random() < 0.5)
- sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTN_NORM);
else
- sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTN_NORM);
if (self.health < 0)
{
- sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
{
string t;
self.owner.waslinked = self.owner.islinked;
}
- if (self.punchangle_x > 2)
- self.punchangle_x = self.punchangle_x - 2;
- else if (self.punchangle_x < -2)
- self.punchangle_x = self.punchangle_x + 2;
- else
- self.punchangle_x = 0;
- if (self.punchangle_y > 2)
- self.punchangle_y = self.punchangle_y - 2;
- else if (self.punchangle_y < -2)
- self.punchangle_y = self.punchangle_y + 2;
- else
- self.punchangle_y = 0;
- if (self.punchangle_z > 2)
- self.punchangle_z = self.punchangle_z - 2;
- else if (self.punchangle_z < -2)
- self.punchangle_z = self.punchangle_z + 2;
- else
- self.punchangle_z = 0;
+
+ if (self.punchangle_x > 0)
+ {
+ self.punchangle_x = self.punchangle_x - 60 * sys_frametime;
+ if (self.punchangle_x < 0)
+ self.punchangle_x = 0;
+ }
+ else if (self.punchangle_x < 0)
+ {
+ self.punchangle_x = self.punchangle_x + 60 * sys_frametime;
+ if (self.punchangle_x > 0)
+ self.punchangle_x = 0;
+ }
+
+ if (self.punchangle_y > 0)
+ {
+ self.punchangle_y = self.punchangle_y - 60 * sys_frametime;
+ if (self.punchangle_y < 0)
+ self.punchangle_y = 0;
+ }
+ else if (self.punchangle_y < 0)
+ {
+ self.punchangle_y = self.punchangle_y + 60 * sys_frametime;
+ if (self.punchangle_y > 0)
+ self.punchangle_y = 0;
+ }
+
+ if (self.punchangle_z > 0)
+ {
+ self.punchangle_z = self.punchangle_z - 60 * sys_frametime;
+ if (self.punchangle_z < 0)
+ self.punchangle_z = 0;
+ }
+ else if (self.punchangle_z < 0)
+ {
+ self.punchangle_z = self.punchangle_z + 60 * sys_frametime;
+ if (self.punchangle_z > 0)
+ self.punchangle_z = 0;
+ }
+
self.angles_x = self.punchangle_x;
self.angles_y = self.punchangle_y + self.mangle_y;
self.angles_z = self.punchangle_z;
- self.mangle_y = self.mangle_y + 1.5;
+ self.mangle_y = self.mangle_y + 45 * sys_frametime;
- self.cp_bob_origin_z = 4 * PI * (1 - cos(self.cp_bob_spd / 8));
- self.cp_bob_spd = self.cp_bob_spd + 0.5;
+ self.cp_bob_origin_z = 4 * PI * (1 - cos(self.cp_bob_spd));
+ self.cp_bob_spd = self.cp_bob_spd + 1.875 * sys_frametime;
if(self.cp_bob_dmg_z > 0)
- self.cp_bob_dmg_z = self.cp_bob_dmg_z - 0.1;
+ self.cp_bob_dmg_z = self.cp_bob_dmg_z - 3 * sys_frametime;
else
self.cp_bob_dmg_z = 0;
setorigin(self,self.cp_origin + self.cp_bob_origin + self.cp_bob_dmg);
pointparticles(particleeffectnum("electricity_sparks"), self.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1);
if(random() > 0.8)
- sound(self, CHAN_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTN_NORM);
else if (random() > 0.5)
- sound(self, CHAN_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTN_NORM);
}
};
self.health = self.max_health;
self.count = autocvar_g_onslaught_cp_regen * sys_frametime; // slow repair rate from now on
self.think = onslaught_controlpoint_icon_think;
- sound(self, CHAN_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
bprint(ColoredTeamName(self.team), " captured ", self.owner.message, " control point\n");
self.owner.iscaptured = TRUE;
e.think = onslaught_controlpoint_icon_buildthink;
e.nextthink = time + sys_frametime;
e.count = (e.max_health - e.health) * sys_frametime / autocvar_g_onslaught_cp_buildtime; // how long it takes to build
- sound(e, CHAN_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
+ sound(e, CH_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
self.team = e.team;
self.colormap = e.colormap;
WaypointSprite_UpdateBuildFinished(self.sprite, time + (e.max_health - e.health) / (e.count / sys_frametime));
waypoint_spawnforitem(self);
- WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+ WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
onslaught_updatelinks();
self = other;
other = temp;
+ /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
if (self.classname == "monster_ogre")
sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound
+ */
//dprint ("t_movetarget\n");
self.goalentity = self.movetarget = find (world, targetname, other.target);
if (other.enemy)
return; // fighting, not following a path
+ /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
if (other.classname == "monster_ogre")
sound (other, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound
+ */
monster_wanderpaththink();
};
if (random() < 0.005)
{
// blink for an instant, this causes the appear sound, alarming the player as if under attack
+ /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
sound(self, CHAN_AUTO, "wizard/wsight.wav", 1, ATTN_NORM);
+ */
a = 1;
}
}
else
{
// if unghosting, make sure we have an enemy, otherwise stay ghosted (even if blinking) so we can't be shot while blinking
+ /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
if (self.solid != SOLID_SLIDEBOX)
sound(self, CHAN_AUTO, "wizard/wsight.wav", 1, ATTN_NORM);
+ */
self.solid = SOLID_SLIDEBOX;
self.takedamage = DAMAGE_AIM;
}
+#ifdef SVQC
.vector moveto;
/**
}
*/
+/*
void movelib_move_simple(vector newdir,float velo,float blendrate)
{
self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo;
}
+*/
+#define movelib_move_simple(newdir,velo,blendrate) \
+ self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo
void movelib_beak_simple(float force)
{
Pitches and rolls the entity to match the gound.
Yed need to set v_up and v_forward (generally by calling makevectors) before calling this.
**/
+#endif
+
void movelib_groundalign4point(float spring_length, float spring_up, float blendrate)
{
vector a, b, c, d, e, r, push_angle, ahead, side;
entity e;
r = 0;
for(e = cb; e.cbc_next; e = e.cbc_next)
+ {
+ CallbackChain_ReturnValue = r;
r |= e.cbc_next.cbc_func();
+ }
return r; // callbacks return an error status, so 0 is default return value
}
#define CBC_ORDER_LAST 2
#define CBC_ORDER_ANY 4
+float CallbackChain_ReturnValue; // read-only field of the current return value
+
entity CallbackChain_New(string name);
float CallbackChain_Add(entity cb, float() func, float order)
float CallbackChain_Remove(entity cb, float() func);
#define MUTATOR_HOOKABLE(cb) entity HOOK_##cb
#define MUTATOR_CALLHOOK(cb) CallbackChain_Call(HOOK_##cb)
+#define MUTATOR_RETURNVALUE CallbackChain_ReturnValue
// INPUT
entity self;
float olditems; // also technically output, but since it is at the end of the function it's useless for that :P
+
+MUTATOR_HOOKABLE(PlayerUseKey);
+ // called when the use key is pressed
+ // if MUTATOR_RETURNVALUE is 1, don't do anything
+ // return 1 if the use key actually did something
return;
self.freezetag_frozen = 1;
self.freezetag_revive_progress = 0;
+ self.health = 1;
entity ice;
ice = spawn();
RemoveGrapplingHook(self);
// add waypoint
- WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
- if(self.waypointsprite_attached)
- {
- WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
- }
+ WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
if(attacker == self)
{
{
self.freezetag_frozen = 0;
self.freezetag_revive_progress = 0;
+ self.health = autocvar_g_balance_health_start;
// remove the ice block
entity ice;
--totalalive;
}
- if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
+ if(total_players > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
freezetag_CheckWinner();
freezetag_Unfreeze(world);
bprint("^7", frag_target.netname, "^1 was frozen by ^7", frag_attacker.netname, ".\n");
}
- frag_target.health = autocvar_g_balance_health_start; // "respawn" the player :P
+ frag_target.health = 1; // "respawn" the player :P
freezetag_CheckWinner();
{
freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed
- if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately
+ if(total_players == 1 && time > game_starttime) // only one player active on server, start a new match immediately
if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round
{
next_round = time;
if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
{
self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * autocvar_g_freezetag_revive_speed, 1);
+ self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
if(self.freezetag_revive_progress >= 1)
{
else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
{
self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
+ self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
}
else if(!n)
{
void ka_DropEvent(entity);
void ka_TimeScoring(void);
+entity ka_ball;
+
float ka_ballcarrier_waypointsprite_visible_for_player(entity);
void ka_Initialize() // run at the start of a match, initiates game mode
e.reset = ka_Reset;
e.touch = ka_TouchEvent;
e.owner = world;
+ ka_ball = e;
InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So.
}
pointparticles(particleeffectnum("electro_combo"), oldballorigin, '0 0 0', 1);
pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 1);
- WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
- WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+ WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
- sound(self, CHAN_AUTO, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+ sound(self, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
}
else
{
if(other.classname != "player")
{ // The ball just touched an object, most likely the world
pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1);
- sound(self, CHAN_AUTO, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
return;
}
else if(self.wait > time) { return; }
// messages and sounds
Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
- WriteString(MSG_BROADCAST, strcat("\n\n", other.netname, "^7 has picked up the ball!\n"));
- sound(self.owner, CHAN_AUTO, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+ WriteString(MSG_BROADCAST, strcat(other.netname, "^7 has picked up the ball!"));
+ sound(self.owner, CH_TRIGGER, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
// scoring
PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
// waypoints
- WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+ WaypointSprite_AttachCarrier("ka-ballcarrier", other, RADARICON_FLAGCARRIER, '1 0 0');
other.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = ka_ballcarrier_waypointsprite_visible_for_player;
WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
- WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
WaypointSprite_Ping(other.waypointsprite_attachedforcarrier);
WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
}
// messages and sounds
Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
- WriteString(MSG_BROADCAST, strcat("\n\n", plyr.netname, "^7 has dropped the ball!\n"));
- sound(other, CHAN_AUTO, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+ WriteString(MSG_BROADCAST, strcat(plyr.netname, "^7 has dropped the ball!"));
+ sound(other, CH_TRIGGER, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
// scoring
// PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1); Not anymore, this is 100% the same as pickups and is useless.
// waypoints
- WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+ WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
- WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
}
}
else if(!frag_attacker.ballcarried)
if(autocvar_g_keepaway_noncarrier_warn)
- centerprint_atprio(frag_attacker, (CENTERPRIO_SPAM + 5), "Killing people while you don't have the ball gives no points!");
+ centerprint(frag_attacker, "Killing people while you don't have the ball gives no points!");
if(frag_attacker.ballcarried) // add to amount of kills while ballcarrier
PlayerScore_Add(frag_attacker, SP_SCORE, autocvar_g_keepaway_score_killac);
if(self.ballcarried)
self.items |= IT_KEY1;
- // drop the ball if the player presses the use button
- if(self.BUTTON_USE)
- if(self.ballcarried) { ka_DropEvent(self); }
+ return 0;
+}
+MUTATOR_HOOKFUNCTION(ka_PlayerUseKey)
+{
+ if(MUTATOR_RETURNVALUE == 0)
+ if(self.ballcarried)
+ {
+ ka_DropEvent(self);
+ return 1;
+ }
return 0;
}
MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_ANY);
MUTATOR_HOOK(PlayerDamage_Calculate, ka_PlayerDamage, CBC_ORDER_ANY);
MUTATOR_HOOK(PlayerPowerups, ka_PlayerPowerups, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerUseKey, ka_PlayerUseKey, CBC_ORDER_ANY);
MUTATOR_ONADD
{
.float kh_dropperteam;
.entity kh_previous_owner;
.float kh_previous_owner_playerid;
+.float kh_cp_duration;
string kh_sound_capture = "kh/capture.wav";
string kh_sound_destroy = "kh/destroy.wav";
var kh_Think_t kh_Controller_Thinkfunc;
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func) // runs occasionaly
+void kh_Controller_SetThink(float t, string msg, float centerprint_duration, kh_Think_t func) // runs occasionaly
{
kh_Controller_Thinkfunc = func;
kh_controller.cnt = ceil(t);
if(msg == "")
kh_Controller_Waitmsg = "";
else
+ {
+ kh_controller.kh_cp_duration = centerprint_duration;
kh_Controller_Waitmsg = strzone(msg);
+ }
if(t == 0)
kh_controller.nextthink = time; // force
}
+void kh_Controller_SetThink_NoMsg(float t, kh_Think_t func) // runs occasionaly
+{
+ kh_Controller_SetThink(t, "", 0, func);
+}
void kh_Controller_Think() // called a lot
{
FOR_EACH_PLAYER(e)
if(clienttype(e) == CLIENTTYPE_REAL)
- centerprint_atprio(e, CENTERPRIO_SPAM, s);
+ Send_CSQC_Centerprint_Generic(e, CPID_KH_MSG, s, self.kh_cp_duration, 0);
}
self.cnt -= 1;
}
if(key.kh_next == world)
{
// player is now a key carrier
- WaypointSprite_AttachCarrier("", player);
+ WaypointSprite_AttachCarrier("", player, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
player.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_KeyCarrier_waypointsprite_visible_for_player;
WaypointSprite_UpdateRule(player.waypointsprite_attachedforcarrier, player.team, SPRITERULE_TEAMPLAY);
if(player.team == COLOR_TEAM1)
WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-yellow", "keycarrier-friend", "keycarrier-yellow");
else if(player.team == COLOR_TEAM4)
WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-pink", "keycarrier-friend", "keycarrier-pink");
- WaypointSprite_UpdateTeamRadar(player.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
if(!kh_no_radar_circles)
WaypointSprite_Ping(player.waypointsprite_attachedforcarrier);
}
void kh_Key_Collect(entity key, entity player) //a player picks up a dropped key
{
- sound(player, CHAN_AUTO, kh_sound_collect, VOL_BASE, ATTN_NORM);
+ sound(player, CH_TRIGGER, kh_sound_collect, VOL_BASE, ATTN_NORM);
if(key.kh_dropperteam != player.team)
{
kh_Key_Remove(key);
kh_no_radar_circles = FALSE;
- kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", 1, kh_StartRound);
}
void kh_WinnerTeam(float teem) // runs when a team wins
makevectors('0 1 0' * (self.cnt + mod(time, 360) * KH_KEY_XYSPEED));
setorigin(self, v_forward * KH_KEY_XYDIST + '0 0 1' * self.origin_z);
#endif
-
- if(self.owner.BUTTON_USE)
- if(time >= self.owner.kh_droptime + autocvar_g_balance_keyhunt_delay_drop)
- {
- self.owner.kh_droptime = time;
- self.kh_droptime = time; // prevent collecting this one for some time
- self.enemy = self.owner;
- 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, VOL_BASE, ATTN_NORM);
- makevectors(self.owner.v_angle);
- self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE);
- kh_Key_AssignTo(self, world);
- self.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
- self.kh_dropperteam = self.team;
- }
}
// if in nodrop or time over, end the round
{
if(self.siren_time < time)
{
- sound(self.owner, CHAN_AUTO, kh_sound_alarm, VOL_BASE, ATTN_NORM); // play a simple alarm
+ sound(self.owner, CH_TRIGGER, kh_sound_alarm, VOL_BASE, ATTN_NORM); // play a simple alarm
self.siren_time = time + 2.5; // repeat every 2.5 seconds
}
{
if(head.team == kh_interferemsg_team)
if(head.kh_next)
- centerprint(head, "All keys are in your team's hands!\n\nMeet the other key carriers ^1NOW^7!");
+ Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, "All keys are in your team's hands!\n\nMeet the other key carriers ^1NOW^7!", 0, 0);
else
- centerprint(head, "All keys are in your team's hands!\n\nHelp the key carriers to meet!");
+ Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, "All keys are in your team's hands!\n\nHelp the key carriers to meet!", 0, 0);
else
- centerprint(head, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"));
+ Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"), 0, 0);
}
}
centerprint(initial_owner, strcat("You are starting with the ", key.netname, "\n")); // message to player at start of round
- WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE);
+ WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
key.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_Key_waypointsprite_visible_for_player;
- WaypointSprite_UpdateTeamRadar(key.waypointsprite_attachedforcarrier, RADARICON_FLAG, '0 1 1');
kh_Key_AssignTo(key, initial_owner);
}
return teem;
}
+void kh_Key_DropOne(entity key)
+{
+ // prevent collecting this one for some time
+ entity player;
+ player = key.owner;
+
+ key.kh_droptime = time;
+ key.enemy = player;
+
+ kh_Scores_Event(player, key, "dropkey", 0, 0);
+ PlayerScore_Add(player, SP_KH_LOSSES, 1);
+ bprint(player.netname, "^7 dropped the ", key.netname, "\n");
+ kh_Key_AssignTo(key, world);
+ makevectors(player.v_angle);
+ key.velocity = W_CalculateProjectileVelocity(player.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE);
+ key.pusher = world;
+ key.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
+ key.kh_dropperteam = key.team;
+
+ sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTN_NORM);
+}
+
void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
{
entity key;
if(suicide)
key.kh_dropperteam = player.team;
}
- sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
+ sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTN_NORM);
}
}
if(time < game_starttime)
{
- kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+ kh_Controller_SetThink_NoMsg(game_starttime - time + 0.1, kh_WaitForPlayers);
return;
}
teams_missing = kh_CheckEnoughPlayers();
if(teams_missing == "")
- kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", 1, kh_StartRound);
else
- kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
+ kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), -1, kh_WaitForPlayers);
}
void kh_EnableTrackingDevice() // runs after each round
FOR_EACH_PLAYER(player)
if(clienttype(player) == CLIENTTYPE_REAL)
- centerprint_expire(player, CENTERPRIO_SPAM);
+ Send_CSQC_Centerprint_Generic_Expire(player, CPID_KH_MSG);
kh_tracking_enabled = TRUE;
}
if(time < game_starttime)
{
- kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+ kh_Controller_SetThink_NoMsg(game_starttime - time + 0.1, kh_WaitForPlayers);
return;
}
teams_missing = kh_CheckEnoughPlayers();
if(teams_missing != "")
{
- kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
+ kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), -1, kh_WaitForPlayers);
return;
}
FOR_EACH_PLAYER(player)
if(clienttype(player) == CLIENTTYPE_REAL)
- centerprint_expire(player, CENTERPRIO_SPAM);
+ Send_CSQC_Centerprint_Generic_Expire(player, CPID_KH_MSG);
for(i = 0; i < kh_teams; ++i)
{
}
kh_tracking_enabled = FALSE;
- kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_tracking, "Scanning frequency range...", kh_EnableTrackingDevice);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_tracking, "Scanning frequency range...", -1, kh_EnableTrackingDevice);
}
float kh_HandleFrags(entity attacker, entity targ, float f) // adds to the player score
// make a KH entity for controlling the game
kh_controller = spawn();
kh_controller.think = kh_Controller_Think;
- kh_Controller_SetThink(0, "", kh_WaitForPlayers);
+ kh_Controller_SetThink_NoMsg(0, kh_WaitForPlayers);
setmodel(kh_controller, "models/keyhunt/key.md3");
kh_key_dropped = kh_controller.modelindex;
{
if(self == other)
kh_Key_DropAll(self, TRUE);
- else if(other.classname == "player" || other.classname == "gib")
+ else if(other.classname == "player")
kh_Key_DropAll(self, FALSE);
else
kh_Key_DropAll(self, TRUE);
return 0;
}
+MUTATOR_HOOKFUNCTION(kh_PlayerUseKey)
+{
+ if(MUTATOR_RETURNVALUE == 0)
+ {
+ entity k;
+ k = self.kh_next;
+ if(k)
+ {
+ kh_Key_DropOne(k);
+ return 1;
+ }
+ }
+ return 0;
+}
+
MUTATOR_DEFINITION(gamemode_keyhunt)
{
MUTATOR_HOOK(MakePlayerObserver, kh_Key_DropAll, CBC_ORDER_ANY);
MUTATOR_HOOK(MatchEnd, kh_finalize, CBC_ORDER_ANY);
MUTATOR_HOOK(GetTeamCount, kh_GetTeamCount, CBC_ORDER_EXCLUSIVE);
MUTATOR_HOOK(SpectateCopy, kh_SpectateCopy, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerUseKey, kh_PlayerUseKey, CBC_ORDER_ANY);
MUTATOR_ONADD
{
// used by arena.qc ready-restart:
typedef void(void) kh_Think_t;
void kh_StartRound();
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func);
+void kh_Controller_SetThink_NoMsg(float t, kh_Think_t func);
+ (autocvar_sv_dodging_up_speed * v_up);
if (autocvar_sv_dodging_sound == 1)
- PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
setanim(self, self.anim_jump, TRUE, FALSE, TRUE);
nix_weapon = nix_nextweapon;
nix_weapon_ammo = nix_nextweapon_ammo;
nix_nextweapon = 0;
- nix_nextchange = time + autocvar_g_balance_nix_roundtime;
+ if (!nix_nextchange) // no round played yet?
+ nix_nextchange = time; // start the first round now!
+ else
+ nix_nextchange = time + autocvar_g_balance_nix_roundtime;
//weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
}
-
+
if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
{
self.nix_lastchange_id = nix_nextchange;
if(dt >= 1 && dt <= 5)
self.nix_lastinfotime = -42;
else
- centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nix_weapon)));
+ Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^2Active weapon: ^3", W_Name(nix_weapon)), 0, 0);
+
+ weapon_action(nix_weapon, WR_RESETPLAYER);
+
+ // all weapons must be fully loaded when we spawn
+ entity e;
+ e = get_weaponinfo(nix_weapon);
+ if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
+ self.weapon_load[nix_weapon] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
+
+ // nex too
+ if(autocvar_g_balance_nex_charge)
+ {
+ if(autocvar_g_balance_nex_secondary_chargepool)
+ self.nex_chargepool_ammo = 1;
+ self.nex_charge = autocvar_g_balance_nex_charge_start;
+ }
}
if(self.nix_lastinfotime != dt)
{
self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
if(dt >= 1 && dt <= 5)
- centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon), "\n"));
+ Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^3%d^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon)), 1, dt);
}
if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
{
g_nix_with_laser = autocvar_g_nix_with_laser;
- nix_nextchange = time;
+ nix_nextchange = 0;
nix_nextweapon = 0;
NIX_precache();
ball.effects |= EF_NOSHADOW;
ball.scale = 1; // scale down.
- WaypointSprite_AttachCarrier("nb-ball", plyr);
+ WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
- WaypointSprite_UpdateTeamRadar(plyr.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
if (g_nexball_basketball_delay_hold)
{
}
WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
- //WaypointSprite_AttachCarrier("nb-ball", ball);
- WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE); // no health bar please
+ WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
- WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
ball.owner.ballcarried = world;
ball.owner = world;
self.teamtime = 0;
self.pusher = world;
self.team = FALSE;
- sound (self, CHAN_PROJECTILE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
LogNB("init", world);
}
if (other.solid == SOLID_BSP) {
if (time > self.lastground + 0.1)
{
- sound (self, CHAN_PROJECTILE, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
self.lastground = time;
}
if (vlen(self.velocity) && !self.cnt)
LogNB("caught", other);
GiveBall(other, self);
} else if (other.solid == SOLID_BSP) {
- sound (self, CHAN_PROJECTILE, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
if (vlen(self.velocity) && !self.cnt)
self.nextthink = min(time + g_nexball_delay_idle, self.teamtime);
}
pscore = 1;
}
- sound (ball, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+ sound (ball, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
if(ball.team && pscore)
{
precache_sound (self.noise1);
precache_sound (self.noise2);
- WaypointSprite_AttachCarrier("nb-ball", self); // the ball's team is not set yet, no rule update needed
- WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+ WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
self.reset = ball_restart;
self.think = InitBall;
PROJECTILE_TOUCH;
if(attacker.team != other.team || g_nexball_basketball_teamsteal)
- if((ball = other.ballcarried) && (attacker.classname == "player" || attacker.classname == "gib"))
+ if((ball = other.ballcarried) && (attacker.classname == "player"))
{
other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
other.flags &~= FL_ONGROUND;
if(!attacker.ballcarried)
{
LogNB("stole", attacker);
- sound (other, CHAN_AUTO, ball.noise2, VOL_BASE, ATTN_NORM);
+ sound (other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTN_NORM);
if(attacker.team == other.team && time > attacker.teamkill_complain)
{
if (!(ball = self.ballcarried))
return;
- W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CHAN_WEAPON, 0);
+ W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
if(trace_startsolid)
{
local entity missile;
if (!(balls & BALL_BASKET))
return;
- W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CHAN_WEAPON, 0);
+ W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
// pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
{
precache_model ("models/weapons/g_porto.md3");
precache_model ("models/weapons/v_porto.md3");
- precache_model ("models/weapons/h_porto.dpm");
+ precache_model ("models/weapons/h_porto.iqm");
precache_model ("models/elaser.mdl");
precache_sound ("nexball/shoot1.wav");
precache_sound ("nexball/shoot2.wav");
entity openlist;
entity closedlist;
-entity edgelist;
entity goal_node;
entity start_node;
var float buildpath_nodefilter(vector n,vector c,vector p);
var float pathlib_wpp_waypointcallback(entity wp, entity wp_prev);
-var const float pathlib_wpp_wpcb_null();
#ifdef DEBUGPATHING
#include "debug.qc"
acc-<weapon netname>-frags: amount of frags dealt by weapon
*/
-//#NO AUTOCVARS START
-void PlayerStats_Shutdown()
+void PlayerStats_ready(entity fh, entity pass, float status)
{
string p, pn;
string e, en;
string nn, tt;
- float b;
- float i;
+ string s;
+
+ switch(status)
+ {
+ case URL_READY_CANWRITE:
+ url_fputs(fh, "V 1\n");
+#ifdef WATERMARK
+ url_fputs(fh, sprintf("R %s\n", WATERMARK()));
+#endif
+ url_fputs(fh, sprintf("T %s.%06d\n", strftime(FALSE, "%s"), floor(random() * 1000000)));
+ url_fputs(fh, sprintf("G %s\n", GetGametype()));
+ url_fputs(fh, sprintf("M %s\n", GetMapname()));
+ url_fputs(fh, sprintf("I %s\n", matchid));
+ url_fputs(fh, sprintf("S %s\n", cvar_string("hostname")));
+ url_fputs(fh, sprintf("C %d\n", cvar_purechanges_count));
+ for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
+ {
+ url_fputs(fh, sprintf("P %s\n", p));
+ nn = db_get(playerstats_db, sprintf("%s:_playerid", p));
+ if(nn != "")
+ url_fputs(fh, sprintf("i %s\n", nn));
+ nn = db_get(playerstats_db, sprintf("%s:_netname", p));
+ if(nn != "")
+ url_fputs(fh, sprintf("n %s\n", nn));
+ if(teamplay)
+ {
+ tt = db_get(playerstats_db, sprintf("%s:_team", p));
+ url_fputs(fh, sprintf("t %s\n", tt));
+ }
+ for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
+ {
+ float v;
+ v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
+ if(v != 0)
+ url_fputs(fh, sprintf("e %s %g\n", e, v));
+ }
+ }
+ url_fputs(fh, "\n");
+ db_close(playerstats_db);
+ playerstats_db = -1;
+ url_fclose(fh, PlayerStats_ready, world);
+ break;
+ case URL_READY_CANREAD:
+ // url_fclose is processing, we got a response for writing the data
+ // this must come from HTTP
+ print("Got response from player stats server:\n");
+ while((s = url_fgets(fh)))
+ print(" ", s, "\n");
+ print("End of response.\n");
+ url_fclose(fh, PlayerStats_ready, world);
+ break;
+ case URL_READY_CLOSED:
+ // url_fclose has finished
+ print("Player stats written\n");
+ playerstats_waitforme = TRUE;
+ break;
+ case URL_READY_ERROR:
+ default:
+ print("Player stats writing failed: ", ftos(status), "\n");
+ playerstats_waitforme = TRUE;
+ if(playerstats_db >= 0)
+ {
+ db_close(playerstats_db);
+ playerstats_db = -1;
+ }
+ break;
+ }
+}
+
+//#NO AUTOCVARS START
+void PlayerStats_Shutdown()
+{
string uri;
if(playerstats_db < 0)
uri = autocvar_g_playerstats_uri;
if(uri != "")
{
- b = buf_create();
- i = 0;
-
- db_dump(playerstats_db, "foo.db");
-
- bufstr_set(b, i++, "V 1");
-#ifdef WATERMARK
- bufstr_set(b, i++, sprintf("R %s", WATERMARK()));
-#endif
- bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000)));
- bufstr_set(b, i++, sprintf("G %s", GetGametype()));
- bufstr_set(b, i++, sprintf("M %s", GetMapname()));
- bufstr_set(b, i++, sprintf("S %s", cvar_string("hostname")));
- bufstr_set(b, i++, sprintf("C %d", cvar_purechanges_count));
- for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
- {
- bufstr_set(b, i++, sprintf("P %s", p));
- nn = db_get(playerstats_db, sprintf("%s:_netname", p));
- if(nn != "")
- bufstr_set(b, i++, sprintf("n %s", nn));
- if(teams_matter)
- {
- tt = db_get(playerstats_db, sprintf("%s:_team", p));
- bufstr_set(b, i++, sprintf("t %s", tt));
- }
- for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
- {
- float v;
- v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
- if(v != 0)
- bufstr_set(b, i++, sprintf("e %s %g", e, v));
- }
- }
- bufstr_set(b, i++, "");
-
- if(autocvar_g_playerstats_debug)
- {
- for(i = 0; i < buf_getsize(b); ++i)
- print(bufstr_get(b, i), "\n");
- }
-
- if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0))
- playerstats_requested = TRUE;
- else
- playerstats_waitforme = TRUE; // if posting fails, we must continue anyway
-
- buf_del(b);
+ url_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
+ playerstats_waitforme = FALSE;
}
else
+ {
playerstats_waitforme = TRUE;
-
- db_close(playerstats_db);
- playerstats_db = -1;
+ db_close(playerstats_db);
+ playerstats_db = -1;
+ }
}
//#NO AUTOCVARS END
// add global info!
if(p.alivetime)
+ {
PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+ p.alivetime = 0;
+ }
- if(p.alivetime)
- PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+ db_put(playerstats_db, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid));
if(p.cvar_cl_allow_uid2name == 1 || clienttype(p) == CLIENTTYPE_BOT)
db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
- if(teams_matter)
+ if(teamplay)
db_put(playerstats_db, sprintf("%s:_team", p.playerstats_id), ftos(p.team));
- if(p.alivetime > 0)
+ if(stof(db_get(playerstats_db, sprintf("%d:%s", p.playerstats_id, PLAYERSTATS_ALIVETIME))) > 0)
PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
strunzone(p.playerstats_id);
{
entity p, winner;
winner = PlayerScore_Sort(score_dummyfield);
- FOR_EACH_PLAYER(p)
+ FOR_EACH_PLAYER(p) // spectators intentionally not included
{
PlayerScore_PlayerStats(p);
PlayerStats_Accuracy(p);
void Portal_Connect(entity teleporter, entity destination)
{
- teleporter.portal_transform = AnglesTransform_Divide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
+ teleporter.portal_transform = AnglesTransform_RightDivide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
teleporter.enemy = destination;
destination.enemy = teleporter;
if(killed)
{
fixedmakevectors(portal.mangle);
- sound(portal, CHAN_PROJECTILE, "porto/explode.wav", VOL_BASE, ATTN_NORM);
+ sound(portal, CH_SHOTS, "porto/explode.wav", VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4);
remove(portal);
}
else
{
Portal_MakeBrokenPortal(portal);
- sound(portal, CHAN_PROJECTILE, "porto/expire.wav", VOL_BASE, ATTN_NORM);
+ sound(portal, CH_SHOTS, "porto/expire.wav", VOL_BASE, ATTN_NORM);
SUB_SetFade(portal, time, 0.5);
}
}
../common/util.qh
../common/items.qh
../common/explosion_equation.qh
+../common/urllib.qh
autocvars.qh
constants.qh
//// tZork Turrets ////
tturrets/include/turrets_early.qh
+vehicles/vehicles_def.qh
campaign.qh
../common/campaign_common.qh
campaign.qc
../common/campaign_file.qc
../common/campaign_setup.qc
+../common/urllib.qc
../common/gamecommand.qc
gamecommand.qc
if(!self.race_penalty)
{
if(self.race_checkpoint)
- WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+ WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
else
- WaypointSprite_SpawnFixed("race-finish", o, self, sprite);
+ WaypointSprite_SpawnFixed("race-start-finish", o, self, sprite, RADARICON_NONE, '1 0.5 0');
}
self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
race_timed_checkpoint = 1;
if(self.race_checkpoint == 0)
- WaypointSprite_SpawnFixed("race-start", o, self, sprite);
+ WaypointSprite_SpawnFixed("race-start", o, self, sprite, RADARICON_NONE, '1 0.5 0');
else
- WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+ WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
if(score_enabled)
ScoreInfo_SetLabel_TeamScore (ST_SCORE, "score", stprio);
- if not(independent_players)
+ if not(INDEPENDENT_PLAYERS)
ScoreInfo_SetLabel_PlayerScore(SP_KILLS, "kills", 0);
ScoreInfo_SetLabel_PlayerScore(SP_DEATHS, "deaths", SFL_LOWER_IS_BETTER);
- if not(independent_players)
+ if not(INDEPENDENT_PLAYERS)
ScoreInfo_SetLabel_PlayerScore(SP_SUICIDES, "suicides", SFL_LOWER_IS_BETTER);
if(score_enabled)
}
void ScoreRules_generic()
{
- if(teams_matter)
+ if(teamplay)
{
CheckAllowedTeams(world);
ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE);
vr = vectoangles(dir);
//vr_x *= -1;
- tracebox(self.origin , self.mins,self.maxs,self.origin + (dir * length) ,MOVE_NOMONSTERS,self);
+ tracebox(self.origin + '0 0 1' * step_up, self.mins, self.maxs, ('0 0 1' * step_up) + self.origin + (dir * length), MOVE_NOMONSTERS, self);
if(trace_fraction == 1.0)
{
//te_lightning1(self,self.origin,self.origin + (dir * length));
#ifdef TLIBS_TETSLIBS
void flocker_die()
{
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-
pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
self.owner.cnt += 1;
local entity oldself;
local float dm;
oldself = self;
- self = findfloat(world, iscreature, TRUE);
- while (self)
+ for(self = world; (self = findfloat(self, iscreature, TRUE)); )
{
- if (self.movetype != MOVETYPE_NOCLIP)
+ if (self.movetype == MOVETYPE_NOCLIP)
+ continue;
+ float vehic = (self.vehicle_flags & VHF_ISVEHICLE);
+ if (self.waterlevel)
{
- if (self.waterlevel)
+ if (!(self.flags & FL_INWATER))
+ {
+ self.flags |= FL_INWATER;
+ self.dmgtime = 0;
+ }
+ if(!vehic) // vehicles don't drown
{
- if (!(self.flags & FL_INWATER))
- {
- self.flags |= FL_INWATER;
- self.dmgtime = 0;
- }
if (self.waterlevel != WATERLEVEL_SUBMERGED)
{
if(self.air_finished < time + 9)
- PlayerSound(playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ PlayerSound(playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND);
self.air_finished = time + 12;
self.dmg = 2;
}
self.pain_finished = time + 0.5;
}
}
- if (self.dmgtime < time)
+ }
+ if (self.dmgtime < time)
+ {
+ self.dmgtime = time + 0.2;
+ if (self.watertype == CONTENT_LAVA)
{
- self.dmgtime = time + 0.2;
- if (self.watertype == CONTENT_LAVA)
+ if (self.watersound_finished < time)
{
- if (self.watersound_finished < time)
- {
- self.watersound_finished = time + 0.5;
- 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');
+ self.watersound_finished = time + 0.5;
+ sound (self, CH_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
}
- else if (self.watertype == CONTENT_SLIME)
+ Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
+ }
+ else if (self.watertype == CONTENT_SLIME)
+ {
+ if (self.watersound_finished < time)
{
- if (self.watersound_finished < time)
- {
- self.watersound_finished = time + 0.5;
- 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');
+ self.watersound_finished = time + 0.5;
+ sound (self, CH_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
}
+ Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
}
}
- else
+ }
+ else
+ {
+ if (self.flags & FL_INWATER)
{
- if (self.flags & FL_INWATER)
- {
- // play leave water sound
- self.flags &~= FL_INWATER;
- self.dmgtime = 0;
- }
- self.air_finished = time + 12;
- self.dmg = 2;
+ // play leave water sound
+ self.flags &~= FL_INWATER;
+ self.dmgtime = 0;
}
+ self.air_finished = time + 12;
+ self.dmg = 2;
+ }
+
+ if(!vehic) // vehicles don't get falling damage
+ {
// check for falling damage
float velocity_len = vlen(self.velocity);
if(!self.hook.state && !g_ca && !(g_cts && !autocvar_g_cts_selfdamage))
if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');
-
// play stupid sounds
if (g_footsteps)
if (!gameover)
if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
{
if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
- GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ GlobalSound(globalsound_metalstep, CH_PLAYER, VOICETYPE_PLAYERSOUND);
else
- GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+ GlobalSound(globalsound_step, CH_PLAYER, VOICETYPE_PLAYERSOUND);
}
}
}
- self.oldvelocity = self.velocity;
}
- self = findfloat(self, iscreature, TRUE);
+
+ self.oldvelocity = self.velocity;
}
self = oldself;
}
void SV_OnEntityPreSpawnFunction()
{
if(self.gametypefilter != "")
- if not(isGametypeInFilter(game, teams_matter, have_team_spawns, self.gametypefilter))
+ if not(isGametypeInFilter(game, teamplay, have_team_spawns, self.gametypefilter))
{
remove(self);
return;
return;
}
}
+
+void WarpZone_PostInitialize_Callback(void)
+{
+ // create waypoint links for warpzones
+ entity e;
+ for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+ {
+ vector src, dst;
+ src = (e.absmin + e.absmax) * 0.5;
+ makevectors(e.warpzone_angles);
+ src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
+ dst = (e.enemy.absmin + e.enemy.absmax) * 0.5;
+ makevectors(e.enemy.warpzone_angles);
+ dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right;
+ waypoint_spawnforteleporter_v(e, src, dst, 0);
+ }
+}
{
if not(other.iscreature)
return;
+ if (other.vehicle_flags & VHF_ISVEHICLE)
+ return;
EXACTTRIGGER_TOUCH;
{
Item_Show(self, 1);
if(!g_minstagib && self.items == IT_STRENGTH)
- sound (self, CHAN_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
+ sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
else if(!g_minstagib && self.items == IT_INVINCIBLE)
- sound (self, CHAN_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
+ sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
else
- sound (self, CHAN_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
+ sound (self, CH_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);
}
if(name)
{
- WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE);
+ WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
if(self.waypointsprite_attached)
- {
- WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_POWERUP, rgb);
- //WaypointSprite_UpdateMaxHealth(self.waypointsprite_attached, ITEM_RESPAWN_TICKS + 1);
WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
- }
}
}
- sound (self, CHAN_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound
+ sound (self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound
if(self.waypointsprite_attached)
{
WaypointSprite_Ping(self.waypointsprite_attached);
{
pickedup = TRUE;
// play some cool sounds ;)
- centerprint(player, "\n");
if (clienttype(player) == CLIENTTYPE_REAL)
{
if(player.health <= 5)
}
if (item.flags & FL_WEAPON)
- if ((it = item.weapons - (item.weapons & player.weapons)) || (g_pickup_weapons_anyway && !(g_weapon_stay == 3 && !e.spawnshieldtime)))
+ if ((it = item.weapons - (item.weapons & player.weapons)) || (g_pickup_weapons_anyway && g_weapon_stay == 0))
{
pickedup = TRUE;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
if (!pickedup)
return 0;
- sound (player, CHAN_AUTO, item.item_pickupsound, VOL_BASE, ATTN_NORM);
+ sound (player, CH_TRIGGER, item.item_pickupsound, VOL_BASE, ATTN_NORM);
if (_switchweapon)
if (player.switchweapon != w_getbestweapon(player))
W_SwitchWeapon_Force(player, w_getbestweapon(player));
void spawnfunc_weapon_shotgun (void);
void spawnfunc_weapon_uzi (void) {
- if(q3acompat_machineshotgunswap)
+ if(autocvar_sv_q3acompat_machineshotgunswap)
if(self.classname != "droppedweapon")
{
weapon_defaultspawnfunc(WEP_SHOTGUN);
}
void spawnfunc_weapon_shotgun (void) {
- if(q3acompat_machineshotgunswap)
+ if(autocvar_sv_q3acompat_machineshotgunswap)
if(self.classname != "droppedweapon")
{
weapon_defaultspawnfunc(WEP_UZI);
void spawnfunc_item_shells (void);
void spawnfunc_item_bullets (void) {
if(!weaponswapping)
- if(q3acompat_machineshotgunswap)
+ if(autocvar_sv_q3acompat_machineshotgunswap)
if(self.classname != "droppedweapon")
{
weaponswapping = TRUE;
void spawnfunc_item_shells (void) {
if(!weaponswapping)
- if(q3acompat_machineshotgunswap)
+ if(autocvar_sv_q3acompat_machineshotgunswap)
if(self.classname != "droppedweapon")
{
weaponswapping = TRUE;
if(v1 <= v0 - t)
{
if(snd_decr != "")
- sound (e, CHAN_AUTO, snd_decr, VOL_BASE, ATTN_NORM);
+ sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTN_NORM);
}
else if(v0 >= v0 + t)
{
if(snd_incr != "")
- sound (e, CHAN_AUTO, snd_incr, VOL_BASE, ATTN_NORM);
+ sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTN_NORM);
}
}
void trigger_push_use()
{
- if(teams_matter)
+ if(teamplay)
self.team = activator.team;
}
void trigger_push_touch()
{
- if (self.active == ACTIVE_NOT)
- return;
+ vector move;
- // FIXME: add a .float for whether an entity should be tossed by jumppads
- if (!other.iscreature)
- if (other.classname != "corpse")
- if (other.classname != "body")
- if (other.classname != "gib")
- if (other.classname != "casing")
- if (other.classname != "droppedweapon")
- if (other.classname != "keepawayball")
- if (!other.projectiledeathtype || other.classname == "bullet")
+ if (self.active == ACTIVE_NOT)
return;
- if (other.deadflag && other.iscreature)
+ if (!isPushable(other))
return;
if(self.team)
EXACTTRIGGER_TOUCH;
- if(self.target)
- self.movedir = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
+ if(self.enemy)
+ {
+ other.velocity = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
+ }
+ else if(self.target)
+ {
+ entity e;
+ RandomSelection_Init();
+ for(e = world; (e = find(e, targetname, self.target)); )
+ {
+ if(e.cnt)
+ RandomSelection_Add(e, 0, string_null, e.cnt, 1);
+ else
+ RandomSelection_Add(e, 0, string_null, 1, 1);
+ }
+ other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, self.height);
+ }
+ else
+ {
+ other.velocity = self.movedir;
+ }
other.flags &~= FL_ONGROUND;
- other.velocity = self.movedir;
-
if (other.classname == "player")
{
// reset tracking of oldvelocity for impact damage (sudden velocity changes)
{
// flash when activated
pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1);
- sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
self.pushltime = time + 0.2;
}
local float ct;
.vector dest;
void trigger_push_findtarget()
{
- local entity e;
+ local entity e, t;
local vector org;
local float flighttime;
if (self.target)
{
- // find the target
- self.enemy = find(world, targetname, self.target);
- if (!self.enemy)
+ float n;
+ n = 0;
+ for(t = world; (t = find(t, targetname, self.target)); )
{
- objerror("trigger_push: target not found\n");
- remove(self);
- return;
+ ++n;
+ e = spawn();
+ setorigin(e, org);
+ setsize(e, PL_MIN, PL_MAX);
+ e.velocity = trigger_push_calculatevelocity(org, t, self.height);
+ tracetoss(e, e);
+ if(e.movetype == MOVETYPE_NONE)
+ waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity));
+ remove(e);
}
- self.movedir = trigger_push_calculatevelocity(org, self.enemy, self.height);
- flighttime = trigger_push_calculatevelocity_flighttime;
+ if(n == 0)
+ {
+ // no dest!
+ objerror ("Jumppad with nonexistant target");
+ return;
+ }
+ else if(n == 1)
+ {
+ // exactly one dest - bots love that
+ self.enemy = find(e, targetname, self.target);
+ }
+ else
+ {
+ // have to use random selection every single time
+ self.enemy = world;
+ }
}
else
- flighttime = 0;
-
- // calculate the destination and spawn a teleporter spawnfunc_waypoint
- e = spawn();
- setorigin(e, org);
- setsize(e, PL_MIN, PL_MAX);
- e.velocity = self.movedir;
- tracetoss(e, e);
- self.dest = trace_endpos;
- remove(e);
-
- waypoint_spawnforteleporter(self, self.dest, flighttime);
+ {
+ e = spawn();
+ setorigin(e, org);
+ setsize(e, PL_MIN, PL_MAX);
+ e.velocity = self.movedir;
+ tracetoss(e, e);
+ waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity));
+ remove(e);
+ }
};
/*
void plat_hit_top()
{
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.state = 1;
self.think = plat_go_down;
self.nextthink = self.ltime + 3;
void plat_hit_bottom()
{
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.state = 2;
};
void plat_go_down()
{
- sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, 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_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM);
self.state = 4;
SUB_CalcMove (self.pos1, self.speed, plat_hit_top);
};
plat_go_down ();
else if (self.state == 3)
plat_go_up ();
- else
- objerror ("plat_crush: bad self.state\n");
+ // when in other states, then the plat_crush event came delayed after
+ // plat state already had changed
+ // this isn't a bug per se!
}
};
void train_wait()
{
if(self.noise != "")
- stopsoundto(MSG_BROADCAST, self, CHAN_TRIGGER); // send this as unreliable only, as the train will resume operation shortly anyway
+ stopsoundto(MSG_BROADCAST, self, CH_TRIGGER_SINGLE); // send this as unreliable only, as the train will resume operation shortly anyway
if(self.wait < 0)
{
SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
if(self.noise != "")
- sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+ sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
};
void func_train_find()
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
}
if (!self.speed)
self.speed = 4;
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
}
self.active = ACTIVE_ACTIVE;
return;
if (self.noise != "")
- sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos2, self.speed, button_wait);
void door_hit_top()
{
if (self.noise1 != "")
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.state = STATE_TOP;
if (self.spawnflags & DOOR_TOGGLE)
return; // don't come down automatically
void door_hit_bottom()
{
if (self.noise1 != "")
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.state = STATE_BOTTOM;
};
void door_go_down()
{
if (self.noise2 != "")
- sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
}
if (self.noise2 != "")
- sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos2, self.speed, door_hit_top);
void door_rotating_hit_top()
{
if (self.noise1 != "")
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.state = STATE_TOP;
if (self.spawnflags & DOOR_TOGGLE)
return; // don't come down automatically
void door_rotating_hit_bottom()
{
if (self.noise1 != "")
- sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating
{
self.pos2 = '0 0 0' - self.pos2;
void door_rotating_go_down()
{
if (self.noise2 != "")
- sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
return;
}
if (self.noise2 != "")
- sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
self.state = STATE_UP;
SUB_CalcAngleMove (self.pos2, self.speed, door_rotating_hit_top);
// Make a sound, wait a little...
if (self.noise1 != "")
- sound(self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
self.nextthink = self.ltime + 0.1;
temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
self.dest2 = self.dest1 + v_forward * self.t_length;
SUB_CalcMove(self.dest1, self.speed, fd_secret_move1);
if (self.noise2 != "")
- sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
};
// Wait after first movement...
self.nextthink = self.ltime + 1.0;
self.think = fd_secret_move2;
if (self.noise3 != "")
- sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
};
// Start moving sideways w/sound...
void fd_secret_move2()
{
if (self.noise2 != "")
- sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
SUB_CalcMove(self.dest2, self.speed, fd_secret_move3);
};
void fd_secret_move3()
{
if (self.noise3 != "")
- sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
if (!(self.spawnflags & SECRET_OPEN_ONCE))
{
self.nextthink = self.ltime + self.wait;
void fd_secret_move4()
{
if (self.noise2 != "")
- sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
};
self.nextthink = self.ltime + 1.0;
self.think = fd_secret_move6;
if (self.noise3 != "")
- sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
};
void fd_secret_move6()
{
if (self.noise2 != "")
- sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done);
};
//self.th_pain = fd_secret_use;
}
if (self.noise3 != "")
- sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
};
void secret_blocked()
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
}
if (!self.speed)
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
}
if(!self.targetfactor)
// Q3 style filters (DO NOT USE, THIS IS COMPAT ONLY)
if(self.notq3a)
- if(!teams_matter || g_tdm || g_ctf)
+ if(!teamplay || g_tdm || g_ctf)
return 1;
if(self.notta)
- if not(!teams_matter || g_tdm || g_ctf)
+ if not(!teamplay || g_tdm || g_ctf)
return 1;
if(self.notsingle)
return 1;
if(self.notteam)
- if(teams_matter)
+ if(teamplay)
return 1;
if(self.notfree)
- if(!teams_matter)
+ if(!teamplay)
return 1;
if(self.gametype)
string gametypename;
// static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester", "teamtournament"};
gametypename = "ffa";
- if(teams_matter)
+ if(teamplay)
gametypename = "team";
if(g_arena)
gametypename = "tournament";
void trigger_teleport_use()
{
- if(teams_matter)
+ if(teamplay)
self.team = activator.team;
}
{
TDEATHLOOP(org)
{
- if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
+ if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
if(head.classname == "player")
if(head.health >= 1)
return 1;
{
if (player.classname == "player" && player.health >= 1)
{
- if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
+ if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
{
if(head.classname == "player")
if(head.health >= 1)
makevectors (to_angles);
- if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps
+ if(player.classname == "player") // don't play sounds or show particles for anything that isn't a player, maybe change later to block only observers
{
- if(tflags & TELEPORT_FLAG_SOUND)
- sound (player, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
- if(tflags & TELEPORT_FLAG_PARTICLES)
+ if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps
{
- pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1);
- pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1);
+ if(tflags & TELEPORT_FLAG_SOUND)
+ sound (player, CH_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
+ if(tflags & TELEPORT_FLAG_PARTICLES)
+ {
+ pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1);
+ pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1);
+ }
+ self.pushltime = time + 0.2;
}
- self.pushltime = time + 0.2;
}
// Relocate the player
}
}
-void Teleport_Touch (void)
+void Simple_TeleportPlayer(entity teleporter, entity player)
{
- entity oldself, e;
- vector o;
+ vector locout;
+ entity e;
float p;
+
+ // Find the output teleporter
+ if(!teleporter.enemy)
+ {
+ RandomSelection_Init();
+ for(e = world; (e = find(e, targetname, teleporter.target)); )
+ {
+ p = 1;
+ if(autocvar_g_telefrags_avoid)
+ {
+ locout = e.origin + '0 0 1' * (1 - player.mins_z - 24);
+ if(check_tdeath(player, locout, '0 0 0', '0 0 0'))
+ p = 0;
+ }
+ RandomSelection_Add(e, 0, string_null, (e.cnt ? e.cnt : 1), p);
+ }
+ teleporter.enemy = RandomSelection_chosen_ent;
+ }
+
+ if(!teleporter.enemy) { sprint(player, "Teleport destination vanished. Sorry... please complain to the mapper.\n"); }
+
+ makevectors(teleporter.enemy.mangle);
+
+ if(teleporter.enemy.speed)
+ if(vlen(player.velocity) > teleporter.enemy.speed)
+ player.velocity = normalize(player.velocity) * max(0, teleporter.enemy.speed);
+
+ if(autocvar_g_teleport_maxspeed)
+ if(vlen(player.velocity) > autocvar_g_teleport_maxspeed)
+ player.velocity = normalize(player.velocity) * max(0, autocvar_g_teleport_maxspeed);
+
+ locout = teleporter.enemy.origin + '0 0 1' * (1 - player.mins_z - 24);
+ TeleportPlayer(teleporter, player, locout, teleporter.enemy.mangle, v_forward * vlen(player.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER);
+}
+
+void Teleport_Touch (void)
+{
+ entity oldself;
string s;
if (self.active != ACTIVE_ACTIVE)
return;
- if (other.health < 1)
+ if not(other.iscreature)
+ if (other.deadflag != DEAD_NO)
return;
- if not(other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too
+
+ // for gameplay: vehicles can't teleport
+ if (other.vehicle_flags & VHF_ISVEHICLE)
+ return;
+
+ if (other.deadflag != DEAD_NO)
return;
if(self.team)
EXACTTRIGGER_TOUCH;
- makevectors(self.enemy.mangle);
-
if(other.classname == "player")
RemoveGrapplingHook(other);
-
- if(self.enemy)
- {
- e = self.enemy;
- }
- else
- {
- RandomSelection_Init();
- for(e = world; (e = find(e, targetname, self.target)); )
- {
- p = 1;
- if(autocvar_g_telefrags_avoid)
- {
- o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
- if(check_tdeath(other, o, '0 0 0', '0 0 0'))
- p = 0;
- }
- if(e.cnt)
- RandomSelection_Add(e, 0, string_null, e.cnt, p);
- else
- RandomSelection_Add(e, 0, string_null, 1, p);
- }
- e = RandomSelection_chosen_ent;
- }
-
- if(!e)
- {
- sprint(other, "Teleport destination vanished. Sorry... please complain to the mapper.\n");
- }
-
- if(e.speed)
- if(vlen(other.velocity) > e.speed)
- other.velocity = normalize(other.velocity) * max(0, e.speed);
- if(autocvar_g_teleport_maxspeed)
- if(vlen(other.velocity) > autocvar_g_teleport_maxspeed)
- other.velocity = normalize(other.velocity) * max(0, autocvar_g_teleport_maxspeed);
-
- o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
- TeleportPlayer(self, other, o, e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER);
+
+ Simple_TeleportPlayer(self, other);
activator = other;
s = self.target; self.target = string_null;
if not(self.target) self.target = s;
oldself = self;
- self = e;
+ self = self.enemy;
SUB_UseTargets();
self = oldself;
}
entity e;
float n;
- RandomSelection_Init();
n = 0;
for(e = world; (e = find(e, targetname, self.target)); )
{
++n;
if(e.movetype == MOVETYPE_NONE)
- RandomSelection_Add(e, 0, string_null, 1, 1);
+ waypoint_spawnforteleporter(self, e.origin, 0);
if(e.classname != "info_teleport_destination")
print("^3MAPPER ERROR: teleporter does target an invalid teleport destination entity. Angles will not work.\n");
}
- if(RandomSelection_chosen_ent)
- waypoint_spawnforteleporter(self, RandomSelection_chosen_ent.origin, 0);
if(n == 0)
{
{
// exactly one dest - bots love that
self.enemy = find(e, targetname, self.target);
- self.dest = self.enemy.origin;
}
else
{
self.touch = Teleport_Touch;
}
+entity Teleport_Find(vector mi, vector ma)
+{
+ entity e;
+ for(e = world; (e = find(e, classname, "trigger_teleport")); )
+ if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world))
+ return e;
+ return world;
+}
+
+entity teleport_first;
+.entity teleport_next;
void spawnfunc_trigger_teleport (void)
{
self.angles = '0 0 0';
objerror ("Teleporter with no target");
return;
}
+
+ self.teleport_next = teleport_first;
+ teleport_first = self;
}
void WarpZone_PostTeleportPlayer_Callback(entity pl)
{
UpdateCSQCProjectileAfterTeleport(pl);
+ // "disown" projectiles after teleport
+ if(pl.owner == pl.realowner)
+ pl.owner = world;
if(pl.classname == "player")
{
// reset tracking of oldvelocity for impact damage (sudden velocity changes)
{
if(intermission_running)
return 0; // no rebalancing whatsoever please
- if(!teams_matter)
+ if(!teamplay)
return 0;
if(autocvar_g_campaign)
return 0;
g_tdm = 1;
}
- teams_matter = 0;
+ teamplay = 0;
serverflags &~= SERVERFLAG_TEAMPLAY;
}
void ActivateTeamplay()
{
serverflags |= SERVERFLAG_TEAMPLAY;
- teams_matter = 1;
+ teamplay = 1;
}
void InitGameplayMode()
MUTATOR_ADD(gamemode_keepaway);
}
- if(teams_matter)
+ if(teamplay)
entcs_init();
// save it (for the next startup)
return versionmsg;
}
-
-void PrintWelcomeMessage(entity pl)
+string getwelcomemessage(void)
{
string s, modifications, motd;
- if(self.cvar_scr_centertime == 0) return;
-
- if(autocvar_g_campaign)
- {
- if(self.classname == "player" && !self.BUTTON_INFO)
- return;
- }
- else
- {
- if((time - self.jointime) > autocvar_welcome_message_time && !self.BUTTON_INFO)
- return;
- }
-
- if( !(timeoutStatus >= 1) ) { //really print the WelcomeMessage to the player every frame when timeout-seconds are shown or the game is restarted, to make sure that the shown number is accurate
- if(self.welcomemessage_time > time) return;
- self.welcomemessage_time = time + max(0.5, self.cvar_scr_centertime * 0.6);
- }
-
- if(autocvar_g_campaign)
- {
- centerprint(pl, campaign_message);
- return;
- }
-
-//TODO GreEn`mArine: make the timeout-messages clientside as well (just like the ready restart countdown)!
- if(!self.BUTTON_INFO)
- {
- // TODO get rid of this too
- local string specString;
- specString = NEWLINES;
- //if(time < game_starttime) //also show the countdown when being a spectator
- // specString = strcat(specString, "\n\n^1Game starts in ", ftos(ceil(game_starttime - time)), " seconds^7");
- //else
- if (timeoutStatus != 0)
- specString = strcat(specString, "\n\n", getTimeoutText(1));
- else
- {
- if(self.classname == "player")
- return;
- goto normal;
- }
- return centerprint_atprio(self, CENTERPRIO_SPAM, specString);
- }
-
-:normal
ret_string = "";
MUTATOR_CALLHOOK(BuildMutatorsPrettyString);
modifications = ret_string;
local string versionmessage;
versionmessage = GetClientVersionMessage();
- s = strcat(s, NEWLINES, "This is Xonotic ", autocvar_g_xonoticversion, "\n", versionmessage);
+ s = strcat("This is Xonotic ", autocvar_g_xonoticversion, "\n", versionmessage);
s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
if(modifications != "")
s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
- if(timeoutStatus != 0)
- s = strcat(s, "\n\n", getTimeoutText(1));
-
if (g_grappling_hook)
s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
if (motd != "") {
s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd));
}
- s = strcat(s, "\n");
-
- centerprint(pl, s);
+ return s;
}
-
void SetPlayerColors(entity pl, float _color)
{
/*string s;
shirt = _color & 0xF0;
- if(teams_matter) {
+ if(teamplay) {
setcolor(pl, 16*pants + pants);
} else {
setcolor(pl, shirt + pants);
float smallest, selectedteam;
// don't join a team if we're not playing a team game
- if(!teams_matter)
+ if(!teamplay)
return 0;
// find out what teams are available
float scolor, dcolor, steam, dteam, dbotcount, scount, dcount;
// in normal deathmatch we can just apply the color and we're done
- if(!teams_matter) {
+ if(!teamplay) {
SetPlayerColors(self, _color);
return;
}
#define TTURRETS_ENABLED
#ifdef TTURRETS_ENABLED
-
-#message "with tZork turrets"
+#ifdef SVQC
+//#message "with tZork turrets"
float turret_count;
#define TSF_NO_PATHBREAK 8
/// Dont respawn
#define TSL_NO_RESPAWN 16
+/// Let this turret roam when idle.
+#define TSL_ROAM 32
/// target selection flags
.float target_select_flags;
.float target_select_playerbias;
/// Field of view
//.float target_select_fov;
-/// Last thimestamp this surret aquierd a valid target
+/// Last timestamp this turret aquierd a valid target
.float target_select_time;
-
+/// Throttle re-validation of current target
+.float target_validate_time;
/*
* Aim refers to real aiming, not gun pos (thats done by track)
*/
.void() turret_diehook;
.void() turret_respawnhook;
-/*
-#define TEH_THINK 2
-#define TEH_DAMAGE 4
-#define TEH_DIE 8
-#define TEH_RESPAWN 16
-#define TEH_TRACK 32
-#define TEH_AIM 64
-#define TEH_SELECT 128
-.float(float event_id) turret_eventhook;
-*/
-
-
/*
* Target selection, preferably but not nessesarely
* return a normalized result.
*/
/// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic
-.float(entity e_turret, entity e_target) turret_score_target;
-
+.float(entity _turret, entity _target) turret_score_target;
/*
* Target selection
*/
/// Generic, fairly smart, bias-aware target selection.
-float turret_stdproc_targetscore_generic(entity e_turret, entity e_target);
+float turret_stdproc_targetscore_generic(entity _turret, entity _target);
/// Experimental supportunits targetselector
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target);
+float turret_stdproc_targetscore_support(entity _turret,entity _target);
/*
* Aim functions
.vector tur_shotdir_updated;
void turrets_precash();
-
-
+#endif // SVQC
+
+// common
+.float turret_type;
+float TID_COMMON = 1;
+float TID_EWHEEL = 2;
+float TID_FLAC = 3;
+float TID_FUSION = 4;
+float TID_HELLION = 5;
+float TID_HK = 6;
+float TID_MACHINEGUN = 7;
+float TID_MLRS = 8;
+float TID_PHASER = 9;
+float TID_PLASMA = 10;
+float TID_PLASMA_DUAL = 11;
+float TID_TESLA = 12;
+float TID_WALKER = 13;
+float TID_LAST = 13;
+
+float TNSF_UPDATE = 2;
+float TNSF_STATUS = 4;
+float TNSF_SETUP = 8;
+float TNSF_ANG = 16;
+float TNSF_AVEL = 32;
+float TNSF_MOVE = 64;
+.float anim_start_time;
+float TNSF_ANIM = 128;
+
+float TNSF_FULL_UPDATE = 16777215;
#endif // TTURRETS_ENABLED
/*
-* Trow a turret gib
+* Spawn a boom, trow fake bits arround
+* and hide the real ones.
*/
-void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+void turret_hide()
{
- self.velocity += vforce;
+ self.effects |= EF_NODRAW;
+ self.nextthink = time + self.respawntime - 0.2;
+ self.think = turret_stdproc_respawn;
}
-void turret_trowgib(
- vector v_from, vector v_to, vector v_colormod,
- string smodel,
- float f_lifetime, float f_fadetime, float b_burn)
-{
- local entity gib;
- local entity burn;
-
- gib = spawn();
-
- gib.classname = "turret_gib";
- setmodel(gib, smodel);
- setorigin(gib, v_from);
- SUB_SetFade(gib,time + f_lifetime, 2);
-
- gib.solid = SOLID_BBOX;
- gib.movetype = MOVETYPE_BOUNCE;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.colormod = v_colormod;
- gib.velocity = v_to;
-
- if (b_burn)
- {
- burn = spawn();
- burn.effects = EF_LOWPRECISION;//|EF_FLAME;
- setattachment(burn,gib,"");
- setorigin(burn,(gib.mins + gib.maxs) * 0.5);
- SUB_SetFade(burn,time + (f_lifetime * 0.5), 2);
- }
-}
-
-void turret_gib_boom()
-{
- entity gib;
- float i;
- string s;
-
- for (i = 1; i < 5; i = i +1)
- {
- gib = spawn();
- gib.classname = "turret_gib";
-
- s = strcat("models/turrets/head-gib",ftos(i));
- s = strcat(s,".md3");
- setmodel(gib, s);
-
- setorigin(gib,self.origin);
-
- SUB_SetFade(gib,time + 5,2);
-
- gib.solid = SOLID_BBOX;
- gib.movetype = MOVETYPE_BOUNCE;
- gib.gravity = 0.5;
- gib.damageforcescale = 2;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.velocity = self.velocity + (randomvec() * 700);
- gib.avelocity = randomvec() * 64;
- }
-
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
-
- remove(self);
-}
-
-void turret_trowgib2(
- vector v_from, vector v_to, vector v_colormod,
- entity e_mimic, float boomtime)
-{
- entity gib;
-
- gib = spawn();
-
- gib.classname = "turret_gib";
- setmodel(gib,e_mimic.model);
- setorigin(gib,v_from);
-
- gib.solid = SOLID_BBOX;
-
- gib.movetype = MOVETYPE_BOUNCE;
- gib.gravity = 0.75;
- gib.damageforcescale = 2;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.colormod = v_colormod;
- gib.velocity = v_to;
- gib.avelocity = randomvec() * 32;
- gib.think = turret_gib_boom;
- gib.nextthink = boomtime;
- //gib.effects = EF_FLAME;
-
-
-}
-/*
-* Spawn a boom, trow fake bits arround
-* and hide the real ones.
-*/
void turret_stdproc_die()
{
- vector org2;
- vector t_dir;
-
self.deadflag = DEAD_DEAD;
self.tur_head.deadflag = self.deadflag;
- sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
- org2 = self.origin + '0 0 40';
-
-// Explotion grafix
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
// Unsolidify and hide real parts
self.solid = SOLID_NOT;
self.tur_head.solid = self.solid;
- self.alpha = -1;
- self.tur_head.alpha = self.alpha;
- self.customizeentityforclient = SUB_False;
- self.tur_head.customizeentityforclient = SUB_False;
-
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- self.effects = 0;
- self.tur_head.effects = self.effects;
self.health = 0;
-// Trow fake parts arround
- // base
- if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS)
- {
- makevectors(self.angles);
- if (random() > 0.5)
- {
- turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1);
-
- t_dir = (v_up * 700) + (randomvec() * 300);
- turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1);
-
- t_dir = (v_up * 700) + (randomvec() * 300);
- turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1);
- }
- else
- {
- turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1);
- }
-
- // Blow the top part up into the air
- turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5));
- }
-
// Go boom
//RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
else
{
// Setup respawn
- self.nextthink = time + self.respawntime;
- self.think = turret_stdproc_respawn;
+ self.SendFlags |= TNSF_STATUS;
+ self.nextthink = time + 0.2;
+ self.think = turret_hide;
if (self.turret_diehook)
self.turret_diehook();
}
}
-var const float SUB_NullFloat();
void turret_stdproc_respawn()
{
// Make sure all parts belong to the same team since
// this function doubles as "teamchange" function.
-
self.tur_head.team = self.team;
- self.colormod = '0 0 0';
-
- switch(self.team)
- {
- case COLOR_TEAM1: // Red
- self.colormod = '1.4 0.8 0.8';
- break;
-
- case COLOR_TEAM2: // Blue
- self.colormod = '0.8 0.8 1.4';
- break;
-
- case COLOR_TEAM3: // Yellow
- self.colormod = '1.4 1.4 0.6';
- break;
-
- case COLOR_TEAM4: // Pink
- self.colormod = '1.4 0.6 1.4';
- break;
- }
+ self.effects &~= EF_NODRAW;
self.deadflag = DEAD_NO;
self.effects = EF_LOWPRECISION;
- self.tur_head.effects = self.effects;
self.solid = SOLID_BBOX;
- self.alpha = 1;
- self.tur_head.alpha = self.alpha;
- self.customizeentityforclient = SUB_NullFloat;
- self.tur_head.customizeentityforclient = SUB_NullFloat;
-
self.takedamage = DAMAGE_AIM;
self.event_damage = turret_stdproc_damage;
self.nextthink = time + self.ticrate;
self.think = turret_think;
+
+ self.SendFlags = TNSF_FULL_UPDATE;
if (self.turret_respawnhook)
self.turret_respawnhook();
-
}
/*
*/
void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
{
-
// Enougth allready!
- if (self.health <= 0)
+ if(self.deadflag == DEAD_DEAD)
return;
// Inactive turrets take no damage. (hm..)
if not (self.tur_active)
return;
- if (teams_matter)
+ if (teamplay)
if (self.team == attacker.team)
{
// This does not happen anymore. Re-enable if you fix that.
{
self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
+
+ self.SendFlags |= TNSF_ANG;
+
}
if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
self.velocity = self.velocity + vforce;
-
- // FIXME: Better damage feedback?
if (self.health <= 0)
{
self.nextthink = time;
self.think = turret_stdproc_die;
}
+
+ self.SendFlags |= TNSF_STATUS;
}
#define cvar_base "g_turrets_unit_"
-
-/*
-float turret_customizeentityforclient()
-{
+.float clientframe;
+void turrets_setframe(float _frame, float client_only)
+{
+ if((client_only ? self.clientframe : self.frame ) != _frame)
+ {
+ self.SendFlags |= TNSF_ANIM;
+ self.anim_start_time = time;
+ }
+
+ if(client_only)
+ self.clientframe = _frame;
+ else
+ self.frame = _frame;
+
}
-float Turret_SendEntity(entity to, float sf)
+float turret_send(entity to, float sf)
{
+
+ WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & TNSF_SETUP)
+ {
+ WriteByte(MSG_ENTITY, self.turret_type);
+
+ WriteCoord(MSG_ENTITY, self.origin_x);
+ WriteCoord(MSG_ENTITY, self.origin_y);
+ WriteCoord(MSG_ENTITY, self.origin_z);
+
+ WriteAngle(MSG_ENTITY, self.angles_x);
+ WriteAngle(MSG_ENTITY, self.angles_y);
+ }
+
+ if(sf & TNSF_ANG)
+ {
+ WriteShort(MSG_ENTITY, rint(self.tur_head.angles_x));
+ WriteShort(MSG_ENTITY, rint(self.tur_head.angles_y));
+ }
+
+ if(sf & TNSF_AVEL)
+ {
+ WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_x));
+ WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_y));
+ }
+
+ if(sf & TNSF_MOVE)
+ {
+ WriteShort(MSG_ENTITY, rint(self.origin_x));
+ WriteShort(MSG_ENTITY, rint(self.origin_y));
+ WriteShort(MSG_ENTITY, rint(self.origin_z));
- WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);
- WriteCoord(MSG_ENTITY, self.tur_head.angles_x);
- WriteCoord(MSG_ENTITY, self.tur_head.angles_y);
- WriteByte(MSG_ENTITY, self.tur_head.frame);
-
- //WriteCoord(MSG_ENTITY, self.tur_head.angles_z);
-
+ WriteShort(MSG_ENTITY, rint(self.velocity_x));
+ WriteShort(MSG_ENTITY, rint(self.velocity_y));
+ WriteShort(MSG_ENTITY, rint(self.velocity_z));
+
+ WriteShort(MSG_ENTITY, rint(self.angles_y));
+ }
+
+ if(sf & TNSF_ANIM)
+ {
+ WriteCoord(MSG_ENTITY, self.anim_start_time);
+ WriteByte(MSG_ENTITY, self.frame);
+ }
+
+ if(sf & TNSF_STATUS)
+ {
+ WriteByte(MSG_ENTITY, self.team);
+
+ if(self.health <= 0)
+ WriteByte(MSG_ENTITY, 0);
+ else
+ WriteByte(MSG_ENTITY, ceil((self.health / self.tur_health) * 255));
+ }
+
return TRUE;
}
-*/
void load_unit_settings(entity ent, string unitname, float is_reload)
{
ent.turret_respawnhook();
}
-
/**
** updates enemy distances, predicted impact point/time
** and updated aim<->predict impact distance.
self.tur_dist_impact_to_aimpos = 0;
else
self.tur_dist_impact_to_aimpos = vlen(trace_endpos - self.tur_aimpos);
-
-
}
else
tracebox(self.tur_shotorg, '-1 -1 -1','1 1 1', self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos),MOVE_NORMAL,self);
** Handles head rotation according to
** the units .track_type and .track_flags
**/
+.float turret_framecounter;
void turret_stdproc_track()
{
vector target_angle; // This is where we want to aim
vector move_angle; // This is where we can aim
float f_tmp;
-
+ vector v1, v2;
+ v1 = self.tur_head.angles;
+ v2 = self.tur_head.avelocity;
+
if (self.track_flags == TFL_TRACK_NO)
return;
self.tur_head.angles_y = anglemods(self.tur_head.angles_y);
// Find the diffrence between where we currently aim and where we want to aim
- move_angle = target_angle - (self.angles + self.tur_head.angles);
- move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+ //move_angle = target_angle - (self.angles + self.tur_head.angles);
+ //move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+
+ move_angle = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(self.angles), AnglesTransform_FromAngles(target_angle))) - self.tur_head.angles;
+ move_angle = shortangle_vxy(move_angle, self.tur_head.angles);
switch(self.track_type)
{
if(self.tur_head.angles_y < -self.aim_maxrot)
self.tur_head.angles_y = self.aim_maxrot;
}
-
+
+ // CSQC
+ self.SendFlags = TNSF_ANG;
+
return;
case TFL_TRACKTYPE_FLUIDINERTIA:
{
self.tur_head.avelocity_x = 0;
self.tur_head.angles_x = self.aim_maxpitch;
+
+ self.SendFlags |= TNSF_ANG;
}
if((self.tur_head.angles_x + self.tur_head.avelocity_x * self.ticrate) < -self.aim_maxpitch)
{
self.tur_head.avelocity_x = 0;
self.tur_head.angles_x = -self.aim_maxpitch;
+
+ self.SendFlags |= TNSF_ANG;
}
}
{
self.tur_head.avelocity_y = 0;
self.tur_head.angles_y = self.aim_maxrot;
+
+ self.SendFlags |= TNSF_ANG;
}
if((self.tur_head.angles_y + self.tur_head.avelocity_y * self.ticrate) < -self.aim_maxrot)
{
self.tur_head.avelocity_y = 0;
self.tur_head.angles_y = -self.aim_maxrot;
+
+ self.SendFlags |= TNSF_ANG;
}
}
+
+ self.SendFlags |= TNSF_AVEL;
+
+ // Force a angle update every 10'th frame
+ self.turret_framecounter += 1;
+ if(self.turret_framecounter >= 10)
+ {
+ self.SendFlags |= TNSF_ANG;
+ self.turret_framecounter = 0;
+ }
}
entity e;
self.nextthink = time + self.ticrate;
-
+
// ONS uses somewhat backwards linking.
- if (teams_matter)
+ if (teamplay)
{
if not (g_onslaught)
if (self.target)
if not (self.spawnflags & TSF_NO_AMMO_REGEN)
if (self.ammo < self.ammo_max)
self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
-
- if (self.health < (self.tur_health * 0.5))
- if(random() < 0.25)
- te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
// Inactive turrets needs to run the think loop,
// So they can handle animation and wake up if need be.
do_target_scan = 1;
// Old target (if any) invalid?
+ if(self.target_validate_time < time)
if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
{
self.enemy = world;
+ self.target_validate_time = time + 0.5;
do_target_scan = 1;
}
void turret_link()
{
- //Net_LinkEntity(self, FALSE, 0, Turret_SendEntity);
+ Net_LinkEntity(self, TRUE, 0, turret_send);
self.think = turret_think;
self.nextthink = time;
+ self.tur_head.effects = EF_NODRAW;
}
void turrets_manager_think()
* (unless you have a very good reason not to)
* if the return value is 0, the turret should be removed.
*/
-float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base, string head)
+float turret_stdproc_init (string cvar_base_name, string base, string head, float _turret_type)
{
entity e, ee;
// Are turrets allowed?
if (autocvar_g_turrets == 0)
return 0;
-
-
+
+ if(_turret_type < 1 || _turret_type > TID_LAST)
+ {
+ dprint("Invalid / Unkown turret type\"", ftos(_turret_type), "\", aborting!\n");
+ return 0;
+ }
+ self.turret_type = _turret_type;
+
e = find(world, classname, "turret_manager");
if not (e)
{
e.nextthink = time + 2;
}
+ /*
if(csqc_shared)
{
dprint("WARNING: turret requested csqc_shared but this is not implemented. Expect strange things to happen.\n");
csqc_shared = 0;
}
-
+ */
+
if not (self.spawnflags & TSF_SUSPENDED)
droptofloor_builtin();
// Terrainbase spawnflag. This puts a enlongated model
// under the turret, so it looks ok on uneaven surfaces.
+ /* TODO: Handle this with CSQC
if (self.spawnflags & TSF_TERRAINBASE)
{
entity tb;
setorigin(tb,self.origin);
tb.solid = SOLID_BBOX;
}
+ */
self.cvar_basename = cvar_base_name;
- load_unit_settings(self,self.cvar_basename, 0);
+ load_unit_settings(self, self.cvar_basename, 0);
+ self.effects = EF_NODRAW;
+
// Handle turret teams.
if (autocvar_g_assault != 0)
{
if not (self.team)
self.team = 14; // Assume turrets are on the defending side if not explicitly set otehrwize
}
- else if not (teams_matter)
+ else if not (teamplay)
self.team = MAX_SHOT_DISTANCE; // Group all turrets into the same team, so they dont kill eachother.
else if(g_onslaught && self.targetname)
{
self.target_validate_flags = self.target_select_flags;
-
// Ammo stuff
if not (self.ammo_max)
self.ammo_max = self.shot_dmg * 10;
// Offsets & origins
if (!self.tur_shotorg) self.tur_shotorg = '50 0 50';
+
+ if (!self.health)
+ self.health = 150;
-// Gane hooks
+// Game hooks
if(MUTATOR_CALLHOOK(TurretSpawn))
return 0;
setorigin(self.tur_head, '0 0 0');
setattachment(self.tur_head, self, "tag_head");
- if (!self.health)
- self.health = 150;
-
self.tur_health = self.health;
self.solid = SOLID_BBOX;
self.tur_head.solid = SOLID_NOT;
else
self.idle_aim = '0 0 0';
- // Team color
- if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
- if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-
// Attach stdprocs. override when and what needed
+ self.turret_firecheckfunc = turret_stdproc_firecheck;
+ self.turret_firefunc = turret_stdproc_fire;
+ self.event_damage = turret_stdproc_damage;
+
if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
- {
self.turret_score_target = turret_stdproc_targetscore_support;
- self.turret_firecheckfunc = turret_stdproc_firecheck;
- self.turret_firefunc = turret_stdproc_fire;
- self.event_damage = turret_stdproc_damage;
- }
else
- {
self.turret_score_target = turret_stdproc_targetscore_generic;
- self.turret_firecheckfunc = turret_stdproc_firecheck;
- self.turret_firefunc = turret_stdproc_fire;
- self.event_damage = turret_stdproc_damage;
- }
self.use = turret_stdproc_use;
self.bot_attack = TRUE;
- // Initiate the main AI loop
- if(csqc_shared)
- self.think = turret_link;
- else
- self.think = turret_think;
-
++turret_count;
self.nextthink = time + 1;
self.nextthink += turret_count * sys_frametime;
activator = ee;
self.use();
}
-
+
+ turret_link();
turret_stdproc_respawn();
+
+ if (!turret_tag_fire_update())
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
return 1;
}
void turrets_precash()
{
- precache_model ("models/turrets/base-gib1.md3");
- precache_model ("models/turrets/base-gib2.md3");
- precache_model ("models/turrets/base-gib3.md3");
- precache_model ("models/turrets/base-gib4.md3");
-
- precache_model ("models/turrets/head-gib1.md3");
- precache_model ("models/turrets/head-gib2.md3");
- precache_model ("models/turrets/head-gib3.md3");
- precache_model ("models/turrets/head-gib4.md3");
- precache_model ("models/turrets/terrainbase.md3");
-
- //precache_model ("models/turrets/base.md3");
- //precache_model ("models/turrets/flac.md3");
- //precache_model ("models/turrets/pd_proj.md3");
- //precache_model ("models/turrets/reactor.md3");
- //precache_model ("models/turrets/mlrs_rocket.md3");
- //precache_model ("models/turrets/hellion.md3");
- //precache_model ("models/turrets/hunter2.md3");
- //precache_model ("models/turrets/hk.md3");
- //precache_model ("models/turrets/machinegun.md3");
- //precache_model ("models/turrets/rocket.md3");
- //precache_model ("models/turrets/mlrs.md3");
- //precache_model ("models/turrets/phaser.md3");
- //precache_model ("models/turrets/phaser_beam.md3");
- //precache_model ("models/turrets/plasmad.md3");
- //precache_model ("models/turrets/plasma.md3");
- //precache_model ("models/turrets/tesla_head.md3");
- //precache_model ("models/turrets/tesla_base.md3");
#ifdef TURRET_DEBUG
turrets_precache_debug_models();
#endif
-/*
-.float target_select_flags; /// target selection flags
-float TFL_TARGETSELECT_NO = 1; /// Dont select a target on its own.
-float TFL_TARGETSELECT_LOS = 2; /// Need line of sight
-float TFL_TARGETSELECT_PLAYERS = 4; /// Players are valid targets
-float TFL_TARGETSELECT_MISSILES = 8; /// Missiles are valid targets
-float TFL_TARGETSELECT_TRIGGERTARGET = 16; /// Responds to turret_trigger_target events
-float TFL_TARGETSELECT_ANGLELIMITS = 32; /// Angular limitations of turret head limits target selection
-float TFL_TARGETSELECT_RANGELIMTS = 64; /// Range limits apply in targetselection
-float TFL_TARGETSELECT_TEAMCHECK = 128; /// Consider team own <-> targets team
-float TFL_TARGETSELECT_NOBUILTIN = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
-float TFL_TARGETSELECT_OWNTEAM = 512;
-*/
-
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_support(entity _turret,entity _target)
{
float score; // Total score
- float s_score,d_score;
+ float s_score, d_score;
- if (e_turret.enemy == e_target) s_score = 1;
+ if (_turret.enemy == _target) s_score = 1;
- d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+ d_score = min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
- score = (d_score * e_turret.target_select_rangebias) +
- (s_score * e_turret.target_select_samebias);
+ score = (d_score * _turret.target_select_rangebias) +
+ (s_score * _turret.target_select_samebias);
return score;
}
/*
* Generic bias aware score system.
*/
-float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
+float turret_stdproc_targetscore_generic(entity _turret, entity _target)
{
- //vector v_tmp;
float d_dist; // Defendmode Distance
-
float score; // Total score
-
float d_score; // Distance score
float a_score; // Angular score
float m_score; // missile score
float p_score; // player score
- //float da_score; // Distance from aimpoint score
-
float ikr; // ideal kill range
- /*
- if(!e_target)
- return 0;
- */
-
- if (e_turret.tur_defend)
+ if (_turret.tur_defend)
{
- d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
- ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
- d_score = 1 - d_dist / e_turret.target_range;
+ d_dist = vlen(real_origin(_target) - _turret.tur_defend.origin);
+ ikr = vlen(_turret.origin - _turret.tur_defend.origin);
+ d_score = 1 - d_dist / _turret.target_range;
}
else
{
// Make a normlized value base on the targets distance from our optimal killzone
- ikr = e_turret.target_range_optimal;
- d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
+ ikr = _turret.target_range_optimal;
+ d_score = min(ikr, tvt_dist) / max(ikr, tvt_dist);
}
- /*
- // Determine the maximum time it could take this turrent to aim at someting.
- max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
-
- // Find out how long it would take to aim at this taget.
- aim_delay = (thadf+0.01) / e_turret.aim_speed;
-
- // Turn this info into a normalized value.
- aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
- a_score = 1 - aim_delay;
- */
-
- //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
- a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
+ a_score = 1 - tvt_thadf / _turret.aim_maxrot;
- if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
+ if ((_turret.target_select_missilebias > 0) && (_target.flags & FL_PROJECTILE))
m_score = 1;
- if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
+ if ((_turret.target_select_playerbias > 0) && (_target.flags & FL_CLIENT))
p_score = 1;
d_score = max(d_score, 0);
m_score = max(m_score, 0);
p_score = max(p_score, 0);
- score = (d_score * e_turret.target_select_rangebias) +
- (a_score * e_turret.target_select_anglebias) +
- (m_score * e_turret.target_select_missilebias) +
- (p_score * e_turret.target_select_playerbias);
+ score = (d_score * _turret.target_select_rangebias) +
+ (a_score * _turret.target_select_anglebias) +
+ (m_score * _turret.target_select_missilebias) +
+ (p_score * _turret.target_select_playerbias);
- if(e_turret.target_range < vlen(e_turret.tur_shotorg - real_origin(e_target)))
+ if(_turret.target_range < vlen(_turret.tur_shotorg - real_origin(_target)))
{
dprint("Wtf?\n");
score *= 0.001;
string sdt,sat,smt,spt;
sd = ftos(d_score);
- d_score *= e_turret.target_select_rangebias;
+ d_score *= _turret.target_select_rangebias;
sdt = ftos(d_score);
//sv = ftos(v_score);
- //v_score *= e_turret.target_select_samebias;
+ //v_score *= _turret.target_select_samebias;
//svt = ftos(v_score);
sa = ftos(a_score);
- a_score *= e_turret.target_select_anglebias;
+ a_score *= _turret.target_select_anglebias;
sat = ftos(a_score);
sm = ftos(m_score);
- m_score *= e_turret.target_select_missilebias;
+ m_score *= _turret.target_select_missilebias;
smt = ftos(m_score);
sp = ftos(p_score);
- p_score *= e_turret.target_select_playerbias;
+ p_score *= _turret.target_select_playerbias;
spt = ftos(p_score);
ss = ftos(score);
- bprint("^3Target scores^7 \[ ",e_turret.netname, " \] ^3for^7 \[ ", e_target.netname," \]\n");
+ bprint("^3Target scores^7 \[ ",_turret.netname, " \] ^3for^7 \[ ", _target.netname," \]\n");
bprint("^5Range:\[ ",sd, " \]^2+bias:\[ ",sdt," \]\n");
bprint("^5Angle:\[ ",sa, " \]^2+bias:\[ ",sat," \]\n");
bprint("^5Missile:\[ ",sm," \]^2+bias:\[ ",smt," \]\n");
}
/*
-float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_close(entity _turret,entity _target)
{
- return 1 - (tvt_dist / e_turret.target_range);
+ return 1 - (tvt_dist / _turret.target_range);
}
-float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
+float turret_stdproc_targetscore_far (entity _turret,entity _target)
{
- return tvt_dist / e_turret.target_range;
+ return tvt_dist / _turret.target_range;
}
-float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_optimal(entity _turret,entity _target)
{
- return min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+ return min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
}
-float turret_stdproc_score_angular(entity e_turret,entity e_target)
+float turret_stdproc_score_angular(entity _turret,entity _target)
{
- return 1 - (tvt_thadf / e_turret.aim_maxrot);
+ return 1 - (tvt_thadf / _turret.aim_maxrot);
}
-float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_defend(entity _turret,entity _target)
{
return 0;
- //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
+ //min(_target.origin,_turret.tur_defend.origin) / max(_target.origin,_turret.tur_defend.origin);
}
*/
{
}
+#if 0
+void turret_checkpoint_think()
+{
+ if(self.enemy)
+ te_lightning1(self,self.origin, self.enemy.origin);
+
+ self.nextthink = time + 0.25;
+}
+#endif
/*QUAKED turret_checkpoint (1 0 1) (-32 -32 -32) (32 32 32)
-----------KEYS------------
target: .targetname of next waypoint in chain.
If a loop is of targets are formed, any unit entering this loop will patrol it indefinitly.
If the checkpoint chain in not looped, the unit will go "Roaming" when the last point is reached.
*/
+//float tc_acum;
void turret_checkpoint_init()
{
- traceline(self.origin, self.origin - '0 0 1024', MOVE_WORLDONLY, self);
- setorigin(self,trace_endpos + '0 0 8');
+ traceline(self.origin + '0 0 16', self.origin - '0 0 1024', MOVE_WORLDONLY, self);
+ setorigin(self, trace_endpos + '0 0 32');
if(self.target != "")
{
- self.enemy = find(world,targetname,self.target);
+ self.enemy = find(world, targetname, self.target);
if(self.enemy == world)
dprint("A turret_checkpoint faild to find its target!\n");
}
+ //self.think = turret_checkpoint_think;
+ //self.nextthink = time + tc_acum + 0.25;
+ //tc_acum += 0.25;
}
void spawnfunc_turret_checkpoint()
{
setorigin(self,self.origin);
self.think = turret_checkpoint_init;
- self.nextthink = time + 0.1;
+ self.nextthink = time + 0.2;
}
// Compat.
#define ewheel_amin_bck_slow 3
#define ewheel_amin_bck_fast 4
-float ewheel_speed_fast;
-float ewheel_speed_slow;
-float ewheel_speed_slower;
-float ewheel_speed_stop;
-
-void turret_ewheel_loadcvars()
-{
- ewheel_speed_fast = autocvar_g_turrets_unit_ewheel_speed_fast;
- ewheel_speed_slow = autocvar_g_turrets_unit_ewheel_speed_slow;
- ewheel_speed_slower = autocvar_g_turrets_unit_ewheel_speed_slower;
- ewheel_speed_stop = autocvar_g_turrets_unit_ewheel_speed_stop;
-}
-
void turret_ewheel_projectile_explode()
{
- vector org2;
-
- org2 = findbetterlocation (self.origin, 8);
- pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
- //w_deathtypestring = "saw the eweel. to late.";
#ifdef TURRET_DEBUG
float d;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d;
self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
#endif
- sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
remove (self);
}
{
turret_do_updates(self);
- sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
proj = spawn ();
}
}
-
+//#define EWHEEL_FANCYPATH
void ewheel_move_path()
{
-
+#ifdef EWHEEL_FANCYPATH
// Are we close enougth to a path node to switch to the next?
if (vlen(self.origin - self.pathcurrent.origin) < 64)
if (self.pathcurrent.path_next == world)
else
self.pathcurrent = self.pathcurrent.path_next;
-
+#else
+ if (vlen(self.origin - self.pathcurrent.origin) < 64)
+ self.pathcurrent = self.pathcurrent.enemy;
+#endif
if (self.pathcurrent)
{
self.moveto = self.pathcurrent.origin;
self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
- movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
-
- return;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
}
}
void ewheel_move_enemy()
{
+ float newframe;
+
self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
//self.steerto = steerlib_standoff(self.enemy.origin,self.target_range_optimal);
{
if ( self.tur_head.spawnshieldtime < 1 )
{
- self.frame = ewheel_amin_fwd_fast;
- movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
+ newframe = ewheel_amin_fwd_fast;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
}
else if (self.tur_head.spawnshieldtime < 2)
{
- self.frame = ewheel_amin_fwd_slow;
- movelib_move_simple(v_forward, ewheel_speed_slow, 0.4);
+ newframe = ewheel_amin_fwd_slow;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
}
else
{
- self.frame = ewheel_amin_fwd_slow;
- movelib_move_simple(v_forward, ewheel_speed_slower, 0.4);
+ newframe = ewheel_amin_fwd_slow;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slower, 0.4);
}
}
else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
{
- self.frame = ewheel_amin_bck_slow;
- movelib_move_simple(v_forward * -1, ewheel_speed_slow, 0.4);
+ newframe = ewheel_amin_bck_slow;
+ movelib_move_simple(v_forward * -1, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
}
else
{
- self.frame = ewheel_amin_stop;
- movelib_beak_simple(ewheel_speed_stop);
+ newframe = ewheel_amin_stop;
+ movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
+ }
+
+ if(self.frame != newframe)
+ {
+ self.frame = newframe;
+ self.SendFlags |= TNSF_ANIM;
+ self.anim_start_time = time;
}
}
void ewheel_move_idle()
{
+ if(self.frame != 0)
+ {
+ self.SendFlags |= TNSF_ANIM;
+ self.anim_start_time = time;
+ }
+
self.frame = 0;
if (vlen(self.velocity))
- movelib_beak_simple(ewheel_speed_stop);
+ movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
}
void ewheel_postthink()
{
float vz;
- vector wish_angle,real_angle;
-
- /*
- if(self.enemy)
- dprint("enemy!\n");
- else
- dprint("nothign =(!\n");
- */
+ vector wish_angle, real_angle;
vz = self.velocity_z;
self.angles_x = anglemods(self.angles_x);
self.angles_y = anglemods(self.angles_y);
- //self.angles_x *= -1;
fixedmakevectors(self.angles);
- //self.angles_x *= -1;
wish_angle = normalize(self.steerto);
wish_angle = vectoangles(wish_angle);
real_angle = wish_angle - self.angles;
- real_angle = shortangle_vxy(real_angle,self.tur_head.angles);
+ real_angle = shortangle_vxy(real_angle, self.tur_head.angles);
self.tur_head.spawnshieldtime = fabs(real_angle_y);
- real_angle_y = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);
+ real_angle_y = bound(-self.tur_head.aim_speed, real_angle_y, self.tur_head.aim_speed);
self.angles_y = (self.angles_y + real_angle_y);
- // Simulate banking
- self.angles_z -= self.angles_z * frametime * 2;
- self.angles_z = bound(-45,self.angles_z + ((real_angle_y * -25) * frametime),45);
-
if(self.enemy)
ewheel_move_enemy();
else if(self.pathcurrent)
self.velocity_z = vz;
+
+ if(vlen(self.velocity))
+ self.SendFlags |= TNSF_MOVE;
}
void ewheel_respawnhook()
entity e;
// Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
- if(self.movetype != MOVETYPE_WALK)
+ if(self.movetype != MOVETYPE_WALK)
return;
self.velocity = '0 0 0';
dprint("Warning: not a turrret path\n");
else
{
+
+#ifdef EWHEEL_FANCYPATH
self.pathcurrent = WALKER_PATH(self.origin,e.origin);
self.pathgoal = e;
+#else
+ self.pathcurrent = e;
+#endif
}
}
}
{
self.velocity = '0 0 0';
- turret_trowgib2(self.origin, self.velocity + '0 0 400', '-0.6 -0.2 -02', self, 3 + time + random() * 2);
-
+#ifdef EWHEEL_FANCYPATH
if (self.pathcurrent)
pathlib_deletepath(self.pathcurrent.owner);
-
+#endif
self.pathcurrent = world;
}
{
entity e;
- if (self.netname == "") self.netname = "eWheel Turret";
+ if (self.netname == "")
+ self.netname = "eWheel Turret";
if (self.target != "")
{
self.turret_diehook = ewheel_diehook;
- if (turret_stdproc_init("ewheel_std",0,"models/turrets/ewheel-base2.md3","models/turrets/ewheel-gun1.md3") == 0)
+ if (turret_stdproc_init("ewheel_std", "models/turrets/ewheel-base2.md3", "models/turrets/ewheel-gun1.md3", TID_EWHEEL) == 0)
{
remove(self);
return;
}
self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
- self.target_select_flags = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
- self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
- self.target_validate_flags = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
+
self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
self.iscreature = TRUE;
self.tur_head.aim_speed = autocvar_g_turrets_unit_ewheel_turnrate;
self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
//setorigin(self,self.origin + '0 0 128');
if (self.target != "")
{
dprint("Warning: not a turrret path\n");
else
{
+#ifdef EWHEEL_FANCYPATH
self.pathcurrent = WALKER_PATH(self.origin, e.origin);
self.pathgoal = e;
+#else
+ self.pathcurrent = e;
+#endif
}
}
}
precache_model ("models/turrets/ewheel-base2.md3");
precache_model ("models/turrets/ewheel-gun1.md3");
- precache_model ("models/pathlib/goodsquare.md3");
- precache_model ("models/pathlib/badsquare.md3");
- precache_model ("models/pathlib/square.md3");
-
- turret_ewheel_loadcvars();
-
self.think = turret_ewheel_dinit;
self.nextthink = time + 0.5;
}
turret_tag_fire_update();
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
proj = spawn ();
setorigin(proj, self.tur_shotorg);
setsize(proj, '0 0 0', '0 0 0');
void turret_flac_projectile_explode()
{
- float ftmp;
-
- // FIXME: tur_impacttime is not accurate enougth, this is a dirty hakk to make flac work.
-
- //w_deathtypestring = "got caught in the flack.";
-
-
-
if( (self.enemy != world) &&
(vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 3) )
{
// OMG HAXX!
setorigin(self,self.enemy.origin + randomvec() * self.owner.shot_radius);
}
-
-
-
- te_explosion (self.origin);
-
- ftmp = crandom();
- if (ftmp<-0.7)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
- else if (ftmp<0.4)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
- else if (ftmp<1)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-
-
self.event_damage = SUB_Null;
-
#ifdef TURRET_DEBUG
- ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ float ftmp;
+ ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
#endif
remove (self);
self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
- if (turret_stdproc_init("flac_std",0,"models/turrets/base.md3","models/turrets/flac.md3") == 0)
+ if (turret_stdproc_init("flac_std", "models/turrets/base.md3", "models/turrets/flac.md3", TID_FLAC) == 0)
{
remove(self);
return;
self.damage_flags |= TFL_DMG_HEADSHAKE;
self.target_select_flags |= TFL_TARGETSELECT_NOTURRETS | TFL_TARGETSELECT_MISSILESONLY;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
// Our fire routine
self.turret_firefunc = turret_flac_attack;
self.track_flags = TFL_TRACK_NO;
// self.turret_respawnhook = turret_fusionreactor_respawnhook;
- if (turret_stdproc_init("fusreac_std",0,"models/turrets/base.md3","models/turrets/reactor.md3") == 0)
+ if (turret_stdproc_init("fusreac_std", "models/turrets/base.md3", "models/turrets/reactor.md3", TID_FUSION) == 0)
{
remove(self);
return;
else
self.tur_shotorg = gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_fire2"));
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
missile = spawn ();
setorigin(missile, self.tur_shotorg);
void turret_hellion_missile_explode()
{
- vector org2;
float d;
if(self.event_damage != SUB_Null)
return;
}
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
- org2 = findbetterlocation (self.origin, 16);
-
- // LordHavoc: TE_TEI_BIGEXPLOSION
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
- //w_deathtypestring = "could not dodge the twin missiles.";
self.event_damage = SUB_Null;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HELLION, world);
#ifdef TURRET_DEBUG
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF | TFL_FIRECHECK_OWM_AMMO;
self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
- if (turret_stdproc_init("hellion_std",0,"models/turrets/base.md3","models/turrets/hellion.md3") == 0)
+ if (turret_stdproc_init("hellion_std", "models/turrets/base.md3", "models/turrets/hellion.md3", TID_HELLION) == 0)
{
remove(self);
return;
}
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
self.turret_firefunc = turret_hellion_attack;
self.turret_postthink = turret_hellion_postthink;
}
local entity missile;
//local entity flash2;
- sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
missile = spawn ();
missile.solid = SOLID_BBOX;
self.cnt = time + 0.25;
self.nextthink = 0;
self.movetype = MOVETYPE_BOUNCE;
- sound (self, CHAN_VOICE, "", 0.4 * VOL_BASE, ATTN_NORM);
return;
}
void turret_hk_missile_explode()
{
- vector org2;
float d;
if(self.event_damage != SUB_Null)
if ((other == self.owner)||(other == self.owner.tur_head))
return;
- //w_deathtypestring = "got hunted to extinction";
- //vector org2;
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
- org2 = findbetterlocation (self.origin, 16);
-
- // LordHavoc: TE_TEI_BIGEXPLOSION
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
self.event_damage = SUB_Null;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HK, world);
#ifdef TURRET_DEBUG
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
self.shoot_flags = TFL_SHOOT_CLEARTARGET;
- if (turret_stdproc_init("hk_std",0,"models/turrets/base.md3","models/turrets/hk.md3") == 0)
+ if (turret_stdproc_init("hk_std", "models/turrets/base.md3", "models/turrets/hk.md3", TID_HK) == 0)
{
remove(self);
return;
self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TEAMCHECK;
-
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
// Our fire routine
self.turret_firefunc = turret_hk_attack;
//.float bulletcounter;
void turret_machinegun_attack()
{
- sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
- fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_MACHINEGUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
- //w_deathtypestring = "had an alergic reaction due to 10 kilos of led";
- te_smallflash(self.tur_shotorg);
-
UziFlash();
setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
}
if not (autocvar_g_antilag_bullets)
self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
- if (turret_stdproc_init("machinegun_std",0,"models/turrets/base.md3","models/turrets/machinegun.md3") == 0)
+ if (turret_stdproc_init("machinegun_std", "models/turrets/base.md3", "models/turrets/machinegun.md3", TID_MACHINEGUN) == 0)
{
remove(self);
return;
self.damage_flags |= TFL_DMG_HEADSHAKE;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
// Our fire routine
self.turret_firefunc = turret_machinegun_attack;
turret_tag_fire_update();
- sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
missile = spawn ();
setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
void turret_mlrs_rocket_explode()
{
- vector org2;
if(self.event_damage != SUB_Null)
{
return;
}
-
- 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);
- //w_deathtypestring = "dident escape the rocket barrage";
#ifdef TURRET_DEBUG
float d;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
#endif
// Target dead, Tell turret.
self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;// | TFL_AIM_GROUND2;
- if (turret_stdproc_init("mlrs_std",0,"models/turrets/base.md3","models/turrets/mlrs.md3") == 0)
+ if (turret_stdproc_init("mlrs_std", "models/turrets/base.md3", "models/turrets/mlrs.md3", TID_MLRS) == 0)
{
remove(self);
return;
self.shoot_flags |= TFL_SHOOT_VOLLYALWAYS;
self.volly_counter = self.shot_volly;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
// Our fire routine
self.turret_firefunc = turret_mlrs_attack;
self.turret_postthink = turret_mlrs_postthink;
self.owner.attack_finished_single = time + self.owner.shot_refire;
self.owner.fireflag = 2;
self.owner.tur_head.frame = 10;
- sound (self, CHAN_PROJECTILE, "", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
remove(self);
return;
}
if (time - self.shot_spread > 0)
{
self.shot_spread = time + 2;
- sound (self, CHAN_VOICE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
}
self.shot_force,
oldself.shot_dmg,
0.75,
- DEATH_TURRET);
+ DEATH_TURRET_PHASER);
self = oldself;
self.scale = vlen(self.owner.tur_shotorg - trace_endpos) / 256;
beam.enemy = self.enemy;
beam.bot_dodge = TRUE;
beam.bot_dodgerating = beam.shot_dmg;
- sound (beam, CHAN_PROJECTILE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
+ sound (beam, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
self.fireflag = 1;
beam.attack_finished_single = self.attack_finished_single;
setattachment(beam,self.tur_head,"tag_fire");
- soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+ soundat (self, trace_endpos, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
if (self.tur_head.frame == 0)
self.tur_head.frame = 1;
self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
self.aim_flags = TFL_AIM_LEAD;
- if (turret_stdproc_init("phaser_std",0,"models/turrets/base.md3","models/turrets/phaser.md3") == 0)
+ if (turret_stdproc_init("phaser_std", "models/turrets/base.md3","models/turrets/phaser.md3", TID_PHASER) == 0)
{
remove(self);
return;
}
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
self.turret_firecheckfunc = turret_phaser_firecheck;
self.turret_firefunc = turret_phaser_attack;
self.turret_postthink = turret_phaser_postthink;
{
entity proj;
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
proj = spawn ();
{
entity proj;
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
proj = spawn ();
setorigin(proj, self.tur_shotorg);
setsize(proj, '0 0 0', '0 0 0');
void turret_plasma_projectile_explode()
{
- vector org2;
-
- org2 = findbetterlocation (self.origin, 8);
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 79);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
- WriteCoord (MSG_BROADCAST, 0); // SeienAbunae: groan... Useless clutter
- WriteCoord (MSG_BROADCAST, 0);
- WriteCoord (MSG_BROADCAST, 0);
- WriteByte (MSG_BROADCAST, 155);
-
self.event_damage = SUB_Null;
//w_deathtypestring = "ate to much plasma";
#ifdef TURRET_DEBUG
float d;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
#endif
- sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
remove (self);
}
self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_GROUND2;
self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
- if (turret_stdproc_init("plasma_std",FALSE,"models/turrets/base.md3","models/turrets/plasma.md3") == 0)
+ if (turret_stdproc_init("plasma_std", "models/turrets/base.md3", "models/turrets/plasma.md3", TID_PLASMA) == 0)
{
remove(self);
return;
self.damage_flags |= TFL_DMG_HEADSHAKE;
self.firecheck_flags |= TFL_FIRECHECK_AFF;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
// Our fireing routine
self.turret_firefunc = turret_plasma_attack;
self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_GROUND2 ;
self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
- if (turret_stdproc_init("plasma_dual",0,"models/turrets/base.md3","models/turrets/plasmad.md3") == 0)
+ if (turret_stdproc_init("plasma_dual", "models/turrets/base.md3", "models/turrets/plasmad.md3", TID_PLASMA_DUAL) == 0)
{
remove(self);
return;
self.damage_flags |= TFL_DMG_HEADSHAKE;
self.firecheck_flags |= TFL_FIRECHECK_AFF;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
// Our fireing routine
self.turret_firefunc = turret_plasma_dual_attack;
}
if (etarget)
- {
- te_smallflash(etarget.origin);
+ {
te_csqc_lightningarc(from.origin,etarget.origin);
- dprint("DMG:",ftos(damage),"\n");
- Damage(etarget, self, self, damage, DEATH_TURRET, etarget.origin, '0 0 0');
+ Damage(etarget, self, self, damage, DEATH_TURRET_TESLA, etarget.origin, '0 0 0');
etarget.railgunhit = 1;
}
self.aim_flags = TFL_AIM_NO;
self.track_flags = TFL_TRACK_NO;
- if (turret_stdproc_init("tesla_std",0,"models/turrets/tesla_base.md3","models/turrets/tesla_head.md3") == 0)
+ if (turret_stdproc_init("tesla_std", "models/turrets/tesla_base.md3", "models/turrets/tesla_head.md3", TID_TESLA) == 0)
{
remove(self);
return;
self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
self.turret_firefunc = turret_tesla_fire;
self.turret_postthink = turret_tesla_postthink;
self.turret_firecheckfunc = turret_tesla_firecheck;
#define ANIM_MEELE 9
#define ANIM_SWIM 10
#define ANIM_ROAM 11
-
.float animflag;
-.entity wkr_spawn;
#define WALKER_MIN '-70 -70 0'
#define WALKER_MAX '70 70 95'
#define WALKER_PATH(s,e) pathlib_astar(s,e)
-float walker_meele_dmg;
-float walker_meele_force;
-
-float walker_speed_stop;
-float walker_speed_walk;
-float walker_speed_run;
-float walker_speed_jump;
-float walker_speed_roam;
-float walker_speed_swim;
-
-float walker_std_rocket_dmg;
-float walker_std_rocket_radius;
-float walker_std_rocket_force;
-float walker_std_rocket_speed;
-float walker_std_rocket_turnrate;
-
-void walker_loadcvars()
-{
- walker_meele_dmg = autocvar_g_turrets_unit_walker_std_meele_dmg;
- walker_meele_force = autocvar_g_turrets_unit_walker_std_meele_force;
-
- walker_speed_stop = autocvar_g_turrets_unit_walker_speed_stop;
- walker_speed_walk = autocvar_g_turrets_unit_walker_speed_walk;
- walker_speed_run = autocvar_g_turrets_unit_walker_speed_run;
- walker_speed_jump = autocvar_g_turrets_unit_walker_speed_jump;
- walker_speed_roam = autocvar_g_turrets_unit_walker_speed_roam;
- walker_speed_swim = autocvar_g_turrets_unit_walker_speed_swim;
-
- walker_std_rocket_dmg = autocvar_g_turrets_unit_walker_std_rocket_dmg;
- walker_std_rocket_radius = autocvar_g_turrets_unit_walker_std_rocket_radius;
- walker_std_rocket_force = autocvar_g_turrets_unit_walker_std_rocket_force;
- walker_std_rocket_speed = autocvar_g_turrets_unit_walker_std_rocket_speed;
- walker_std_rocket_turnrate = autocvar_g_turrets_unit_walker_std_rocket_turnrate;
-
-}
-
-
-
float walker_firecheck()
{
if (self.animflag == ANIM_MEELE)
{
vector where;
entity e;
+
makevectors(self.angles);
where = self.origin + v_forward * 128;
- //w_deathtypestring = "tried to hug the cute spider thingy.";
e = findradius(where,32);
- while (e)
+ while (e)
{
if (turret_validate_target(self,e,self.target_validate_flags))
if (e != self && e.owner != self)
- Damage(e, self, self, walker_meele_dmg ,DEATH_TURRET,'0 0 0', v_forward * walker_meele_force);
+ Damage(e, self, self, autocvar_g_turrets_unit_walker_std_meele_dmg ,DEATH_TURRET_WALKER_MEELE,'0 0 0', v_forward * autocvar_g_turrets_unit_walker_std_meele_force);
e = e.chain;
}
}
-void walker_setnoanim()
-{
- self.frame = ANIM_NO;
- self.animflag = self.owner.frame;
- dprint("walker_setnoanim\n");
-
-}
-void walker_dly_meele_do_dmg()
+void walker_setnoanim()
{
- walker_meele_do_dmg();
- dprint("walker_dly_meele_do_dmg\n");
-
+ turrets_setframe(ANIM_NO, FALSE);
+ self.animflag = self.frame;
}
-
-void walker_animate()
-{
- vector real_angle;
- float vz;
-
- real_angle = vectoangles(self.steerto) - self.angles;
- vz = self.velocity_z;
-
- if (self.tur_head.frame != 0)
- self.tur_head.frame = self.tur_head.frame +1;
-
- if (self.tur_head.frame > 12)
- self.tur_head.frame = 0;
-
- switch (self.animflag)
- {
-
- case ANIM_NO:
- self.frame = 0;
- movelib_beak_simple(walker_speed_stop);
- break;
-
- /*
- case ANIM_REVERSE:
- if ((self.frame < 5) || (self.frame > 25))
- self.frame = 25;
-
- self.frame = self.frame -1;
- movelib_move_simple(v_forward * -1, walker_speed_walk, 0.6);
-
- if (self.frame < 5)
- self.frame = 25;
-
- break;
- */
-
- case ANIM_TURN:
- self.frame = ANIM_TURN;
- self.angles_y += bound(-15, shortangle_f(real_angle_y, self.angles_y), 15);
- movelib_beak_simple(walker_speed_stop);
- break;
-
- case ANIM_WALK:
- self.frame = ANIM_WALK;
- self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
- movelib_move_simple(v_forward, walker_speed_walk, 0.6);
- break;
-
- case ANIM_RUN:
- self.frame = ANIM_RUN;
- self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
- movelib_move_simple(v_forward, walker_speed_run, 0.6);
- break;
-
- case ANIM_STRAFE_L:
- self.frame = ANIM_STRAFE_L;
- self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
- movelib_move_simple(v_right * -1, walker_speed_walk, 0.8);
- break;
-
- case ANIM_STRAFE_R:
- self.frame = ANIM_STRAFE_R;
- self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
- movelib_move_simple(v_right, walker_speed_walk, 0.8);
- break;
-
- case ANIM_JUMP:
- self.frame = ANIM_JUMP;
- self.velocity += '0 0 1' * walker_speed_jump;
- break;
-
- case ANIM_LAND:
- self.frame = ANIM_LAND;
- break;
-
- case ANIM_PAIN:
- if(self.frame != ANIM_PAIN)
- defer(0.25,walker_setnoanim);
-
- self.frame = ANIM_PAIN;
-
- break;
-
- case ANIM_MEELE:
- if(self.frame != ANIM_MEELE)
- {
- defer(0.41, walker_setnoanim);
- defer(0.21, walker_dly_meele_do_dmg);
- }
-
- self.frame = ANIM_MEELE;
- movelib_beak_simple(walker_speed_stop);
- break;
-
- case ANIM_SWIM:
- self.frame = ANIM_SWIM;
- self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
- self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
- movelib_move_simple(v_forward, walker_speed_swim, 0.3);
- vz = self.velocity_z + sin(time * 4) * 8;
- break;
-
- case ANIM_ROAM:
- self.frame = ANIM_ROAM;
- self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
- movelib_move_simple(v_forward ,walker_speed_roam, 0.5);
- break;
-
- }
-
- self.velocity_z = vz;
-
- if (self.flags & FL_ONGROUND)
- movelib_groundalign4point(300, 100, 0.25);
-
-}
-
-
void walker_rocket_explode()
{
- vector org2;
-
if (self.event_damage != SUB_Null)
{
self.event_damage = SUB_Null;
return;
}
- 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);
- RadiusDamage (self, self.owner, walker_std_rocket_dmg, 0, walker_std_rocket_radius, world,walker_std_rocket_force, DEATH_TURRET, world);
+ RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, world,autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET_WALKER_ROCKET, world);
remove (self);
}
walker_rocket_explode();
}
-#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, walker_std_rocket_speed, walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
+#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, autocvar_g_turrets_unit_walker_std_rocket_speed, autocvar_g_turrets_unit_walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
void walker_rocket_loop();
void walker_rocket_think()
{
if (self.cnt < time)
{
if (edist < 1000)
- self.tur_shotorg = randomvec() * min(edist,64);
+ self.tur_shotorg = randomvec() * min(edist, 64);
else
- self.tur_shotorg = randomvec() * min(edist,256);
+ self.tur_shotorg = randomvec() * min(edist, 256);
self.cnt = time + 0.5;
}
if (edist < 256)
self.tur_shotorg = '0 0 0';
-
if (self.tur_health < time)
{
- self.think = walker_rocket_explode;
- self.nextthink = time;
+ self.think = walker_rocket_explode;
+ self.nextthink = time;
return;
}
- if (self.shot_dmg != 1337)
- if (random() < 0.01)
- {
- walker_rocket_loop();
- return;
- }
+ if (self.shot_dmg != 1337 && random() < 0.01)
+ {
+ walker_rocket_loop();
+ return;
+ }
m_speed = vlen(self.velocity);
// Enemy dead? just keep on the current heading then.
- if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
- {
- // Make sure we dont return to tracking a respawned entity
+ if (self.enemy == world || self.enemy.deadflag != DEAD_NO)
self.enemy = world;
- }
if (self.enemy)
{
- itime = max(edist / m_speed,1);
+ itime = max(edist / m_speed, 1);
newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);
}
else
- {
newdir = normalize(self.velocity);
- }
WALKER_ROCKET_MOVE;
}
return;
}
- if (vlen(self.origin - self.tur_shotorg) < 128 )
+ if (vlen(self.origin - self.tur_shotorg) < 100 )
{
self.think = walker_rocket_think;
return;
return;
}
- if (vlen(self.origin - self.tur_shotorg) < 128 )
+ if (vlen(self.origin - self.tur_shotorg) < 100 )
{
self.tur_shotorg = self.origin - '0 0 200';
self.think = walker_rocket_loop3;
void walker_rocket_loop()
{
self.nextthink = time;
- self.tur_shotorg = self.origin + '0 0 400';
+ self.tur_shotorg = self.origin + '0 0 300';
self.think = walker_rocket_loop2;
self.shot_dmg = 1337;
}
void walker_fire_rocket(vector org)
{
-
entity rocket;
-
-
- //self.angles_x *= -1;
+
fixedmakevectors(self.angles);
- //self.angles_x *= -1;
te_explosion (org);
rocket = spawn ();
setorigin(rocket, org);
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
rocket.classname = "walker_rocket";
rocket.owner = self;
-
rocket.bot_dodge = TRUE;
rocket.bot_dodgerating = 50;
-
rocket.takedamage = DAMAGE_YES;
-
rocket.damageforcescale = 2;
rocket.health = 25;
rocket.tur_shotorg = randomvec() * 512;
rocket.event_damage = walker_rocket_damage;
- rocket.nextthink = time;// + 0.25;
+ rocket.nextthink = time;
rocket.movetype = MOVETYPE_FLY;
- rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * walker_std_rocket_speed;
+ rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * autocvar_g_turrets_unit_walker_std_rocket_speed;
rocket.angles = vectoangles(rocket.velocity);
rocket.touch = walker_rocket_explode;
rocket.flags = FL_PROJECTILE;
CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
}
-void rv_think()
+.vector enemy_last_loc;
+.float enemy_last_time;
+void walker_move_to(vector _target, float _dist)
{
- float f;
- vector org;
- entity oldself;
-
- if (self.owner.deadflag != DEAD_NO)
+ switch (self.waterlevel)
{
- remove(self);
- return;
+ case WATERLEVEL_NONE:
+ if (_dist > 500)
+ self.animflag = ANIM_RUN;
+ else
+ self.animflag = ANIM_WALK;
+ case WATERLEVEL_WETFEET:
+ case WATERLEVEL_SWIMMING:
+ if (self.animflag != ANIM_SWIM)
+ self.animflag = ANIM_WALK;
+ else
+ self.animflag = ANIM_SWIM;
+ break;
+ case WATERLEVEL_SUBMERGED:
+ self.animflag = ANIM_SWIM;
}
- self.cnt = self.cnt -1;
+ self.moveto = _target;
+ self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
- if (self.cnt < 0)
+ if(self.enemy)
{
- remove(self);
- return;
+ self.enemy_last_loc = _target;
+ self.enemy_last_time = time;
}
-
- if (self.cnt > 1)
- f = gettagindex(self.owner,"tag_rocket01");
- else
- f = gettagindex(self.owner,"tag_rocket02");
-
- org = gettaginfo(self.owner,f);
-
- self.nextthink = time + 0.2;
- oldself = self;
- self = self.owner;
- walker_fire_rocket(org);
- self = oldself;
}
+//#define WALKER_FANCYPATHING
+
void walker_move_path()
{
+#ifdef WALKER_FANCYPATHING
// Are we close enougth to a path node to switch to the next?
if (vlen(self.origin - self.pathcurrent.origin) < 64)
if (self.pathcurrent.path_next == world)
else
self.pathcurrent = self.pathcurrent.path_next;
- switch (self.waterlevel)
- {
- case 0:
- self.animflag = ANIM_WALK;
- case 1:
- case 2:
- if (self.animflag == ANIM_WALK)
- self.animflag = ANIM_WALK;
- else
- self.animflag = ANIM_SWIM;
- break;
- case 3:
- self.animflag = ANIM_SWIM;
- }
-
self.moveto = self.pathcurrent.origin;
self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
+ walker_move_to(self.moveto, 0);
+#else
+ if (vlen(self.origin - self.pathcurrent.origin) < 64)
+ self.pathcurrent = self.pathcurrent.enemy;
+
+ if(!self.pathcurrent)
+ return;
+
+ self.moveto = self.pathcurrent.origin;
+ self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+ walker_move_to(self.moveto, 0);
+#endif
}
-void walker_move_enemy()
-{
- switch (self.waterlevel)
- {
- case 0:
- if (self.tur_dist_enemy > 500)
- self.animflag = ANIM_RUN;
- else
- self.animflag = ANIM_WALK;
- case 1:
- case 2:
- if (self.animflag != ANIM_SWIM)
- self.animflag = ANIM_WALK;
- else
- self.animflag = ANIM_SWIM;
- break;
- case 3:
- self.animflag = ANIM_SWIM;
- }
-
- self.moveto = self.enemy.origin;
- self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
-
-}
-
-void walker_move_idle_pause()
-{
- self.moveto = self.origin;
- self.steerto = v_forward;
- self.animflag = ANIM_NO;
-}
-
-void walker_move_idle_roam()
-{
-}
-
-void walker_move_idle()
-{
-}
-
-float walker_attack_meele()
-{
-
- vector wish_angle;
-
-
- if (self.animflag == ANIM_SWIM || self.animflag == ANIM_MEELE)
- return 0;
-
- wish_angle = angleofs(self,self.enemy);
-
- if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_meele_range)
- return 0;
- else
- if (fabs(wish_angle_y) > 15)
- return 0;
-
- self.moveto = self.enemy.origin;
- self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
- self.animflag = ANIM_MEELE;
-
- return 1;
-}
-
-float walker_attack_rockets()
-{
- if (self.tur_head.attack_finished_single > time)
- return 0;
-
- if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range_min)
- return 0;
-
- if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range)
- return 0;
-
- entity rv;
+.float idletime;
- rv = spawn();
- rv.think = rv_think;
- rv.nextthink = time;
- rv.cnt = 4;
- rv.owner = self;
- self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
-
- return 1;
-}
void walker_postthink()
{
-
- //self.angles_x *= -1;
fixedmakevectors(self.angles);
- //self.angles_x *= -1;
- if ((self.spawnflags & TSF_NO_PATHBREAK) && self.pathcurrent)
+ if (self.spawnflags & TSF_NO_PATHBREAK && self.pathcurrent)
walker_move_path();
else if (self.enemy == world)
{
if(self.pathcurrent)
walker_move_path();
else
- walker_move_idle_pause();
+ {
+ if(self.enemy_last_time != 0)
+ {
+ if(vlen(self.origin - self.enemy_last_loc) < 128 || time - self.enemy_last_time > 10)
+ self.enemy_last_time = 0;
+ else
+ walker_move_to(self.enemy_last_loc, 0);
+ }
+ else
+ {
+ if(self.animflag != ANIM_NO)
+ {
+ traceline(self.origin + '0 0 64', self.origin + '0 0 64' + v_forward * 128, MOVE_NORMAL, self);
+
+ if(trace_fraction != 1.0)
+ self.tur_head.idletime = -1337;
+ else
+ {
+ traceline(trace_endpos, trace_endpos - '0 0 256', MOVE_NORMAL, self);
+ if(trace_fraction == 1.0)
+ self.tur_head.idletime = -1337;
+ }
+
+ if(self.tur_head.idletime == -1337)
+ {
+ self.moveto = self.origin + randomvec() * 256;
+ self.tur_head.idletime = 0;
+ }
+
+ self.moveto = self.moveto * 0.9 + ((self.origin + v_forward * 500) + randomvec() * 400) * 0.1;
+ self.moveto_z = self.origin_z + 64;
+ walker_move_to(self.moveto, 0);
+ }
+
+ if(self.idletime < time)
+ {
+ if(random() < 0.5 || !(self.spawnflags & TSL_ROAM))
+ {
+ self.idletime = time + 1 + random() * 5;
+ self.moveto = self.origin;
+ self.animflag = ANIM_NO;
+ }
+ else
+ {
+ self.animflag = ANIM_WALK;
+ self.idletime = time + 4 + random() * 2;
+ self.moveto = self.origin + randomvec() * 256;
+ self.tur_head.moveto = self.moveto;
+ self.tur_head.idletime = 0;
+ }
+ }
+ }
+ }
}
else
{
- if not (self.animflag == ANIM_MEELE)
- if not (walker_attack_rockets())
- walker_attack_meele();
+ if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_meele_range && self.animflag != ANIM_MEELE)
+ {
+ vector wish_angle;
+
+ wish_angle = angleofs(self, self.enemy);
+ if (self.animflag != ANIM_SWIM)
+ if (fabs(wish_angle_y) < 15)
+ {
+ self.moveto = self.enemy.origin;
+ self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+ self.animflag = ANIM_MEELE;
+ }
+ }
+ else if (self.tur_head.attack_finished_single < time)
+ {
+ if(self.tur_head.shot_volly)
+ {
+ self.animflag = ANIM_NO;
+
+ self.tur_head.shot_volly = self.tur_head.shot_volly -1;
+ if(self.tur_head.shot_volly == 0)
+ self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
+ else
+ self.tur_head.attack_finished_single = time + 0.2;
+
+ if(self.tur_head.shot_volly > 1)
+ walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket01")));
+ else
+ walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket02")));
+ }
+ else
+ {
+ if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range_min)
+ if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range)
+ self.tur_head.shot_volly = 4;
+ }
+ }
+ else
+ {
+ if (self.animflag != ANIM_MEELE)
+ walker_move_to(self.enemy.origin, self.tur_dist_enemy);
+ }
+ }
- if not (self.animflag == ANIM_MEELE)
- walker_move_enemy();
+ //if(self.animflag != ANIM_NO)
+ {
+ vector real_angle;
+ float turny, turnx;
+ float vz;
+
+ real_angle = vectoangles(self.steerto) - self.angles;
+ vz = self.velocity_z;
+
+ switch (self.animflag)
+ {
+ case ANIM_NO:
+ movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+ break;
+
+ case ANIM_TURN:
+ turny = autocvar_g_turrets_unit_walker_turn;
+ movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+ break;
+
+ case ANIM_WALK:
+ turny = autocvar_g_turrets_unit_walker_turn_walk;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_walk, 0.6);
+ break;
+
+ case ANIM_RUN:
+ turny = autocvar_g_turrets_unit_walker_turn_run;
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_run, 0.6);
+ break;
+
+ case ANIM_STRAFE_L:
+ turny = autocvar_g_turrets_unit_walker_turn_strafe;
+ movelib_move_simple(v_right * -1, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+ break;
+
+ case ANIM_STRAFE_R:
+ turny = autocvar_g_turrets_unit_walker_turn_strafe;
+ movelib_move_simple(v_right, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+ break;
+
+ case ANIM_JUMP:
+ self.velocity += '0 0 1' * autocvar_g_turrets_unit_walker_speed_jump;
+ break;
+
+ case ANIM_LAND:
+ break;
+
+ case ANIM_PAIN:
+ if(self.frame != ANIM_PAIN)
+ defer(0.25, walker_setnoanim);
+
+ break;
+
+ case ANIM_MEELE:
+ if(self.frame != ANIM_MEELE)
+ {
+ defer(0.41, walker_setnoanim);
+ defer(0.21, walker_meele_do_dmg);
+ }
+
+ movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+ break;
+
+ case ANIM_SWIM:
+ turny = autocvar_g_turrets_unit_walker_turn_swim;
+ turnx = autocvar_g_turrets_unit_walker_turn_swim;
+
+ self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
+ movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_swim, 0.3);
+ vz = self.velocity_z + sin(time * 4) * 8;
+ break;
+
+ case ANIM_ROAM:
+ turny = autocvar_g_turrets_unit_walker_turn_walk;
+ movelib_move_simple(v_forward ,autocvar_g_turrets_unit_walker_speed_roam, 0.5);
+ break;
+ }
+
+ if(turny)
+ {
+ turny = bound( turny * -1, shortangle_f(real_angle_y, self.angles_y), turny );
+ self.angles_y += turny;
+ }
+
+ if(turnx)
+ {
+ turnx = bound( turnx * -1, shortangle_f(real_angle_x, self.angles_x), turnx );
+ self.angles_x += turnx;
+ }
+
+ self.velocity_z = vz;
}
+
+ if(self.origin != self.oldorigin)
+ self.SendFlags |= TNSF_MOVE;
+
+ self.oldorigin = self.origin;
+ turrets_setframe(self.animflag, FALSE);
- walker_animate();
}
void walker_attack()
{
- sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
- fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+ sound (self, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+ fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_WALKER_GUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
- if (self.misc_bulletcounter == 2)
- {
-
- UziFlash();
- setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
- self.misc_bulletcounter = 0;
- }
-
- self.misc_bulletcounter = self.misc_bulletcounter + 1;
- self.tur_head.frame = self.tur_head.frame + 1;
+ pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
}
void walker_respawnhook()
{
- vector vtmp;
entity e;
// Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
if(self.movetype != MOVETYPE_WALK)
return;
- setorigin(self, self.wkr_spawn.origin);
-
- self.angles = self.wkr_spawn.angles;
- vtmp = self.wkr_spawn.origin;
- vtmp_z += self.wkr_spawn.maxs_z;
- setorigin(self,vtmp);
-
+ setorigin(self, self.pos1);
+ self.angles = self.pos2;
+
if (self.target != "")
{
e = find(world,targetname,self.target);
void walker_diehook()
{
- turret_trowgib2(self.origin, self.velocity + v_up * 200, '-0.6 -0.2 -02', self,time + random() * 1);
- turret_trowgib2(self.origin + '0 0 64', self.velocity + v_forward * 150 + v_up * 150, '-0.2 -0.2 -02', self.tur_head, 3 + time + random() * 2);
-
+#ifdef self.pathcurrent
if (self.pathcurrent)
pathlib_deletepath(self.pathcurrent.owner);
+#endif
self.pathcurrent = world;
-
- if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
- remove(self.wkr_spawn);
-
}
void turret_walker_dinit()
entity e;
if (self.netname == "") self.netname = "Walker Turret";
- self.wkr_spawn = spawn();
self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE ;
self.turret_diehook = walker_diehook;
self.ticrate = 0.05;
- if (turret_stdproc_init("walker_std",FALSE,"models/turrets/walker_body.md3","models/turrets/walker_head_minigun.md3") == 0)
+ if (turret_stdproc_init("walker_std", "models/turrets/walker_body.md3", "models/turrets/walker_head_minigun.md3", TID_WALKER) == 0)
{
remove(self);
return;
}
- if (!turret_tag_fire_update())
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
self.solid = SOLID_SLIDEBOX;
self.takedamage = DAMAGE_AIM;
- setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
-
- self.wkr_spawn.angles = self.angles;
- self.wkr_spawn.solid = SOLID_NOT;
setsize(self, WALKER_MIN, WALKER_MAX);
- setorigin(self,self.origin);
- //traceline(self.origin + '0 0 128', self.origin - '0 0 10000', MOVE_NORMAL, self);
+ setorigin(self, self.origin);
tracebox(self.origin + '0 0 128', self.mins,self.maxs,self.origin - '0 0 10000', MOVE_NORMAL, self);
-
- setorigin(self.wkr_spawn, trace_endpos + '0 0 4');
- setorigin(self, self.wkr_spawn.origin);
-
+ setorigin(self, trace_endpos + '0 0 4');
+ self.pos1 = self.origin;
+ self.pos2 = self.angles;
+
self.idle_aim = '0 0 0';
self.turret_firecheckfunc = walker_firecheck;
self.turret_firefunc = walker_attack;
if (self.target != "")
{
- e = find(world,targetname,self.target);
+ e = find(world, targetname, self.target);
if (!e)
{
dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
dprint("Warning: not a turrret path\n");
else
{
- self.pathcurrent = WALKER_PATH(self.origin,e.origin);
+#ifdef WALKER_FANCYPATHING
+ self.pathcurrent = WALKER_PATH(self.origin, e.origin);
self.pathgoal = e;
+#else
+ self.pathcurrent = e;
+#endif
}
}
}
void spawnfunc_turret_walker()
{
- walker_loadcvars();
-
g_turrets_common_precash();
precache_model ("models/turrets/walker_head_minigun.md3");
precache_model ("models/turrets/walker_body.md3");
- precache_model ("models/turrets/walker_props.md3");
- precache_model ("models/turrets/walker_spawn.md3");
precache_model ( "models/turrets/rocket.md3");
precache_sound ( "weapons/rocket_impact.wav" );
--- /dev/null
+#ifdef SVQC
+// Auto cvars
+float autocvar_g_vehicle_bumblebee_speed_forward;
+float autocvar_g_vehicle_bumblebee_speed_strafe;
+float autocvar_g_vehicle_bumblebee_speed_up;
+float autocvar_g_vehicle_bumblebee_speed_down;
+float autocvar_g_vehicle_bumblebee_turnspeed;
+float autocvar_g_vehicle_bumblebee_pitchspeed;
+float autocvar_g_vehicle_bumblebee_pitchlimit;
+float autocvar_g_vehicle_bumblebee_friction;
+
+float autocvar_g_vehicle_bumblebee_energy;
+float autocvar_g_vehicle_bumblebee_energy_regen;
+float autocvar_g_vehicle_bumblebee_energy_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_health;
+float autocvar_g_vehicle_bumblebee_health_regen;
+float autocvar_g_vehicle_bumblebee_health_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_shield;
+float autocvar_g_vehicle_bumblebee_shield_regen;
+float autocvar_g_vehicle_bumblebee_shield_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_cannon_cost;
+float autocvar_g_vehicle_bumblebee_cannon_damage;
+float autocvar_g_vehicle_bumblebee_cannon_radius;
+float autocvar_g_vehicle_bumblebee_cannon_refire;
+float autocvar_g_vehicle_bumblebee_cannon_speed;
+float autocvar_g_vehicle_bumblebee_cannon_spread;
+float autocvar_g_vehicle_bumblebee_cannon_force;
+
+float autocvar_g_vehicle_bumblebee_cannon_turnspeed;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out;
+
+float autocvar_g_vehicle_bumblebee_respawntime;
+
+float autocvar_g_vehicle_bumblebee_blowup_radius;
+float autocvar_g_vehicle_bumblebee_blowup_coredamage;
+float autocvar_g_vehicle_bumblebee_blowup_edgedamage;
+float autocvar_g_vehicle_bumblebee_blowup_forceintensity;
+
+#define BUMB_MIN '-120 -120 -40'
+#define BUMB_MAX '120 120 40'
+
+.entity gunner1;
+//.entity gunner2;
+.vector lastaim;
+float bumb_gunner_frame()
+{
+ entity vehic, gun, gunner;
+ float ftmp, ftmp2;
+ vector vtmp;
+
+ vehic = self.vehicle;
+ gun = self.vehicle.gun1;
+ gunner = self;
+
+ self = vehic;
+ vehic.solid = SOLID_NOT;
+ crosshair_trace(gunner);
+
+ //vtmp = gettaginfo(vehic, gettagindexvehic, "tag_hardpoint01"));
+ vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+ vtmp = vectoangles(normalize(trace_endpos - vtmp)); // Find the direction & angle
+ vtmp = shortangle_vxy(vtmp - (vehic.angles + gun.angles), vehic.angles + gun.angles); // Find aim offset
+
+ // Bind to aimspeed
+ ftmp2 = autocvar_g_vehicle_bumblebee_cannon_turnspeed * frametime; ftmp = -ftmp2;
+ vtmp_x = bound(ftmp, vtmp_x, ftmp2);
+ vtmp_y = bound(ftmp, vtmp_y, ftmp2);
+ // Bind to limts
+ gun.angles_x = bound(-autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down, vtmp_x + gun.angles_x, autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up);
+ gun.angles_y = bound(-autocvar_g_vehicle_bumblebee_cannon_turnlimit_in, vtmp_y + gun.angles_y, autocvar_g_vehicle_bumblebee_cannon_turnlimit_out);
+
+ if(gunner.BUTTON_ATCK && gun.cnt <= time)
+ {
+ vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+ v_forward = normalize(v_forward);
+ vtmp += v_forward * 50;
+
+ fireBullet (vtmp, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+ autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+ gun.cnt = time + 0.1;
+ }
+
+ setorigin(gunner, vehic.origin);
+ gunner.velocity = vehic.velocity;
+
+ vehic.solid = SOLID_BBOX;
+ gunner.BUTTON_ATCK = gunner.BUTTON_ATCK2 = gunner.BUTTON_CROUCH = 0;
+ self = gunner;
+ return 1;
+}
+
+void bumb_gunner_enter()
+{
+ if(self.gunner1 != world)
+ return;
+
+ self.gunner1 = other;
+ self.gunner1.vehicle = self;
+
+ msg_entity = other;
+ WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+ WriteEntity(MSG_ONE, self.gun1);
+ WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+ if(self.tur_head)
+ {
+ WriteAngle(MSG_ONE, self.gun1.angles_x + self.angles_x); // tilt
+ WriteAngle(MSG_ONE, self.gun1.angles_y + self.angles_y); // yaw
+ WriteAngle(MSG_ONE, 0); // roll
+ }
+ other.PlayerPhysplug = bumb_gunner_frame;
+}
+
+float bumb_pilot_frame()
+{
+ entity pilot, gunner, vehic;
+ vector newvel;
+
+ pilot = self;
+ vehic = self.vehicle;
+ self = vehic;
+
+ if(pilot.BUTTON_USE && vehic.deadflag == DEAD_NO)
+ {
+ self = vehic;
+ vehicles_exit(VHEF_NORMAL);
+ self = pilot;
+ return 0;
+ }
+
+ if(vehic.deadflag != DEAD_NO)
+ {
+ self = pilot;
+ pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
+ return 1;
+ }
+
+ crosshair_trace(pilot);
+
+ vector vang;
+ float ftmp;
+
+ vang = vehic.angles;
+ newvel = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+ vang_x *= -1;
+ newvel_x *= -1;
+ if(newvel_x > 180) newvel_x -= 360;
+ if(newvel_x < -180) newvel_x += 360;
+ if(newvel_y > 180) newvel_y -= 360;
+ if(newvel_y < -180) newvel_y += 360;
+
+ ftmp = shortangle_f(pilot.v_angle_y - vang_y, vang_y);
+ if(ftmp > 180) ftmp -= 360; if(ftmp < -180) ftmp += 360;
+ vehic.avelocity_y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
+
+ // Pitch
+ ftmp = 0;
+ if(pilot.movement_x > 0 && vang_x < autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = 5;
+ else if(pilot.movement_x < 0 && vang_x > -autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = -20;
+
+ newvel_x = bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x , autocvar_g_vehicle_bumblebee_pitchlimit);
+ ftmp = vang_x - bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x + ftmp, autocvar_g_vehicle_bumblebee_pitchlimit);
+ vehic.avelocity_x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity_x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
+
+ vehic.angles_x = anglemods(vehic.angles_x);
+ vehic.angles_y = anglemods(vehic.angles_y);
+ vehic.angles_z = anglemods(vehic.angles_z);
+
+ makevectors('0 1 0' * vehic.angles_y);
+ newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
+
+ if(pilot.movement_x != 0)
+ {
+ if(pilot.movement_x > 0)
+ newvel += v_forward * autocvar_g_vehicle_bumblebee_speed_forward;
+ else if(pilot.movement_x < 0)
+ newvel -= v_forward * autocvar_g_vehicle_bumblebee_speed_forward;
+ }
+
+ if(pilot.movement_y != 0)
+ {
+ if(pilot.movement_y < 0)
+ newvel -= v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+ else if(pilot.movement_y > 0)
+ newvel += v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+ ftmp = newvel * v_right;
+ ftmp *= frametime * 0.1;
+ vehic.angles_z = bound(-15, vehic.angles_z + ftmp, 15);
+ }
+ else
+ {
+ vehic.angles_z *= 0.95;
+ if(vehic.angles_z >= -1 && vehic.angles_z <= -1)
+ vehic.angles_z = 0;
+ }
+
+ if(pilot.BUTTON_CROUCH)
+ newvel -= v_up * autocvar_g_vehicle_bumblebee_speed_down;
+ else if (pilot.BUTTON_JUMP)
+ newvel += v_up * autocvar_g_vehicle_bumblebee_speed_up;
+
+ vehic.velocity += newvel * frametime;
+ pilot.velocity = pilot.movement = vehic.velocity;
+ setorigin(pilot,vehic.origin + '0 0 32');
+
+
+ if(vehic.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_bumblebee_shield, autocvar_g_vehicle_bumblebee_shield_regen_pause, autocvar_g_vehicle_bumblebee_shield_regen, frametime);
+
+ if(vehic.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_bumblebee_health, autocvar_g_vehicle_bumblebee_health_regen_pause, autocvar_g_vehicle_bumblebee_health_regen, frametime);
+
+ if(vehic.vehicle_flags & VHF_ENERGYREGEN)
+ vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_bumblebee_energy, autocvar_g_vehicle_bumblebee_energy_regen_pause, autocvar_g_vehicle_bumblebee_energy_regen, frametime);
+
+ VEHICLE_UPDATE_PLAYER(health, bumblebee);
+ VEHICLE_UPDATE_PLAYER(energy, bumblebee);
+ if(vehic.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(shield, bumblebee);
+
+ pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = pilot.BUTTON_CROUCH = 0;
+ self = pilot;
+
+ return 1;
+}
+
+void bumb_think()
+{
+ self.velocity = self.velocity * 0.99;
+ self.nextthink = time + 0.1;
+}
+
+void bumb_enter()
+{
+ self.touch = bumb_gunner_enter;
+}
+
+void bumb_exit(float eject)
+{
+ self.owner = world;
+ self.touch = vehicles_touch;
+}
+
+void bumb_spawn()
+{
+ self.vehicle_health = autocvar_g_vehicle_bumblebee_health;
+ self.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
+ self.movetype = MOVETYPE_TOSS;
+ self.solid = SOLID_BBOX;
+ //self.vehicle_energy = 1;
+ self.movetype = MOVETYPE_FLY;
+ setorigin(self, self.origin + '0 0 25');
+}
+
+void bumb_die()
+{
+ self.health = 0;
+ self.event_damage = SUB_Null;
+ self.solid = SOLID_CORPSE;
+ self.takedamage = DAMAGE_NO;
+ self.deadflag = DEAD_DYING;
+ self.movetype = MOVETYPE_BOUNCE;
+
+ pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+}
+
+void bumb_dinit()
+{
+ if not (vehicle_initialize(
+ "Bumblebee",
+ "models/vehicles/bumblebee_body.dpm",
+ "",
+ "models/vehicles/spiderbot_cockpit.dpm",
+ "", "", "tag_viewport",
+ HUD_BUMBLEBEE,
+ BUMB_MIN, BUMB_MAX,
+ FALSE,
+ bumb_spawn, autocvar_g_vehicle_bumblebee_respawntime,
+ bumb_pilot_frame,
+ bumb_enter, bumb_exit,
+ bumb_die, bumb_think,
+ FALSE))
+ {
+ remove(self);
+ return;
+ }
+ self.gun1 = spawn();
+ setmodel(self.gun1, "models/vehicles/bumblebee_ray.dpm");
+ setattachment(self.gun1, self, "tag_hardpoint03");
+
+ self.gun1 = spawn();
+ self.gun2 = spawn();
+
+ self.gun1.owner = self;
+ self.gun2.owner = self;
+
+ setmodel(self.gun1, "models/vehicles/bumblebee_plasma_right.dpm");
+ setmodel(self.gun2, "models/vehicles/bumblebee_plasma_left.dpm");
+
+ setattachment(self.gun1, self, "tag_hardpoint01");
+ setattachment(self.gun2, self, "tag_hardpoint02");
+
+ vector ofs;
+ ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint01"));
+ ofs -= self.origin;
+ setattachment(self.gun1, self, "");
+ setorigin(self.gun1, ofs);
+
+ ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint02"));
+ ofs -= self.origin;
+ setattachment(self.gun2, self, "");
+ setorigin(self.gun2, ofs);
+
+
+}
+
+void spawnfunc_vehicle_bumblebee()
+{
+
+ precache_model ("models/vehicles/bumblebee_body.dpm");
+ precache_model ("models/vehicles/bumblebee_plasma_left.dpm");
+ precache_model ("models/vehicles/bumblebee_plasma_right.dpm");
+ precache_model ("models/vehicles/bumblebee_ray.dpm");
+
+ //vehicles_configcheck("vehicle_bumblebee.cfg", autocvar_g_vehicle_bumblebee_health);
+
+ if(autocvar_g_vehicle_bumblebee_energy)
+ if(autocvar_g_vehicle_bumblebee_energy_regen)
+ self.vehicle_flags |= VHF_ENERGYREGEN;
+
+ if(autocvar_g_vehicle_bumblebee_shield)
+ self.vehicle_flags |= VHF_HASSHIELD;
+
+ if(autocvar_g_vehicle_bumblebee_shield_regen)
+ self.vehicle_flags |= VHF_SHIELDREGEN;
+
+ if(autocvar_g_vehicle_bumblebee_health_regen)
+ self.vehicle_flags |= VHF_HEALTHREGEN;
+
+ self.think = bumb_dinit;
+ self.nextthink = time + 1;
+}
+#endif // SVQC
+
+#ifdef CSQC
+void bumblebee_draw()
+{
+
+}
+
+void bumblebee_draw2d()
+{
+
+}
+
+void bumblebee_read_extra()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+#endif //CSQC
--- /dev/null
+vector collision_force;
+vector collision_angle;
+
+vector bb1[9];
+vector bb2[9];
+
+float collision_run()
+{
+ vector vtmp, vmin, vmax, vrot, vforce, vtmp2, vtmp3;
+ float i, fvel, bcol;
+
+
+ // Extract the 8 bbox corners from mins/maxs for self
+ vmax = self.maxs;
+ vmin = self.mins;
+ bb1[0] = vmax;
+ vtmp = vmax; vtmp_x = vmin_x; bb1[1] = vtmp;
+ vtmp = vmax; vtmp_y = vmin_y; bb1[2] = vtmp;
+ vtmp = vmin; vtmp_z = vmax_z; bb1[3] = vtmp;
+ bb1[4] = vmin;
+ vtmp = vmin; vtmp_x = vmax_x; bb1[5] = vtmp;
+ vtmp = vmin; vtmp_y = vmax_y; bb1[6] = vtmp;
+ vtmp = vmax; vtmp_z = vmin_z; bb1[7] = vtmp;
+
+ makevectors(self.angles + '-2 0 0' * self.angles_x);
+ bcol = 0;
+
+ // Pass1: Transform by rotation, ajust points by impact/s
+ for(i = 8; i >= 0; --i)
+ {
+ vtmp = bb1[i];
+ vtmp = self.origin + vtmp_x * v_forward - vtmp_y * v_right + vtmp_z * v_up;
+ traceline(self.origin, vtmp, MOVE_WORLDONLY, self);
+ te_lightning1(world,self.origin,vtmp);
+ if(trace_fraction != 1.0)
+ {
+ vforce += (trace_endpos - vtmp);
+ vtmp3 = self.origin + self.velocity * frametime;
+ vtmp2 = vectoangles(normalize(vtmp - vtmp3));
+ vrot += (vectoangles(normalize(trace_endpos - vtmp3)) - vtmp2);
+ bcol += 1;
+ }
+ }
+
+ if(bcol)
+ {
+
+ vtmp = self.origin + self.velocity * frametime;
+ self.angles += vrot * frametime;
+ self.velocity += vforce * frametime;
+
+ }
+
+}
+
--- /dev/null
+#ifdef VEHICLES_CSQC
+// SendFlags
+float VSF_SETUP = 1; /// Send vehicle type etc
+float VSF_ORIGIN = 2; /// Send location
+float VSF_MOVEMENT = 4; /// Send movement update (and angles)
+float VSF_AVEL = 8; /// Send Angular velocity
+float VSF_STATS = 16; /// Send ammo, health etc
+float VSF_EXTRA = 32; /// Send additional data (turret rotations etc). Handeld per vehicle type.
+float VSF_ANIMINFO = 64; /// Animation info
+float VSF_FULL_UPDATE = 16777215; /// Send everything
+
+float VSX_FAR = 1;
+float VSX_OWNER = 2;
+float VSX_GUN1 = 4;
+float VSX_GUN2 = 8;
+
+#ifdef SVQC
+#define VSX_FARDISTANCE 2000
+float send_vehile(entity to, float sf)
+{
+ float dist, xf;
+
+ var void WriteFunc(float, float);
+
+ dist = vlen(self.origin - to.origin);
+ if(to == self.owner)
+ xf |= VSX_OWNER;
+ else if(dist > VSX_FARDISTANCE)
+ xf |= VSX_FAR;
+
+ // Always send a movement and origin to owner
+ if(to == self.owner)
+ sf |= VSF_ORIGIN | VSF_MOVEMENT;
+
+ WriteByte(MSG_ENTITY, ENT_CLIENT_VEHICLE);
+
+ // We need to know client-side what was sent
+ WriteByte(MSG_ENTITY, sf);
+ WriteByte(MSG_ENTITY, xf);
+
+ if(sf & VSF_SETUP)
+ {
+ WriteByte(MSG_ENTITY, self.hud); //vehicle type = hud
+ WriteByte(MSG_ENTITY, self.team);
+ WriteShort(MSG_ENTITY, self.colormap);
+ WriteShort(MSG_ENTITY, self.vehicle_flags);
+ }
+
+ if(sf & VSF_ORIGIN)
+ {
+ WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+ WriteFunc(MSG_ENTITY, self.origin_x);
+ WriteFunc(MSG_ENTITY, self.origin_y);
+ WriteFunc(MSG_ENTITY, self.origin_z);
+ }
+
+ if(sf & VSF_MOVEMENT)
+ {
+ WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+ WriteFunc(MSG_ENTITY, self.velocity_x);
+ WriteFunc(MSG_ENTITY, self.velocity_y);
+ WriteFunc(MSG_ENTITY, self.velocity_z);
+
+ WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteAngle);
+ WriteFunc(MSG_ENTITY, self.angles_x);
+ WriteFunc(MSG_ENTITY, self.angles_y);
+ WriteFunc(MSG_ENTITY, self.angles_z);
+ }
+
+ if(sf & VSF_AVEL)
+ {
+ WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+ WriteFunc(MSG_ENTITY, self.avelocity_x);
+ WriteFunc(MSG_ENTITY, self.avelocity_y);
+ WriteFunc(MSG_ENTITY, self.avelocity_z);
+ }
+
+ if(sf & VSF_STATS)
+ {
+ WriteByte(MSG_ENTITY, self.vehicle_health);
+ if(xf & VSX_OWNER)
+ {
+ WriteByte(MSG_ENTITY, self.vehicle_shield);
+ WriteByte(MSG_ENTITY, self.vehicle_energy);
+
+ WriteByte(MSG_ENTITY, self.vehicle_ammo1);
+ WriteByte(MSG_ENTITY, self.vehicle_reload1);
+
+ WriteByte(MSG_ENTITY, self.vehicle_ammo2);
+ WriteByte(MSG_ENTITY, self.vehicle_reload2);
+
+ }
+ }
+
+ if(sf & VSF_EXTRA)
+ self.vehile_send_exta(to, sf);
+
+ return TRUE;
+}
+
+void net_link_vehile()
+{
+ self.SendFlags = 0xFFFFFF;
+ Net_LinkEntity(self, FALSE, 0, send_vehile);
+}
+#endif // SVQC
+
+#ifdef CSQC
+void vehicle_spiderbot_assemble()
+{
+
+}
+
+void vehicle_raptor_assemble()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+ float sf, xf;
+ var float ReadFunc();
+
+ sf = ReadByte();
+ xf = ReadByte();
+
+ if(xf & VSX_OWNER)
+ vehicle = self;
+
+ if(sf & VSF_SETUP)
+ {
+ self.vehicle_hud = ReadByte();
+ self.team = ReadByte();
+ self.colormap = ReadShort();
+ self.vehicle_flags = ReadShort();
+
+ switch(self.vehicle_hud)
+ {
+ case HUD_WAKIZASHI:
+ vehicle_racer_assemble();
+ break;
+ case HUD_SPIDERBOT:
+ vehicle_spiderbot_assemble();
+ break;
+ case HUD_RAPTOR:
+ vehicle_raptor_assemble();
+ break;
+ case HUD_BUMBLEBEE:
+ vehicle_bumblebee_assemble();
+ break;
+ default:
+ break;
+ }
+ }
+
+ if(self.vehicle_hud == HUD_WAKIZASHI && xf & VSX_OWNER)
+ {
+
+ vehicle_hudmodel.owner = self;
+ }
+
+ //if(xf & VSX_FAR)
+ // dprint("Client vehicle faaar set\n");
+
+ if(sf & VSF_ORIGIN)
+ {
+ ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+ self.origin_x = ReadFunc();
+ self.origin_y = ReadFunc();
+ self.origin_z = ReadFunc();
+
+ setorigin(self, self.origin);
+ //self.lastupdate = time;
+ }
+
+ if(sf & VSF_MOVEMENT)
+ {
+ ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+ self.velocity_x = ReadFunc();
+ self.velocity_y = ReadFunc();
+ self.velocity_z = ReadFunc();
+
+ ReadFunc = ((sf & VSX_FAR) ? ReadShort : ReadAngle);
+ self.angles_x = ReadFunc();
+ self.angles_y = ReadFunc();
+ self.angles_z = ReadFunc();
+
+ //self.lastupdate = time;
+ // self.move_velocity = self.velocity;
+ // self.move_angles = self.angles;
+ }
+
+ if(sf & VSF_AVEL)
+ {
+ ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+ self.avelocity_x = ReadFunc();
+ self.avelocity_y = ReadFunc();
+ self.avelocity_z = ReadFunc();
+
+ // self.move_avelocity = self.avelocity;
+ }
+
+ if(sf & VSF_STATS)
+ {
+ self.vehicle_health = ReadByte();
+ if(xf & VSX_OWNER)
+ {
+ self.vehicle_shield = ReadByte();
+ self.vehicle_energy = ReadByte();
+ self.vehicle_ammo1 = ReadByte();
+ self.vehicle_reload1 = ReadByte();
+ self.vehicle_ammo2 = ReadByte();
+ self.vehicle_reload2 = ReadByte();
+ }
+ }
+
+ if(sf & VSF_EXTRA)
+ self.vehile_read_exta(sf);
+
+}
+
+#endif // CSQC
+#else
+#ifdef CSQC
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+
+}
+#endif
+#endif // VEHICLES_CSQC
-#define RACER_MIN '-80 -80 -40'
-#define RACER_MAX '80 80 40'
-#define RACER_TICRATE 0.05
+#define RACER_MIN '-120 -120 -40'
+#define RACER_MAX '120 120 40'
+#ifdef SVQC
void racer_exit(float eject);
void racer_enter();
-//void racer_think();
-float racer_power_air;
-float racer_power_solid;
-float racer_power_min;
-float racer_anglestabilizer;
-float racer_springlength;
-
-float racer_healthmax;
-float racer_shieldmax;
-float racer_energymax;
-
-float racer_pitchspeed;
-float racer_turnspeed;
-float racer_turnroll;
-float racer_speed_forward;
-float racer_speed_strafe;
-
-float racer_afterburn_cost;
-
-float jetfromtag_power;
-float jetfromtag_normpower;
-vector jetfromtag_origin;
-float jetfromtag_groundcontact;
-
-void racer_loadsettings()
-{
- racer_power_min = autocvar_g_vehicle_racer_power_min * 0.25;
- racer_power_air = autocvar_g_vehicle_racer_power_air * 0.25;
- racer_power_solid = autocvar_g_vehicle_racer_power_solid * 0.25;
-
- racer_springlength = autocvar_g_vehicle_racer_springlength;
- racer_anglestabilizer = autocvar_g_vehicle_racer_anglestabilizer;
- racer_pitchspeed = autocvar_g_vehicle_racer_pitchspeed;
- racer_turnspeed = autocvar_g_vehicle_racer_turnspeed;
- racer_turnroll = autocvar_g_vehicle_racer_turnroll;
- racer_speed_forward = autocvar_g_vehicle_racer_speed_forward;
- racer_speed_strafe = autocvar_g_vehicle_racer_speed_strafe;
-
- racer_afterburn_cost = autocvar_g_vehicle_racer_afterburn_cost;
-
- racer_healthmax = autocvar_g_vehicle_racer_health;
- racer_shieldmax = autocvar_g_vehicle_racer_shield;
- racer_energymax = autocvar_g_vehicle_racer_energy;
-
-}
-
-vector racer_jetfromtag(string tagname)
-{
- vector force_dir;
- float air_frac, solid_frac, air_pwr, solid_pwr;
-
- jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
- v_forward = normalize(v_forward) * -1;
-
- force_dir = jetfromtag_origin - (v_forward * racer_springlength);
- traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
- //te_lightning1(world,jetfromtag_origin, force_dir);
-
- //trace_fraction *= trace_fraction;
-
- solid_frac = 1 - trace_fraction;
- air_frac = trace_fraction;
-
- if (trace_fraction != 1.0)
- jetfromtag_groundcontact = 1;
-
- solid_pwr = solid_frac * racer_power_solid;
- air_pwr = air_frac * racer_power_air;
-
- jetfromtag_power = solid_pwr + air_pwr;
- jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
-
- //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min));
- //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min);
- return v_forward * max(jetfromtag_power, racer_power_min);
-}
+// Auto cvars
+float autocvar_g_vehicle_racer_speed_afterburn;
+float autocvar_g_vehicle_racer_afterburn_cost;
+
+float autocvar_g_vehicle_racer_anglestabilizer;
+float autocvar_g_vehicle_racer_downforce;
+
+float autocvar_g_vehicle_racer_speed_forward;
+float autocvar_g_vehicle_racer_speed_strafe;
+float autocvar_g_vehicle_racer_springlength;
+float autocvar_g_vehicle_racer_upforcedamper;
+float autocvar_g_vehicle_racer_friction;
+
+float autocvar_g_vehicle_racer_hovertype;
+float autocvar_g_vehicle_racer_hoverpower;
+
+float autocvar_g_vehicle_racer_turnroll;
+float autocvar_g_vehicle_racer_turnspeed;
+float autocvar_g_vehicle_racer_pitchspeed;
+
+float autocvar_g_vehicle_racer_energy;
+float autocvar_g_vehicle_racer_energy_regen;
+float autocvar_g_vehicle_racer_energy_regen_pause;
+
+float autocvar_g_vehicle_racer_health;
+float autocvar_g_vehicle_racer_health_regen;
+float autocvar_g_vehicle_racer_health_regen_pause;
+
+float autocvar_g_vehicle_racer_shield;
+float autocvar_g_vehicle_racer_shield_regen;
+float autocvar_g_vehicle_racer_shield_regen_pause;
+
+float autocvar_g_vehicle_racer_cannon_cost;
+float autocvar_g_vehicle_racer_cannon_damage;
+float autocvar_g_vehicle_racer_cannon_radius;
+float autocvar_g_vehicle_racer_cannon_refire;
+float autocvar_g_vehicle_racer_cannon_speed;
+float autocvar_g_vehicle_racer_cannon_spread;
+float autocvar_g_vehicle_racer_cannon_force;
+
+float autocvar_g_vehicle_racer_rocket_accel;
+float autocvar_g_vehicle_racer_rocket_damage;
+float autocvar_g_vehicle_racer_rocket_radius;
+float autocvar_g_vehicle_racer_rocket_force;
+float autocvar_g_vehicle_racer_rocket_refire;
+float autocvar_g_vehicle_racer_rocket_speed;
+float autocvar_g_vehicle_racer_rocket_turnrate;
+
+float autocvar_g_vehicle_racer_rocket_locktarget;
+float autocvar_g_vehicle_racer_rocket_locking_time;
+float autocvar_g_vehicle_racer_rocket_locking_releasetime;
+float autocvar_g_vehicle_racer_rocket_locked_time;
+float autocvar_g_vehicle_racer_rocket_locked_maxangle;
+
+float autocvar_g_vehicle_racer_respawntime;
+
+float autocvar_g_vehicle_racer_blowup_radius;
+float autocvar_g_vehicle_racer_blowup_coredamage;
+float autocvar_g_vehicle_racer_blowup_edgedamage;
+float autocvar_g_vehicle_racer_blowup_forceintensity;
+
+var vector racer_force_from_tag(string tag_name, float spring_length, float max_power);
void racer_align4point()
{
- vector push_vector;
+ vector push_vector, v_add;
float fl_push, fr_push, bl_push, br_push;
- jetfromtag_groundcontact = 0;
- push_vector = racer_jetfromtag("tag_engine_fr");
- fr_push = jetfromtag_normpower;
- traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
- if(trace_fraction != 1)
- self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+ push_vector = racer_force_from_tag("tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ fr_push = force_fromtag_normpower;
+ //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+
+ push_vector += racer_force_from_tag("tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ fl_push = force_fromtag_normpower;
+ //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_jetfromtag("tag_engine_fl");
- fl_push = jetfromtag_normpower;
- traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
- if(trace_fraction != 1)
- self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+ push_vector += racer_force_from_tag("tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ br_push = force_fromtag_normpower;
+ //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_jetfromtag("tag_engine_br");
- br_push = jetfromtag_normpower;
- traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
- if(trace_fraction != 1)
- self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+ push_vector += racer_force_from_tag("tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+ bl_push = force_fromtag_normpower;
+ //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
- push_vector += racer_jetfromtag("tag_engine_bl");
- bl_push = jetfromtag_normpower;
- traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
- if(trace_fraction != 1)
- self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+ self.velocity += (push_vector * frametime);
- self.velocity = self.velocity + (push_vector * frametime);
- self.velocity_z -= autocvar_sv_gravity * frametime;
+ // Anti ocilation
+ if(self.velocity_z > 0)
+ self.velocity_z *= 1 - (autocvar_g_vehicle_racer_upforcedamper * frametime);
- push_vector_x = (fl_push - bl_push);
+ self.velocity += v_add;
+ //self.velocity_z -= autocvar_sv_gravity * frametime;
+
+ push_vector_x = (fl_push - bl_push);
push_vector_x += (fr_push - br_push);
push_vector_x *= 360;
push_vector_z += (br_push - bl_push);
push_vector_z *= 360;
- //if (push_vector_z != 0)
- if(self.angles_z > 0)
- self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
- else
- self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
- //else
- self.angles_z += push_vector_z * frametime;
-
- //if (push_vector_x != 0)
- if(self.angles_x > 0)
- self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
- else
- self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
- //else
- self.angles_x += push_vector_x * frametime;
-}
-
-void racer_bolt_explode()
-{
- vector org2;
-
- org2 = findbetterlocation (self.origin, 8);
- pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
- RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
- sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-
- remove (self);
-}
-
-void racer_rocket_explode()
-{
- vector org2;
-
- //if not(self.owner)
- // self.owner = self.realowner;
-
- 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);
- RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
-
- remove (self);
-}
-
-void racer_rocket_touch()
-{
- if(other.owner == self.owner)
- return;
-
- PROJECTILE_TOUCH;
- /*
- if(pointcontents(self.origin) == CONTENT_SKY)
- {
- self.think = SUB_Remove;
- self.nextthink = time;
- return;
- }
- */
+ // Apply angle diffrance
+ self.angles_z += push_vector_z * frametime;
+ self.angles_x += push_vector_x * frametime;
- racer_rocket_explode();
+ // Apply stabilizer
+ self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
+ self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
}
void racer_fire_cannon(string tagname)
{
+ vector v;
entity bolt;
- bolt = spawn();
- bolt.solid = SOLID_TRIGGER;
- bolt.movetype = MOVETYPE_FLYMISSILE;
- bolt.flags = FL_PROJECTILE | FL_NOTARGET;
- bolt.owner = self;
- bolt.realowner = self.owner;
- bolt.touch = racer_bolt_explode;
- bolt.think = racer_bolt_explode;
- bolt.nextthink = time + 9;
- bolt.bot_dodge = TRUE;
- bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
- setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
+ v = gettaginfo(self, gettagindex(self, tagname));
+ bolt = vehicles_projectile("wakizashi_gun_muzzleflash", "weapons/lasergun_fire.wav",
+ v, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
+ autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force, 0,
+ DEATH_WAKIGUN, PROJECTILE_WAKICANNON, 0, TRUE, TRUE);
- vector v;
- // FIXME this uses prydon cursor
- v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
+ // Fix z-aim (for chase mode)
+ v = normalize(trace_endpos - bolt.origin);
v_forward_z = v_z * 0.5;
-
- bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
-
- CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
+ bolt.velocity = v_forward * autocvar_g_vehicle_racer_cannon_speed;
}
void racer_rocket_groundhugger()
{
- vector newdir,olddir;
- float oldspeed, newspeed;
+ vector olddir, newdir;
+ float oldvel, newvel;
self.nextthink = time;
- if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+ if(self.owner.deadflag != DEAD_NO || self.cnt < time)
{
- racer_rocket_explode();
+ self.use();
return;
}
return;
}
- olddir = normalize(self.velocity);
- oldspeed = vlen(self.velocity);
+ olddir = normalize(self.velocity);
+ oldvel = vlen(self.velocity);
+ newvel = oldvel + self.lip;
- tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self);
- if(trace_fraction >= 0.35)
+ tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self);
+ if(trace_fraction <= 0.5)
{
- traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self);
- if(trace_fraction != 1.0)
- newdir = trace_endpos + '0 0 32';
-
- newdir = normalize(newdir - self.origin);
+ // Hitting somethign soon, just speed ahead
+ self.velocity = olddir * newvel;
+ UpdateCSQCProjectile(self);
+ return;
}
- newspeed = oldspeed + self.lip;
- self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+ traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self);
+ if(trace_fraction != 1.0)
+ {
+ newdir = normalize(trace_endpos + '0 0 64' - self.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
+ self.velocity = normalize(olddir + newdir) * newvel;
+ }
+ else
+ {
+ self.velocity = olddir * newvel;
+ self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
+ }
UpdateCSQCProjectile(self);
+ return;
}
-void racer_rocket_think()
+void racer_rocket_tracker()
{
- vector newdir,olddir, eorg, edir;
- float oldspeed, newspeed, dist;
+ vector olddir, newdir;
+ float oldvel, newvel;
self.nextthink = time;
- if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+ if (self.owner.deadflag != DEAD_NO || self.cnt < time)
{
- racer_rocket_explode();
+ self.use();
return;
}
}
olddir = normalize(self.velocity);
- oldspeed = vlen(self.velocity);
- fixedmakevectors(olddir);
- eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax);
- edir = normalize(eorg - self.origin);
- dist = vlen(self.origin - self.enemy.origin);
+ oldvel = vlen(self.velocity);
+ newvel = oldvel + self.lip;
+ makevectors(vectoangles(olddir));
- if(dist > 512)
+ traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
+ newdir = normalize(self.enemy.origin - self.origin);
+
+ if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle)
{
- vector ddir;
- float p;
- p = dist / self.delay;
- p = max(0.05, p * 0.25);
- ddir = steerlib_traceavoid(p, oldspeed * 0.25);
- edir += ddir * 0.95;
+ //bprint("Target lost!\n");
+ //dprint("OF:", ftos(vlen(newdir - v_forward)), "\n");
+ self.think = racer_rocket_groundhugger;
+ return;
}
- newdir = normalize(olddir + edir * self.wait);
- newspeed = oldspeed + self.lip;
- self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+ if(trace_fraction != 1.0)
+ newdir_z += 16 * sys_frametime;
+
+ self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+ self.velocity_z -= 800 * sys_frametime;
UpdateCSQCProjectile(self);
+ return;
}
-void racer_fire_rocket(string tagname)
+void racer_fire_rocket(string tagname, entity trg)
{
+ vector v;
entity rocket;
- rocket = spawn();
- setsize (rocket, '-1 -1 -1', '1 1 1');
- rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
- rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate;
- rocket.solid = SOLID_BBOX;
- rocket.movetype = MOVETYPE_FLYMISSILE;
- rocket.flags = FL_PROJECTILE;
- rocket.owner = self;
- rocket.realowner = self.owner;
- rocket.touch = racer_rocket_touch;
- rocket.bot_dodge = TRUE;
- rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage;
- setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
-
- /*
- if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
- rocket.enemy = self.tur_head.gun1;
-
- if(rocket.enemy)
- {
- rocket.delay = vlen(rocket.enemy.origin - rocket.origin);
- rocket.cnt = time + 9;
- rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
- rocket.think = racer_rocket_think;
- rocket.nextthink = time;
- CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
- }
- else
- {
- */
- rocket.cnt = time + 9;
- rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
- rocket.think = racer_rocket_groundhugger;
- rocket.nextthink = time;
- CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
- //}
-}
-
-float racer_customizeentityforclient()
-{
+ v = gettaginfo(self, gettagindex(self, tagname));
+ rocket = vehicles_projectile("wakizashi_rocket_launch", "weapons/rocket_fire.wav",
+ v, v_forward * autocvar_g_vehicle_racer_rocket_speed,
+ autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
+ DEATH_WAKIROCKET, PROJECTILE_WAKIROCKET, 20, FALSE, FALSE);
- if(self.deadflag == DEAD_DEAD)
- return FALSE;
+ rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
+ rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate;
+ rocket.nextthink = time;
+ rocket.enemy = trg;
+ rocket.cnt = time + 15;
- /*
- if(other == self.owner)
- self.alpha = -1;
+ if(trg)
+ rocket.think = racer_rocket_tracker;
else
- self.alpha = 1;
- */
-
- return TRUE;
+ rocket.think = racer_rocket_groundhugger;
}
-float racer_pplug()
+float racer_frame()
{
entity player, racer;
- float ftmp, ftmp2;
vector df;
-
- if(autocvar_g_vehicle_racer_reload)
- {
- racer_loadsettings();
- cvar_set("g_vehicle_racer_reload","0");
- }
-
- player = self;
- racer = self.vehicle;
-
- player.BUTTON_ZOOM = 0;
- player.BUTTON_CROUCH = 0;
-
- self = racer;
-
- if(player.BUTTON_USE)
- {
- self = racer;
- racer_exit(0);
- self = player;
- return 0;
- }
-
+ float ftmp;
+
+ if(intermission_running)
+ return 1;
+
+ player = self;
+ racer = self.vehicle;
+ self = racer;
+
+ player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
+
+ vehicles_painframe();
+
if(racer.deadflag != DEAD_NO)
{
self = player;
return 1;
}
-
racer_align4point();
- racer.angles_x *= -1;
- makevectors(racer.angles);
+ crosshair_trace(player);
- // Rotate Body
- ftmp = racer_turnspeed * sys_frametime;
- ftmp2 = ftmp * -1;
+ racer.angles_x *= -1;
- ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
- ftmp2 = anglemods(racer.angles_y + ftmp);
+ // Yaw
+ ftmp = autocvar_g_vehicle_racer_turnspeed * frametime;
+ ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
+ racer.angles_y = anglemods(racer.angles_y + ftmp);
// Roll
- ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45);
- ftmp = anglemods(racer.angles_z + ftmp);
- racer.angles_z = bound(-85, ftmp, 85);
+ racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * frametime;
- // Turn
- racer.angles_y = ftmp2;
+ // Pitch
+ ftmp = autocvar_g_vehicle_racer_pitchspeed * frametime;
+ ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp);
+ racer.angles_x = bound(-30, anglemods(racer.angles_x + ftmp), 30);
- // Pitch Body
- ftmp = racer_pitchspeed * sys_frametime;
- ftmp2 = ftmp * -1;
-
- ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
- racer.angles_x = anglemods(racer.angles_x + ftmp);
+ makevectors(racer.angles);
racer.angles_x *= -1;
- df = racer.velocity * -0.5;
+
+ ftmp = racer.velocity_z;
+ df = racer.velocity * -autocvar_g_vehicle_racer_friction;
+ racer.velocity_z = ftmp;
if(player.movement_x != 0)
{
if(player.movement_x > 0)
- df += v_forward * racer_speed_forward;
+ df += v_forward * autocvar_g_vehicle_racer_speed_forward;
else if(player.movement_x < 0)
- df -= v_forward * racer_speed_forward;
+ df -= v_forward * autocvar_g_vehicle_racer_speed_forward;
}
if(player.movement_y != 0)
{
if(player.movement_y < 0)
- df -= v_right * racer_speed_strafe;
+ df -= v_right * autocvar_g_vehicle_racer_speed_strafe;
else if(player.movement_y > 0)
- df += v_right * racer_speed_strafe;
+ df += v_right * autocvar_g_vehicle_racer_speed_strafe;
}
-
- // limit _z to avoid flying on normal thrust
- if(df_z > 0)
- df_z = min(df_z,700);
-
-
+
+ if(vlen(player.movement) != 0)
+ {
+ if(self.sound_nexttime < time || self.sounds != 1)
+ {
+ self.sounds = 1;
+ self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ }
+ }
+ else
+ {
+ if(self.sound_nexttime < time || self.sounds != 0)
+ {
+ self.sounds = 0;
+ self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ }
+ }
+
// Afterburn
- if (player.BUTTON_JUMP)
- if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
+ if (player.BUTTON_JUMP && racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * frametime))
{
- racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
- racer.vehicle_energy -= racer_afterburn_cost * frametime;
+ if(time - racer.wait > 0.2)
+ pointparticles(particleeffectnum("wakizashi_booster_smoke"), self.origin, '0 0 0', 1);
+
+ racer.wait = time;
+ racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime;
df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
+
+ if(self.invincible_finished < time)
+ {
+ traceline(self.origin, self.origin - '0 0 256', MOVE_NORMAL, self);
+ if(trace_fraction != 1.0)
+ pointparticles(particleeffectnum("smoke_small"), trace_endpos, '0 0 0', 1);
+
+ self.invincible_finished = time + 0.1 + (random() * 0.1);
+ }
+
+ if(self.strength_finished < time)
+ {
+ //self.sounds = 2;
+ self.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
+ sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ }
+ }
+ else
+ {
+ self.strength_finished = 0;
+ sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
}
+
racer.velocity += df * frametime;
racer.velocity = racer.velocity - df;
player.movement = racer.velocity;
- /*
- // for homing rockets
- // FIXME this uses prydon cursor
- if(self.owner.cursor_trace_ent)
- {
- self.tur_head.gun1 = self.owner.cursor_trace_ent;
- self.tur_head.cnt = time + 1;
- }
- */
-
if(player.BUTTON_ATCK)
if(time > racer.attack_finished_single)
- if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
+ if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost)
{
- racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
- racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
+ racer.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
+ racer.wait = time;
+ crosshair_trace(player);
if(racer.cnt)
{
racer_fire_cannon("tag_fire1");
racer_fire_cannon("tag_fire2");
racer.cnt = 1;
}
- racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
+ racer.attack_finished_single = time + autocvar_g_vehicle_racer_cannon_refire;
+ //self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy;
}
- if(player.BUTTON_ATCK2)
- if(time > racer.delay)
+ if(autocvar_g_vehicle_racer_rocket_locktarget)
{
- racer_fire_rocket("tag_rocket_r");
- racer_fire_rocket("tag_rocket_l");
- racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
- racer.lip = time;
+ vehicles_locktarget((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
+ (1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
+ autocvar_g_vehicle_racer_rocket_locked_time);
+ if(self.lock_target)
+ {
+ if(racer.lock_strength == 1)
+ UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '1 0 0', 0);
+ else if(self.lock_strength > 0.5)
+ UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 1 0', 0);
+ else if(self.lock_strength < 0.5)
+ UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 0 1', 0);
+ }
}
- player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
- vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
- vehicle_stdproc_healthregen(racer_healthmax, frametime);
-
- if (racer.wait < time)
- vehicle_stdproc_energyregen(racer_energymax, frametime);
- else
- player.vehicle_energy = (racer.vehicle_energy / racer_energymax);
-
- self = player;
+ if(time > racer.delay)
+ if(player.BUTTON_ATCK2)
+ {
+ self.misc_bulletcounter += 1;
+ racer.delay = time + 0.3;
+ if(self.misc_bulletcounter == 1)
+ racer_fire_rocket("tag_rocket_r", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+ else if(self.misc_bulletcounter == 2)
+ {
+ racer_fire_rocket("tag_rocket_l", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+ self.lock_strength = 0;
+ self.lock_target = world;
+ self.misc_bulletcounter = 0;
- player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
- setorigin(player,racer.origin + '0 0 32');
- player.velocity = racer.velocity;
+ racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
+ racer.lip = time;
+ }
+ }
+ player.vehicle_reload1 = bound(0, 100 * ((time - racer.lip) / (racer.delay - racer.lip)), 100);
- return 1;
-}
+ if(self.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime);
-void racer_exitthink()
-{
- float a, b, c;
+ if(self.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime);
- self.nextthink = time;
+ if(self.vehicle_flags & VHF_ENERGYREGEN)
+ vehicles_regen(wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime);
- a = racer_anglestabilizer;
- b = racer_springlength;
- c = racer_power_solid;
- racer_anglestabilizer = 36;
- racer_springlength = 96;
- racer_power_solid = 300;
+ VEHICLE_UPDATE_PLAYER(health, racer);
+ VEHICLE_UPDATE_PLAYER(energy, racer);
- racer_align4point();
+ if(self.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(shield, racer);
- if(self.velocity_z < 0)
- self.velocity_z *= 0.95;
- racer_anglestabilizer = a;
- racer_springlength = b;
- racer_power_solid = c;
+ player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+ setorigin(player,racer.origin + '0 0 32');
+ player.velocity = racer.velocity;
- self.velocity_x *= 0.95;
- self.velocity_y *= 0.95;
+ self = player;
+ return 1;
}
-void racer_spawnthink()
+void racer_think()
{
- float a, b, c;
- vector dorg;
-
- self.nextthink = time;
-
- a = racer_anglestabilizer;
- b = racer_springlength;
- c = racer_power_solid;
-
- racer_anglestabilizer = 36;
- racer_springlength = 96;
- racer_power_solid = 300;
-
- // self.velocity_z += sin(time * 128) * 4;
-
- racer_align4point();
+ /*
+ float a, b, c;a = autocvar_g_vehicle_racer_anglestabilizer;
+ b = autocvar_g_vehicle_racer_springlength;
+ c = autocvar_g_vehicle_racer_hoverpower;
- if(self.velocity_z < 0)
- self.velocity_z *= 0.98;
+ autocvar_g_vehicle_racer_anglestabilizer = 36;
+ autocvar_g_vehicle_racer_springlength = 96;
+ autocvar_g_vehicle_racer_hoverpower = 300;
+ */
- racer_anglestabilizer = a;
- racer_springlength = b;
- racer_power_solid = c;
+ racer_align4point(); //time - self.nextthink);
- self.velocity_x *= 0.95;
- self.velocity_y *= 0.95;
+ /*
+ //if(self.velocity_z > 0)
+ // self.velocity_z *= 0.95;
- dorg = self.pos1 - self.origin ;
+ autocvar_g_vehicle_racer_anglestabilizer = a;
+ autocvar_g_vehicle_racer_springlength = b;
+ autocvar_g_vehicle_racer_hoverpower = c;
+ */
- self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32);
- self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32);
+ self.velocity_x *= 0.9;
+ self.velocity_y *= 0.9;
+ self.velocity_z *= 0.8;
+ self.velocity_z += sin(time * 2) * 16;
+ self.nextthink = time; // + 0.05;
}
void racer_enter()
{
- self.owner = other;
-
-
- self.nextthink = 0;
- self.flags = 0;
- self.vehicle_hudmodel.viewmodelforclient = self.owner;
- self.colormap = self.owner.colormap;
-
- self.owner.PlayerPhysplug = racer_pplug;
- self.owner.takedamage = DAMAGE_NO;
- self.owner.event_damage = SUB_Null;
- self.owner.vehicle = self;
- self.owner.angles = self.angles;
- self.owner.solid = SOLID_NOT;
- self.owner.movetype = MOVETYPE_NOCLIP;
- self.owner.alpha = -1;
- self.owner.hud = HUD_WAKIZASHI;
- self.owner.effects |= EF_NODRAW;
- self.owner.view_ofs = '0 0 0';
-
+ self.movetype = MOVETYPE_BOUNCE;
self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
-
- setorigin(other,self.origin + '0 0 32');
- other.velocity = self.velocity;
-
- other.flags &~= FL_ONGROUND;
- msg_entity = other;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity( MSG_ONE, self.vehicle_viewport);
-
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, self.angles_x * -1); // tilt
- WriteAngle(MSG_ONE, self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
-}
-
-void racer_spawn();
-void racer_return()
-{
- pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
- self.enemy.think = racer_spawn;
- self.enemy.nextthink = time;
- remove(self);
+
+ if(self.owner.flagcarried)
+ setorigin(self.owner.flagcarried, '-190 0 96');
}
void racer_exit(float eject)
{
- self.colormap = 1024;
- self.flags = FL_NOTARGET;
-
+ vector spot;
+
+ self.think = racer_think;
+ self.nextthink = time;
+ self.movetype = MOVETYPE_TOSS;
+ sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+
if not (self.owner)
return;
- msg_entity = self.owner;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity( MSG_ONE, self.owner);
-
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, 0); // tilt
- WriteAngle(MSG_ONE, self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
-
- if (self.deadflag == DEAD_NO)
- {
- self.think = racer_exitthink;
- self.nextthink = time;
- }
-
- self.owner.takedamage = DAMAGE_AIM;
- self.owner.solid = SOLID_SLIDEBOX;
- self.owner.movetype = MOVETYPE_WALK;
-
- setsize(self.owner,PL_MIN,PL_MAX);
-
- self.owner.effects &~= EF_NODRAW;
- self.owner.alpha = 1;
- self.owner.PlayerPhysplug = SUB_Null;
- self.owner.vehicle = world;
- self.owner.view_ofs = PL_VIEW_OFS;
- self.owner.event_damage = PlayerDamage;
- self.owner.hud = HUD_NORMAL;
-
- self.vehicle_hudmodel.viewmodelforclient = self;
-
+ makevectors(self.angles);
if(eject)
{
- makevectors(self.angles);
- setorigin(self.owner,self.origin + v_forward * 100);
+ spot = self.origin + v_forward * 100 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
}
else
{
- self.owner.velocity = (v_forward) * -150;
- setorigin(self.owner,self.origin - v_forward * 128);
+ spot = self.origin - v_forward * 200 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
}
-
+
self.owner = world;
-
- if (self.deadflag != DEAD_NO)
- {
- entity ret;
- ret = spawn();
- ret.enemy = self;
- ret.think = racer_return;
- ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
- }
-}
-
-void racer_touch()
-{
- if(self.owner)
- {
- if(vlen(self.velocity) == 0)
- return;
-
- if(other.classname != "player")
- return;
-
- vector a;
- a = normalize(other.origin - self.origin);
- a = a - normalize(self.velocity);
-
- return;
- }
-
- if(other.classname != "player")
- return;
-
- if(other.deadflag != DEAD_NO)
- return;
-
- if(other.vehicle != world)
- return;
-
- racer_enter();
}
void racer_spawn()
{
- self.think = racer_spawnthink;
- self.nextthink = time;
-
- self.flags = FL_NOTARGET;
- self.effects = 0;
-
- self.vehicle_health = racer_healthmax;
- self.vehicle_shield = racer_shieldmax;
+ self.think = racer_think;
+ self.nextthink = time;
+ self.vehicle_health = autocvar_g_vehicle_racer_health;
+ self.vehicle_shield = autocvar_g_vehicle_racer_shield;
- self.event_damage = vehicle_stdproc_damage;
- self.touch = racer_touch;
+ self.movetype = MOVETYPE_TOSS;
+ self.solid = SOLID_SLIDEBOX;
+ self.delay = time;
+ self.scale = 0.5;
- self.iscreature = TRUE;
- self.scale = 0.5;
- self.movetype = MOVETYPE_FLY;
- self.solid = SOLID_SLIDEBOX;
- self.takedamage = DAMAGE_AIM;
-
- self.alpha = 1;
- self.colormap = 1024;
- self.deadflag = DEAD_NO;
- self.bot_attack = TRUE;
-
- self.vehicle_energy = 1;
- self.vehicle_hudmodel.viewmodelforclient = self;
-
- setorigin(self, self.pos1);
- self.angles = self.pos2;
-
- setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
- pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
- self.delay = time;
+ setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5);
}
void racer_blowup()
{
-
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
- pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
self.deadflag = DEAD_DEAD;
self.vehicle_exit(VHEF_NORMAL);
- RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
- self.alpha = -1;
+ RadiusDamage (self, self, autocvar_g_vehicle_racer_blowup_coredamage,
+ autocvar_g_vehicle_racer_blowup_edgedamage,
+ autocvar_g_vehicle_racer_blowup_radius, world,
+ autocvar_g_vehicle_racer_blowup_forceintensity,
+ DEATH_WAKIBLOWUP, world);
+
self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
self.think = racer_spawn;
self.movetype = MOVETYPE_NONE;
self.effects = EF_NODRAW;
- self.avelocity_z = 0;
- self.colormod = '0 0 0';
+ self.colormod = '0 0 0';
+ self.avelocity = '0 0 0';
+ self.velocity = '0 0 0';
- setorigin(self,self.pos1);
+ setorigin(self, self.pos1);
+ self.think = racer_spawn;
+ self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
}
-void racer_dietouch()
+void racer_deadtouch()
{
- if(self.wait > time)
- return;
-
- self.wait = time + 0.75;
-
- pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+ self.avelocity_x *= 0.7;
+ self.cnt -= 1;
+ if(self.cnt <= 0)
+ racer_blowup();
}
void racer_die()
{
self.health = 0;
self.event_damage = SUB_Null;
- self.iscreature = FALSE;
- self.solid = SOLID_NOT;
+ self.solid = SOLID_CORPSE;
self.takedamage = DAMAGE_NO;
- self.touch = racer_dietouch;
self.deadflag = DEAD_DYING;
self.movetype = MOVETYPE_BOUNCE;
- self.wait = time;
-
- pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
-
- self.velocity += '0 0 128';
+ self.wait = time;
+ self.cnt = 1 + random() * 2;
+ self.touch = racer_deadtouch;
+
+ pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
if(random() < 0.5)
- self.avelocity_z = 16;
+ self.avelocity_z = 32;
else
- self.avelocity_z = -16;
+ self.avelocity_z = -32;
- self.colormod = '-0.5 -0.5 -0.5';
+ self.avelocity_x = -vlen(self.velocity) * 0.2;
+ self.velocity += '0 0 700';
+ self.colormod = '-0.5 -0.5 -0.5';
self.think = racer_blowup;
- self.nextthink = time + 3;
+ self.nextthink = 2 + time + random() * 3;
}
void racer_dinit()
{
+ if not (vehicle_initialize(
+ "Wakizashi",
+ "models/vehicles/wakizashi.dpm",
+ "null", // we need this so tur_head is networked and usable for sounds
+ "models/vehicles/wakizashi_cockpit.dpm",
+ "", "", "tag_viewport",
+ HUD_WAKIZASHI,
+ 0.5 * RACER_MIN, 0.5 * RACER_MAX,
+ FALSE,
+ racer_spawn, autocvar_g_vehicle_racer_respawntime,
+ racer_frame,
+ racer_enter, racer_exit,
+ racer_die, racer_think,
+ TRUE))
+ {
+ remove(self);
+ return;
+ }
- tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
- setorigin(self,trace_endpos);
-
- if (self.netname == "")
- self.netname = "Race PoD";
-
- self.cvar_basename = "g_vehicle_racer";
-
- self.vehicle_viewport = spawn();
- self.vehicle_hudmodel = spawn();
- //self.ccamera = spawn();
-
- setorigin(self, self.origin);
-
- setmodel(self,"models/vehicles/wakizashi.dpm");
- setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
- setmodel (self.vehicle_viewport, "null");
+ if(autocvar_g_vehicle_racer_hovertype != 0)
+ racer_force_from_tag = vehicles_force_fromtag_maglev;
+ else
+ racer_force_from_tag = vehicles_force_fromtag_hover;
+ // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
+ self.scale = 0.5;
setattachment(self.vehicle_hudmodel, self, "");
setattachment(self.vehicle_viewport, self, "tag_viewport");
- self.vehicle_hudmodel.viewmodelforclient = self;
- self.customizeentityforclient = racer_customizeentityforclient;
-
- self.tur_head = spawn();
-
- self.pos1 = self.origin;
- self.pos2 = self.angles;
- self.angles = '0 0 0';
- self.angles = self.pos1;
-
- self.vehicle_die = racer_die;
- self.vehicle_exit = racer_exit;
-
- addstat(STAT_HUD, AS_INT, hud);
- addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
- addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
- addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
-
- addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
- addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-
- addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
- addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
- racer_spawn();
+ self.mass = 900;
}
void spawnfunc_vehicle_racer()
{
- g_turrets_common_precash();
- racer_loadsettings();
+ self.vehicle_flags |= VHF_DMGSHAKE;
+ self.vehicle_flags |= VHF_DMGROLL;
- self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN;
-
- /*
- traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
- if(trace_startsolid)
- {
- dprint("WARNING: vehicle_racer placed in solid\n");
- traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
- if(trace_startsolid || trace_fraction == 1.0)
- {
- dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n");
- remove(self);
- return;
- }
- }
- */
-
- if(trace_fraction != 1.0)
- setorigin(self,trace_endpos + '0 0 128');
- else
- dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+ precache_sound ("weapons/lasergun_fire.wav");
+ precache_sound ("weapons/rocket_fire.wav");
+
+ precache_sound ("vehicles/racer_idle.wav");
+ precache_sound ("vehicles/racer_move.wav");
+ precache_sound ("vehicles/racer_boost.wav");
+ precache_model ("models/vhshield.md3");
precache_model ("models/vehicles/wakizashi.dpm");
precache_model ("models/vehicles/wakizashi_cockpit.dpm");
- precache_model ("maps/bspmodel.bsp");
+ vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health);
+ if(autocvar_g_vehicle_racer_energy)
+ if(autocvar_g_vehicle_racer_energy_regen)
+ self.vehicle_flags |= VHF_ENERGYREGEN;
+
+ if(autocvar_g_vehicle_racer_shield)
+ self.vehicle_flags |= VHF_HASSHIELD;
+
+ if(autocvar_g_vehicle_racer_shield_regen)
+ self.vehicle_flags |= VHF_SHIELDREGEN;
+
+ if(autocvar_g_vehicle_racer_health_regen)
+ self.vehicle_flags |= VHF_HEALTHREGEN;
self.think = racer_dinit;
- self.nextthink = time + 1;
+
+ if(g_assault)
+ self.nextthink = time + 0.5;
+ else
+ self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
}
+#endif // SVQC
-#define RAPTOR_MIN '-40 -40 0'
-#define RAPTOR_MAX '40 40 40'
-
-float raptor_movestyle;
-float raptor_turnspeed;
-float raptor_turnroll;
-float raptor_pitchspeed;
-float raptor_speed_forward;
-float raptor_speed_strafe;
-float raptor_speed_up;
-float raptor_speed_down;
-
-float raptor_bomblet_waves;
-float raptor_bomblet_wavefirst;
-float raptor_bomblet_wavenext;
-float raptor_bomblet_wawespread;
-float raptor_bomblets;
-float raptor_bomblet_damage;
-float raptor_bomblet_edgedamage;
-float raptor_bomblet_radius;
-float raptor_bomblet_force;
-float raptor_bombs_refire;
-
-float raptor_beam_dps;
-float raptor_beam_fops;
-float raptor_beam_aps;
-float raptor_beam_size;
-float raptor_beam_leangth;
-float raptor_beam_refire;
-
-float raptor_shield_max;
-float raptor_shield_regen;
-
-float raptor_health_max;
-float raptor_health_regen;
-
-float raptor_energy_max;
-float raptor_energy_regen;
+#ifdef SVQC
+#define RAPTOR_MIN '-80 -80 0'
+#define RAPTOR_MAX '80 80 70'
+
+float autocvar_g_vehicle_raptor_respawntime;
+
+float autocvar_g_vehicle_raptor_movestyle;
+float autocvar_g_vehicle_raptor_turnspeed;
+float autocvar_g_vehicle_raptor_pitchspeed;
+float autocvar_g_vehicle_raptor_pitchlimit;
+
+float autocvar_g_vehicle_raptor_speed_forward;
+float autocvar_g_vehicle_raptor_speed_strafe;
+float autocvar_g_vehicle_raptor_speed_up;
+float autocvar_g_vehicle_raptor_speed_down;
+float autocvar_g_vehicle_raptor_friction;
+
+float autocvar_g_vehicle_raptor_bomblets;
+float autocvar_g_vehicle_raptor_bomblet_alt;
+float autocvar_g_vehicle_raptor_bomblet_time;
+float autocvar_g_vehicle_raptor_bomblet_damage;
+float autocvar_g_vehicle_raptor_bomblet_spread;
+float autocvar_g_vehicle_raptor_bomblet_edgedamage;
+float autocvar_g_vehicle_raptor_bomblet_radius;
+float autocvar_g_vehicle_raptor_bomblet_force;
+float autocvar_g_vehicle_raptor_bomblet_explode_delay;
+float autocvar_g_vehicle_raptor_bombs_refire;
+
+float autocvar_g_vehicle_raptor_cannon_turnspeed;
+float autocvar_g_vehicle_raptor_cannon_turnlimit;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_up;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_down;
+
+float autocvar_g_vehicle_raptor_cannon_locktarget;
+float autocvar_g_vehicle_raptor_cannon_locking_time;
+float autocvar_g_vehicle_raptor_cannon_locking_releasetime;
+float autocvar_g_vehicle_raptor_cannon_locked_time;
+float autocvar_g_vehicle_raptor_cannon_predicttarget;
+
+float autocvar_g_vehicle_raptor_cannon_cost;
+float autocvar_g_vehicle_raptor_cannon_damage;
+float autocvar_g_vehicle_raptor_cannon_radius;
+float autocvar_g_vehicle_raptor_cannon_refire;
+float autocvar_g_vehicle_raptor_cannon_speed;
+float autocvar_g_vehicle_raptor_cannon_spread;
+float autocvar_g_vehicle_raptor_cannon_force;
+
+float autocvar_g_vehicle_raptor_energy;
+float autocvar_g_vehicle_raptor_energy_regen;
+float autocvar_g_vehicle_raptor_energy_regen_pause;
+
+float autocvar_g_vehicle_raptor_health;
+float autocvar_g_vehicle_raptor_health_regen;
+float autocvar_g_vehicle_raptor_health_regen_pause;
+
+float autocvar_g_vehicle_raptor_shield;
+float autocvar_g_vehicle_raptor_shield_regen;
+float autocvar_g_vehicle_raptor_shield_regen_pause;
void raptor_spawn();
-void raptor_return();
-float raptor_pplug();
+float raptor_frame();
float raptor_takeoff();
-float raptor_land();
.entity bomb1;
.entity bomb2;
float raptor_altitude(float amax)
{
- tracebox(self.origin, self.mins, self.maxs, '0 0 -1' * amax, TRUE, self);
- if(trace_fraction == 1)
- return amax+1;
- else
- return vlen(self.origin - trace_endpos);
+ tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), TRUE, self);
+ return vlen(self.origin - trace_endpos);
}
-void raptor_loadsettings()
-{
- raptor_movestyle = CCVAR("_movestyle");
- raptor_turnspeed = CCVAR("_turnspeed");
- raptor_turnroll = CCVAR("_turnroll");
- raptor_pitchspeed = CCVAR("_pitchspeed");
- raptor_speed_forward = CCVAR("_speed_forward");
- raptor_speed_strafe = CCVAR("_speed_strafe");
- raptor_speed_up = CCVAR("_speed_up");
- raptor_speed_down = CCVAR("_speed_down");
-
- raptor_bomblet_waves = CCVAR("_bomblet_waves ");
- raptor_bomblet_wavefirst = CCVAR("_bomblet_wavefirst");
- raptor_bomblet_wavenext = CCVAR("_bomblet_wavenext");
- raptor_bomblet_wawespread = CCVAR("_bomblet_wawespread");
- raptor_bomblets = CCVAR("_bomblets");
- raptor_bomblet_damage = CCVAR("_bomblet_damage");
- raptor_bomblet_edgedamage = CCVAR("_bomblet_edgedamage");
- raptor_bomblet_radius = CCVAR("_bomblet_radius");
- raptor_bomblet_force = CCVAR("_bomblet_force ");
- raptor_bombs_refire = CCVAR("_bombs_refire");
-
- raptor_beam_dps = CCVAR("_beam_dps");
- raptor_beam_fops = CCVAR("_beam_fops");
- raptor_beam_aps = CCVAR("_beam_aps");
- raptor_beam_size = CCVAR("_beam_size");
- raptor_beam_leangth = CCVAR("_beam_length");
- raptor_beam_refire = CCVAR("_beam_refire");
-
- raptor_shield_max = CCVAR("_shield");
- raptor_shield_regen = CCVAR("_shield_regen");
-
- raptor_health_max = CCVAR("_health");
- raptor_health_regen = CCVAR("_health_regen");
-
- raptor_energy_max = CCVAR("_energy");
- raptor_energy_regen = CCVAR("_energy_regen");
-}
-void raptor_bombs_return()
+void raptor_bomblet_boom()
{
- self.owner.bomb1.alpha = 1;
- self.owner.bomb2.alpha = 1;
+ RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
+ autocvar_g_vehicle_raptor_bomblet_edgedamage,
+ autocvar_g_vehicle_raptor_bomblet_radius, world,
+ autocvar_g_vehicle_raptor_bomblet_force, DEATH_RAPTOR_BOMB, world);
remove(self);
}
-void raptor_bomblet_boom()
+void raptor_bomblet_touch()
{
- if(other.enemy == self.enemy)
+ if(other == self.owner)
return;
- pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
- RadiusDamage (self, self.enemy, raptor_bomblet_damage, raptor_bomblet_edgedamage, raptor_bomblet_radius, world, raptor_bomblet_force, DEATH_SBROCKET, world);
- remove(self);
+ PROJECTILE_TOUCH;
+ self.think = raptor_bomblet_boom;
+ self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay;
}
void raptor_bomb_burst()
{
- self.angles = vectoangles(self.velocity);
-
- if(self.cnt < time)
+ if(self.cnt > time)
+ if(autocvar_g_vehicle_raptor_bomblet_alt)
{
- entity bomblet;
- float i,v;
- vector d;
-
- makevectors(self.angles);
- v = vlen(self.velocity) + random();
- d = normalize(self.velocity);
- pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
- for(i = 0; i < raptor_bomblets; ++i)
- {
-
- bomblet = spawn();
- setorigin(bomblet,self.origin);
-
- setmodel(bomblet,"models/vehicles/raptor_bomb.dpm");
- bomblet.scale = 0.5;
-
- bomblet.owner = self.owner;
- bomblet.enemy = self.enemy;
-
- bomblet.solid = SOLID_TRIGGER;
- bomblet.movetype = MOVETYPE_BOUNCE;
- bomblet.touch = raptor_bomblet_boom;
-
- bomblet.think = raptor_bomblet_boom;
- bomblet.nextthink = time + 5;
-
- //bomblet.modelflags = MF_ROCKET;
- bomblet.modelflags = MF_GRENADE;
-
- bomblet.velocity = normalize(d + randomvec() * raptor_bomblet_wawespread) * v;
-
- bomblet.angles = vectoangles(bomblet.velocity);
- }
-
- self.wait -= 1;
- if(self.wait <= 0)
+ self.nextthink = time;
+ traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self);
+ if((trace_fraction == 1.0) || (vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius))
{
- remove(self);
+ UpdateCSQCProjectile(self);
return;
}
-
- self.cnt = time + raptor_bomblet_wavenext;
}
- self.nextthink = time;
-}
+ entity bomblet;
+ float i;
-void raptor_bomb_touch()
-{
- raptor_bomb_burst();
+ Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_RAPTOR_BOMB_SPLIT, self);
+
+ for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
+ {
+ bomblet = spawn();
+ setorigin(bomblet, self.origin);
+
+ bomblet.movetype = MOVETYPE_TOSS;
+ bomblet.touch = raptor_bomblet_touch;
+ bomblet.think = raptor_bomblet_boom;
+ bomblet.nextthink = time + 5;
+ bomblet.owner = self.owner;
+ bomblet.realowner = self.realowner;
+ bomblet.velocity = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
+
+ PROJECTILE_MAKETRIGGER(bomblet);
+ CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMBLET, TRUE);
+ }
+
+ remove(self);
}
void raptor_bombdrop()
{
entity bomb_1, bomb_2;
- self.bomb1.alpha = 0.25;
- self.bomb2.alpha = 0.25;
-
bomb_1 = spawn();
bomb_2 = spawn();
- setmodel(bomb_1,"models/vehicles/raptor_bomb.dpm");
- setmodel(bomb_2,"models/vehicles/raptor_bomb.dpm");
-
setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left")));
setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right")));
- bomb_1.movetype = bomb_2.movetype = MOVETYPE_TOSS;
- bomb_1.velocity = bomb_2.velocity = self.velocity;
- bomb_1.touch = bomb_2.touch = raptor_bomb_touch;
- bomb_1.think = bomb_2.think = raptor_bomb_burst;
- bomb_1.nextthink = bomb_2.nextthink = time;
- bomb_1.cnt = bomb_2.cnt = time + raptor_bomblet_wavefirst;
- bomb_1.wait = bomb_2.wait = raptor_bomblet_waves;
-
- bomb_1.avelocity = bomb_2.avelocity = '0 0 180';
- bomb_1.owner = bomb_2.owner = self;
- bomb_1.enemy = bomb_2.enemy = self.owner;
- bomb_1.angles = bomb_2.angles = self.angles;
+ bomb_1.movetype = bomb_2.movetype = MOVETYPE_BOUNCE;
+ bomb_1.velocity = bomb_2.velocity = self.velocity;
+ bomb_1.touch = bomb_2.touch = raptor_bomb_burst;
+ bomb_1.think = bomb_2.think = raptor_bomb_burst;
+ bomb_1.cnt = bomb_2.cnt = time + 10;
+
+ if(autocvar_g_vehicle_raptor_bomblet_alt)
+ bomb_1.nextthink = bomb_2.nextthink = time;
+ else
+ bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time;
+
+ bomb_1.owner = bomb_2.owner = self;
+ bomb_1.realowner = bomb_2.realowner = self.owner;
bomb_1.solid = bomb_2.solid = SOLID_BBOX;
+ bomb_1.gravity = bomb_2.gravity = 1;
- bomb_1 = spawn();
- bomb_1.owner = self;
- bomb_1.think = raptor_bombs_return;
- bomb_1.nextthink = time + raptor_bombs_refire;
+ PROJECTILE_MAKETRIGGER(bomb_1);
+ PROJECTILE_MAKETRIGGER(bomb_2);
+
+ CSQCProjectile(bomb_1, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
+ CSQCProjectile(bomb_2, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
}
-void raptor_animator_think()
+
+void raptor_fire_cannon(entity gun, string tagname)
{
- self.owner.frame += 1;
- if(self.owner.frame == self.cnt)
- remove(self);
- else
- self.nextthink = time + self.wait;
+ vehicles_projectile("raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav",
+ gettaginfo(gun, gettagindex(gun, tagname)), normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
+ autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force, 0,
+ DEATH_RAPTOR_CANNON, PROJECTILE_RAPTORCANNON, 0, TRUE, TRUE);
}
-void raptor_setanim(float start, float end, float length)
+void raptor_think()
{
- entity ani;
- if(self.tur_head.enemy)
- ani = self.tur_head.enemy;
- else
- ani = spawn();
-
- self.tur_head.enemy = ani;
- ani.owner = self;
- self.frame = start;
- ani.cnt = end;
- ani.wait = sys_frametime / length;
- ani.think = raptor_animator_think;
- ani.nextthink = time + ani.wait;
}
-void raptor_beam (vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float deathtype)
+void raptor_enter()
{
- vector hitloc, force, endpoint, dir;
- entity ent;
+ self.owner.PlayerPhysplug = raptor_takeoff;
+ self.movetype = MOVETYPE_BOUNCEMISSILE;
+ self.solid = SOLID_SLIDEBOX;
+ self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health);
+ self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield);
+ self.velocity_z = 1; // Nudge upwards to takeoff sequense can work.
+ self.tur_head.exteriormodeltoclient = self.owner;
- dir = normalize(end - start);
- force = dir * bforce;
+ self.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+ self.lip = time;
- // go a little bit into the wall because we need to hit this wall later
- end = end + dir;
+ if(self.owner.flagcarried)
+ setorigin(self.owner.flagcarried, '-20 0 96');
- // trace multiple times until we hit a wall, each obstacle will be made unsolid.
- // note down which entities were hit so we can damage them later
- while (1)
- {
- tracebox(start, smin, smax, end, FALSE, world);
-
- // if it is world we can't hurt it so stop now
- if (trace_ent == world || trace_fraction == 1)
- break;
-
- if (trace_ent.solid == SOLID_BSP)
- break;
-
- // make the entity non-solid so we can hit the next one
- trace_ent.railgunhit = TRUE;
- trace_ent.railgunhitloc = end;
- trace_ent.railgunhitsolidbackup = trace_ent.solid;
-
- // make the entity non-solid
- trace_ent.solid = SOLID_NOT;
- }
-
- endpoint = trace_endpos;
-
- // find all the entities the railgun hit and hurt them
- ent = findchainfloat(railgunhit, TRUE);
- while (ent)
- {
- // get the details we need to call the damage function
- ent.solid = ent.railgunhitsolidbackup;
- hitloc = ent.railgunhitloc;
- ent.railgunhitloc = '0 0 0';
- ent.railgunhitsolidbackup = SOLID_NOT;
- ent.railgunhit = FALSE;
-
- // apply the damage
- if (ent.takedamage)
- Damage (ent, self, self, f_dmg, deathtype, hitloc, force);
-
- ent = ent.chain;
- }
- trace_endpos = endpoint;
}
-
-void raptor_enter()
+void raptor_land()
{
- // Remove this when bots know how to use vehicles
- if (clienttype(other) != CLIENTTYPE_REAL)
- return;
-
- if(teams_matter)
- if(self.team)
- if(self.team != other.team)
- return;
-
- self.owner = other;
- self.switchweapon = other.switchweapon;
-
- self.event_damage = vehicle_stdproc_damage;
- self.colormap = self.owner.colormap;
- self.vehicle_hudmodel.viewmodelforclient = self.owner;
- self.nextthink = 0;
- self.owner.angles = self.angles;
- self.owner.takedamage = DAMAGE_NO;
- self.owner.solid = SOLID_NOT;
- self.owner.movetype = MOVETYPE_NOCLIP;
- self.owner.alpha = -1;
- self.owner.PlayerPhysplug = raptor_takeoff;
- self.owner.vehicle = self;
- self.owner.event_damage = SUB_Null;
- self.owner.hud = HUD_RAPTOR;
- self.owner.vehicle_health = self.vehicle_health / raptor_health_max;
- self.owner.vehicle_shield = self.vehicle_shield / raptor_shield_max;
- self.owner.view_ofs = '0 0 1';
- self.owner.vehicle_ammo1 = self.vehicle_ammo1;
- self.owner.vehicle_ammo2 = self.vehicle_ammo2;
- self.owner.vehicle_reload1 = self.vehicle_reload1;
- self.owner.vehicle_reload2 = self.vehicle_reload2;
-
- other.flags &~= FL_ONGROUND;
- self.flags &~= FL_ONGROUND;
- self.frame = 0;
- raptor_setanim(0, 25, 1);
+ float hgt;
+
+ hgt = raptor_altitude(512);
+ self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime);
+ self.angles_x *= 0.95;
+ self.angles_z *= 0.95;
- self.team = self.owner.team;
- self.flags -= FL_NOTARGET;
+ if(hgt < 128)
+ if(self.frame != 0)
+ self.frame = max(self.frame - 0.25, 0);
- self.velocity = '0 0 1';
+ self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000);
+ self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
- setorigin(other,self.origin + '0 0 32');
- other.velocity = self.velocity;
-
- other.flags &~= FL_ONGROUND;
- msg_entity = other;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity( MSG_ONE, self.vehicle_viewport);
+ if(hgt < 16)
+ {
+ self.movetype = MOVETYPE_TOSS;
+ self.think = raptor_think;
+ }
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, self.angles_x * -1); // tilt
- WriteAngle(MSG_ONE, self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
+ self.nextthink = time;
}
void raptor_exit(float eject)
{
- self.colormap = 1024;
- self.flags = FL_NOTARGET;
-
- if not (self.owner)
- return;
-
- msg_entity = self.owner;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity( MSG_ONE, self.owner);
-
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, 0); // tilt
- WriteAngle(MSG_ONE, self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
+ vector spot;
+ self.tur_head.exteriormodeltoclient = world;
- if (self.deadflag == DEAD_NO)
+ if(self.deadflag == DEAD_NO)
{
- //self.think = racer_exitthink;
- self.nextthink = time;
+ self.think = raptor_land;
+ self.nextthink = time;
}
- self.owner.takedamage = DAMAGE_AIM;
- self.owner.solid = SOLID_SLIDEBOX;
- self.owner.movetype = MOVETYPE_WALK;
-
- setsize(self.owner,PL_MIN,PL_MAX);
-
- self.owner.effects &~= EF_NODRAW;
- self.owner.alpha = 1;
- self.owner.PlayerPhysplug = SUB_Null;
- self.owner.vehicle = world;
- self.owner.view_ofs = PL_VIEW_OFS;
- self.owner.event_damage = PlayerDamage;
- self.owner.hud = HUD_NORMAL;
- //self.exteriormodeltoclient = self;
-
- self.vehicle_hudmodel.viewmodelforclient = self;
+ if not (self.owner)
+ return;
+ makevectors(self.angles);
if(eject)
{
- makevectors(self.angles);
- setorigin(self.owner,self.origin + v_forward * 100);
+ spot = self.origin + v_forward * 100 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
}
else
{
- self.owner.velocity = (v_forward) * -150;
- setorigin(self.owner,self.origin - v_forward * 128);
+ spot = self.origin - v_forward * 200 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
}
-
+
self.owner = world;
-
- if (self.deadflag != DEAD_NO)
- {
- entity ret;
- ret = spawn();
- ret.enemy = self;
- ret.think = raptor_return;
- ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
- }
}
-
-float raptor_pplug()
+float raptor_takeoff()
{
- entity player, vhic;
- float ftmp, ftmp2, energy_used;
- vector df;
-
-
- if(autocvar_g_vehicle_raptor_reload)
- {
- raptor_loadsettings();
- cvar_set("g_vehicle_raptor_reload","0");
- }
-
+ entity player, raptor;
+
player = self;
- vhic = self.vehicle;
- self = vhic;
-
- if(player.BUTTON_USE)
+ raptor = self.vehicle;
+ self = raptor;
+ if(self.sound_nexttime < time)
+ {
+ self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ }
+
+ // Takeoff sequense
+ if(raptor.frame < 25)
{
- self = vhic;
- raptor_exit(0);
- self = player;
- return 0;
- }
+ raptor.frame += 0.25;
+ raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
+ self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000);
+ self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
+ player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
- if(vhic.deadflag != DEAD_NO)
- {
- self = player;
- player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
- return 1;
+ setorigin(player, raptor.origin + '0 0 32');
}
+ else
+ player.PlayerPhysplug = raptor_frame;
+
+ if(self.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
- vhic.angles_x *= -1;
- // Rotate Body
- ftmp = raptor_turnspeed * sys_frametime;
+ if(self.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
- ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp);
+ if(self.vehicle_flags & VHF_ENERGYREGEN)
+ vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
- // Roll
- //ftmp = bound(-90,shortangle_f(player.v_angle_z + ((vhic.angles_y - ftmp2) * raptor_turnroll), vhic.angles_z),90);
- //ftmp = safeangle(vhic.angles_z + ftmp);
- //vhic.angles_z = ftmp;
- // Turn
- vhic.angles_y = anglemods(vhic.angles_y + ftmp);
+ raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+ player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
- // Pitch Body
- ftmp = raptor_pitchspeed * sys_frametime;
+ VEHICLE_UPDATE_PLAYER(health, raptor);
+ VEHICLE_UPDATE_PLAYER(energy, raptor);
+ if(self.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(shield, raptor);
- ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp);
+ player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
+ self = player;
+ return 1;
+}
- vhic.angles_x = bound(-60,anglemods(vhic.angles_x + ftmp),60);
- vhic.angles_x *= -1;
+float raptor_frame()
+{
+ entity player, raptor;
+ float ftmp, ftmp2;
+ vector df;
+
+ if(intermission_running)
+ return 1;
- if(raptor_movestyle == 1)
+ player = self;
+ raptor = self.vehicle;
+ self = raptor;
+ vehicles_painframe();
+ /*
+ ftmp = vlen(self.velocity);
+ if(ftmp > autocvar_g_vehicle_raptor_speed_forward)
+ ftmp = 1;
+ else
+ ftmp = ftmp / autocvar_g_vehicle_raptor_speed_forward;
+ */
+
+ if(self.sound_nexttime < time)
+ {
+ self.sound_nexttime = time + 7.955812;
+ //sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/raptor_fly.wav", 1 - ftmp, ATTN_NORM );
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", 1, ATTN_NORM);
+ self.wait = ftmp;
+ }
+ /*
+ else if(fabs(ftmp - self.wait) > 0.2)
{
- ftmp = vhic.angles_z;
- vhic.angles_z = 0;
- ftmp2 = vhic.angles_x;
- vhic.angles_x = 0;
- fixedmakevectors(vhic.angles);
- vhic.angles_z = ftmp;
- vhic.angles_x = ftmp2;
+ sound (self.tur_head, CH_TRIGGER_SINGLE, "", 1 - ftmp, ATTN_NORM );
+ sound (self, CH_TRIGGER_SINGLE, "", ftmp, ATTN_NORM);
+ self.wait = ftmp;
+ }
+ */
+
+ if(raptor.deadflag != DEAD_NO)
+ {
+ self = player;
+ player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+ return 1;
}
+ crosshair_trace(player);
+
+ vector vang;
+ vang = raptor.angles;
+ df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+ vang_x *= -1;
+ df_x *= -1;
+ if(df_x > 180) df_x -= 360;
+ if(df_x < -180) df_x += 360;
+ if(df_y > 180) df_y -= 360;
+ if(df_y < -180) df_y += 360;
+
+ ftmp = shortangle_f(player.v_angle_y - vang_y, vang_y);
+ if(ftmp > 180) ftmp -= 360; if(ftmp < -180) ftmp += 360;
+ raptor.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + raptor.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed);
+
+ // Pitch
+ ftmp = 0;
+ if(player.movement_x > 0 && vang_x < autocvar_g_vehicle_raptor_pitchlimit) ftmp = 5;
+ else if(player.movement_x < 0 && vang_x > -autocvar_g_vehicle_raptor_pitchlimit) ftmp = -20;
+
+ df_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x , autocvar_g_vehicle_raptor_pitchlimit);
+ ftmp = vang_x - bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x + ftmp, autocvar_g_vehicle_raptor_pitchlimit);
+ raptor.avelocity_x = bound(-autocvar_g_vehicle_raptor_pitchspeed, ftmp + raptor.avelocity_x * 0.9, autocvar_g_vehicle_raptor_pitchspeed);
+
+ raptor.angles_x = anglemods(raptor.angles_x);
+ raptor.angles_y = anglemods(raptor.angles_y);
+ raptor.angles_z = anglemods(raptor.angles_z);
+
+ if(autocvar_g_vehicle_raptor_movestyle == 1)
+ makevectors('0 1 0' * raptor.angles_y);
else
- fixedmakevectors(vhic.angles);
+ makevectors(player.v_angle);
- df = vhic.velocity * -1;
+ df = raptor.velocity * -autocvar_g_vehicle_raptor_friction;
if(player.movement_x != 0)
{
if(player.movement_x > 0)
- df += v_forward * raptor_speed_forward;
+ df += v_forward * autocvar_g_vehicle_raptor_speed_forward;
else if(player.movement_x < 0)
- df -= v_forward * raptor_speed_forward;
+ df -= v_forward * autocvar_g_vehicle_raptor_speed_forward;
}
if(player.movement_y != 0)
{
if(player.movement_y < 0)
- df -= v_right * raptor_speed_strafe;
+ df -= v_right * autocvar_g_vehicle_raptor_speed_strafe;
else if(player.movement_y > 0)
- df += v_right * raptor_speed_strafe;
+ df += v_right * autocvar_g_vehicle_raptor_speed_strafe;
- vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30);
+ raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
}
else
{
- vhic.angles_z *= 0.95;
- if(vhic.angles_z >= -1 && vhic.angles_z <= -1)
- vhic.angles_z = 0;
+ raptor.angles_z *= 0.95;
+ if(raptor.angles_z >= -1 && raptor.angles_z <= -1)
+ raptor.angles_z = 0;
}
if(player.BUTTON_CROUCH)
- df -= v_up * raptor_speed_down;
+ df -= v_up * autocvar_g_vehicle_raptor_speed_down;
else if (player.BUTTON_JUMP)
- df += v_up * raptor_speed_up;
- //else
- //df_z = vhic.velocity_z * -1;
-
- vhic.velocity += df * frametime;
- player.velocity = player.movement = vhic.velocity;
- setorigin(player,vhic.origin + '0 0 32');
+ df += v_up * autocvar_g_vehicle_raptor_speed_up;
- // Aim the gunz
- /*
- vector target_angle, move_angle, org1, org2, targ;
+ raptor.velocity += df * frametime;
+ player.velocity = player.movement = raptor.velocity;
+ setorigin(player, raptor.origin + '0 0 32');
- makevectors(player.v_angle);
-
- //targ = (vhic.origin + player.view_ofs) + v_forward * MAX_SHOT_DISTANCE;
- targ = player.cursor_trace_endpos;
-
- org1 = gettaginfo(vhic.gun1,gettagindex(vhic.gun1, "fire1"));
- org2 = gettaginfo(vhic.gun2,gettagindex(vhic.gun2, "fire1"));
+ vector vf, ad;
+ // Target lock & predict
+ if(autocvar_g_vehicle_raptor_cannon_locktarget)
+ {
- traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic);
- targ = trace_endpos;
+ vehicles_locktarget((1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime,
+ (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
+ autocvar_g_vehicle_raptor_cannon_locked_time);
- // Find the direction
- target_angle = vectoangles(normalize(targ - org1)); // And make a angle
+ if(self.lock_target != world)
+ if(autocvar_g_vehicle_raptor_cannon_predicttarget)
+ if(self.lock_strength == 1)
+ {
+ float i, distance, impact_time;
+
+ vf = real_origin(raptor.lock_target);
+ ad = vf;
+ for(i = 0; i < 4; ++i)
+ {
+ distance = vlen(ad - raptor.origin);
+ impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
+ ad = vf + raptor.lock_target.velocity * impact_time;
+ }
+ trace_endpos = ad;
+ }
- // Find the diffrence between where we currently aim and where we want to aim
- move_angle = target_angle - (vhic.angles + vhic.gun1.angles);
- move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun1.angles));
- vhic.gun1.angles_x = bound(-10, move_angle_x + vhic.gun1.angles_x, 10);
- vhic.gun1.angles_y = bound(-15, move_angle_y + vhic.gun1.angles_y, 15);
+ if(self.lock_target)
+ {
+ if(raptor.lock_strength == 1)
+ UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '1 0 0', 1);
+ else if(self.lock_strength > 0.5)
+ UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 1 0', 1);
+ else if(self.lock_strength < 0.5)
+ UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1);
+ }
+ }
- // Find the direction
- target_angle = vectoangles(normalize(targ - org2)); // And make a angle
+ // Aim the gunz
+ ftmp2 = autocvar_g_vehicle_raptor_cannon_turnspeed * frametime;
+ ftmp = -ftmp2;
+
+ // Gun1
+ df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1"));
+ //ad = df;
+ //vf = v_forward;
+ df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle
+ df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun1.angles;
+ df = shortangle_vxy(df, raptor.gun1.angles);
+
+ // Bind to aimspeed
+ df_x = bound(ftmp, df_x, ftmp2);
+ df_y = bound(ftmp, df_y, ftmp2);
+ // Bind to limts
+ raptor.gun1.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun1.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+ raptor.gun1.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit, df_y + raptor.gun1.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
+
+ // Gun2
+ df = gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1"));
+ //ad += df;
+ //vf += v_forward;
+ df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle
+ df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun2.angles;
+ df = shortangle_vxy(df, raptor.gun2.angles);
+
+ // Bind to aimspeed
+ df_x = bound(ftmp, df_x, ftmp2);
+ df_y = bound(ftmp, df_y, ftmp2);
+ // Bind to limts
+ raptor.gun2.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+ raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit, df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
- move_angle = target_angle - (vhic.angles + vhic.gun2.angles);
- move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun2.angles));
- vhic.gun2.angles_x = bound(-15,move_angle_x + vhic.gun2.angles_x,15);
- vhic.gun2.angles_y = bound(-20,move_angle_y + vhic.gun2.angles_y,20);
- */
+ /*
+ ad = ad * 0.5;
+ v_forward = vf * 0.5;
+ traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor);
+ UpdateAuxiliaryXhair(player, trace_endpos, '0 1 0', 0);
+ */
+
if(player.BUTTON_ATCK)
- if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime))
+ if(raptor.attack_finished_single <= time)
+ if(raptor.vehicle_energy > autocvar_g_vehicle_raptor_cannon_cost)
{
- vector start;
- self = player;
-
- start = gettaginfo(vhic.gun1, gettagindex(vhic.gun1, "fire1"));
- traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
- te_lightning1(vhic.gun1, start, trace_endpos);
- raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
-
- start = gettaginfo(vhic.gun2, gettagindex(vhic.gun2, "fire1"));
- traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
- te_lightning1(vhic.gun2, start, trace_endpos);
- raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
- self = vhic;
-
- vhic.vehicle_energy -= raptor_beam_aps * sys_frametime;
- vhic.cnt = time + 1;
+ raptor.misc_bulletcounter += 1;
+ raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire;
+ if(raptor.misc_bulletcounter <= 2)
+ raptor_fire_cannon(self.gun1, "fire1");
+ else if(raptor.misc_bulletcounter == 3)
+ raptor_fire_cannon(self.gun2, "fire1");
+ else
+ {
+ raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire * 2;
+ raptor_fire_cannon(self.gun2, "fire1");
+ raptor.misc_bulletcounter = 0;
+ }
+ raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
+ self.cnt = time;
}
- if(vhic.cnt < time)
- vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max);
+ if(self.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
+
+ if(self.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
- player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max;
+ if(self.vehicle_flags & VHF_ENERGYREGEN)
+ vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
+ if(time > raptor.delay)
if(player.BUTTON_ATCK2)
- if(time > vhic.delay)
{
raptor_bombdrop();
- vhic.delay = time + raptor_bombs_refire;
+ raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+ raptor.lip = time;
}
- player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
- vehicle_stdproc_shiledregen(raptor_shield_max, frametime);
- vehicle_stdproc_healthregen(raptor_health_max, frametime);
-
- self = player;
-
- return 1;
-}
-
-float raptor_takeoff()
-{
- entity player, vhic;
+ raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+ player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
- if(self.vehicle.frame < 25)
- return 1;
-
- player = self;
- vhic = self.vehicle;
- self = vhic;
-
- if(raptor_altitude(512) <= 256)
- {
- vhic.velocity_z = min(vhic.velocity_z * 1.5, 256);
- }
- else
- {
- player.PlayerPhysplug = raptor_pplug;
- }
-
- player.BUTTON_CROUCH = player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
- self = player;
+ VEHICLE_UPDATE_PLAYER(health, raptor);
+ VEHICLE_UPDATE_PLAYER(energy, raptor);
+ if(self.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(shield, raptor);
+ player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
return 1;
}
-float raptor_land()
+void raptor_blowup()
{
- return 0;
-}
+ self.deadflag = DEAD_DEAD;
+ self.vehicle_exit(VHEF_NORMAL);
+ RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
-void raptor_return()
-{
- pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
- self.enemy.think = raptor_spawn;
- self.enemy.nextthink = time;
- remove(self);
-}
+ self.alpha = -1;
+ self.movetype = MOVETYPE_NONE;
+ self.effects = EF_NODRAW;
+ self.colormod = '0 0 0';
+ self.avelocity = '0 0 0';
+ self.velocity = '0 0 0';
-void raptor_think()
-{
+ setorigin(self, self.pos1);
+ self.touch = SUB_Null;
+ self.nextthink = 0;
}
-void raptor_touch()
+void raptor_diethink()
{
- if(self.owner)
+ if(random() < 0.1)
{
- if(vlen(self.velocity) == 0)
- return;
-
- if(other.classname != "player")
- return;
-
- return;
+ sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
}
-
- if(other.classname != "player")
- return;
-
- if(other.deadflag != DEAD_NO)
- return;
-
- if(other.vehicle != world)
- return;
-
- raptor_enter();
+ self.nextthink = time + 0.1;
}
void raptor_die()
{
self.health = 0;
self.event_damage = SUB_Null;
- self.iscreature = FALSE;
- self.solid = SOLID_NOT;
+ self.solid = SOLID_CORPSE;
self.takedamage = DAMAGE_NO;
- //self.touch = racer_dietouch;
self.deadflag = DEAD_DYING;
self.movetype = MOVETYPE_BOUNCE;
- self.wait = time;
+ self.think = raptor_diethink;
+ self.nextthink = time;
+
+ pointparticles(particleeffectnum("explosion_medium"), findbetterlocation (self.origin, 16), '0 0 0', 1);
- pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+ self.velocity_z += 600;
- self.velocity += '0 0 128';
-
- if(random() < 0.5)
- self.avelocity_z = 45;
- else
- self.avelocity_z = -45;
+ self.avelocity = '0 0.5 1' * (random() * 400);
+ self.avelocity -= '0 0.5 1' * (random() * 400);
self.colormod = '-0.5 -0.5 -0.5';
-
- self.think = raptor_spawn;
- self.nextthink = time + 5;
+ self.touch = raptor_blowup;
}
void raptor_spawn()
{
- self.flags = FL_NOTARGET;
- self.effects = 0;
-
- self.vehicle_health = raptor_health_max;
- self.vehicle_shield = raptor_shield_max;
-
- self.event_damage = vehicle_stdproc_damage;
- self.touch = raptor_touch;
-
- self.iscreature = TRUE;
- self.movetype = MOVETYPE_FLY;
- self.solid = SOLID_SLIDEBOX;
- self.takedamage = DAMAGE_AIM;
-
- self.alpha = 1;
- self.colormap = 1024;
- self.deadflag = DEAD_NO;
- self.bot_attack = TRUE;
-
- self.colormod = '1 1 1';
- self.avelocity = '0 0 0';
- self.velocity = '0 0 0';
-
+ self.frame = 0;
+ self.vehicle_health = autocvar_g_vehicle_raptor_health;
+ self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+ self.movetype = MOVETYPE_TOSS;
+ self.solid = SOLID_SLIDEBOX;
self.vehicle_energy = 1;
- self.vehicle_hudmodel.viewmodelforclient = self;
- setorigin(self, self.pos1);
- self.angles = self.pos2;
+ self.bomb1.gun1.avelocity_y = 90;
+ self.bomb1.gun2.avelocity_y = -90;
- setsize(self,RAPTOR_MIN ,RAPTOR_MAX );
- pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+ setsize(self, RAPTOR_MIN, RAPTOR_MAX );
self.delay = time;
}
-float raptor_customizeentityforclient()
+// If we dont do this ever now and then, the raptors rotors
+// stop working, presumably due to angle overflow. cute.
+void raptor_rotor_anglefix()
{
- if(self.deadflag == DEAD_DEAD)
- return FALSE;
-
- /*
- if(other == self.owner)
- self.alpha = -1;
- else
- self.alpha = 1;
- */
-
- return TRUE;
+ self.gun1.angles_y = anglemods(self.gun1.angles_y);
+ self.gun2.angles_y = anglemods(self.gun2.angles_y);
+ self.nextthink = time + 15;
}
void raptor_dinit()
{
+ entity spinner;
+ vector ofs;
+
+ if not (vehicle_initialize(
+ "Raptor",
+ "models/vehicles/raptor.dpm",
+ "",
+ "models/vehicles/raptor_cockpit.dpm",
+ "", "tag_hud", "tag_camera",
+ HUD_RAPTOR,
+ RAPTOR_MIN, RAPTOR_MAX,
+ FALSE,
+ raptor_spawn, autocvar_g_vehicle_raptor_respawntime,
+ raptor_frame,
+ raptor_enter, raptor_exit,
+ raptor_die, raptor_think,
+ FALSE))
+ {
+ remove(self);
+ return;
+ }
- if (self.netname == "")
- self.netname = "Raptor";
-
- setorigin(self, self.origin);
+ //FIXME: Camera is in a bad place in HUD model.
+ //setorigin(self.vehicle_viewport, '25 0 5');
self.frame = 0;
- setmodel(self,"models/vehicles/raptor.dpm");
-
self.bomb1 = spawn();
self.bomb2 = spawn();
+ self.gun1 = spawn();
+ self.gun2 = spawn();
- setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm");
- setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm");
+ setmodel(self.bomb1,"models/vehicles/clusterbomb_folded.md3");
+ setmodel(self.bomb2,"models/vehicles/clusterbomb_folded.md3");
+ setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
+ setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
+ setmodel(self.tur_head, "models/vehicles/raptor_body.dpm");
setattachment(self.bomb1, self,"bombmount_left");
setattachment(self.bomb2, self,"bombmount_right");
+ setattachment(self.tur_head, self,"root");
- if not (self.vehicle_hudmodel)
- {
- self.vehicle_hudmodel = spawn();
- setmodel(self.vehicle_hudmodel, "models/vehicles/raptor_cockpit.dpm");
- //setattachment(self.vehicle_hudmodel, self, "tag_viewport");
- setattachment(self.vehicle_hudmodel, self, "tag_hud");
- }
+ // FIXME Guns mounts to angled bones
+ self.bomb1.angles = self.angles;
+ self.angles = '0 0 0';
+ // This messes up gun-aim, so work arround it.
+ //setattachment(self.gun1, self, "gunmount_left");
+ ofs = gettaginfo(self, gettagindex(self, "gunmount_left"));
+ ofs -= self.origin;
+ setattachment(self.gun1, self, "");
+ setorigin(self.gun1, ofs);
- if not (self.vehicle_viewport)
- {
- self.vehicle_viewport = spawn();
- setmodel (self.vehicle_viewport, "null");
- setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera");
- }
+ //setattachment(self.gun2, self, "gunmount_right");
+ ofs = gettaginfo(self, gettagindex(self, "gunmount_right"));
+ ofs -= self.origin;
+ setattachment(self.gun2, self, "");
+ setorigin(self.gun2, ofs);
- if not (self.gun1)
- {
- self.gun1 = spawn();
- setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
- setattachment(self.gun1, self, "gunmount_left");
- }
+ self.angles = self.bomb1.angles;
+ self.bomb1.angles = '0 0 0';
- if not (self.gun2)
- {
- self.gun2 = spawn();
- setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
- setattachment(self.gun2, self, "gunmount_right");
- }
-
- self.tur_head = spawn();
- self.pos1 = self.origin;
- self.pos2 = self.angles;
-
- self.vehicle_hudmodel.viewmodelforclient = self;
- self.customizeentityforclient = raptor_customizeentityforclient;
-
- self.vehicle_die = raptor_die;
- self.vehicle_exit = raptor_exit;
-
-
- entity spinner;
spinner = spawn();
spinner.owner = self;
setmodel(spinner,"models/vehicles/spinner.dpm");
setattachment(spinner, self, "engine_left");
spinner.movetype = MOVETYPE_NOCLIP;
spinner.avelocity = '0 90 0';
+ self.bomb1.gun1 = spinner;
spinner = spawn();
spinner.owner = self;
setattachment(spinner, self, "engine_right");
spinner.movetype = MOVETYPE_NOCLIP;
spinner.avelocity = '0 -90 0';
+ self.bomb1.gun2 = spinner;
- addstat(STAT_HUD, AS_INT, hud);
- addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
- addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
- addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
-
- addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
- addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
+ // Sigh.
+ self.bomb1.think = raptor_rotor_anglefix;
+ self.bomb1.nextthink = time;
- addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
- addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
- raptor_spawn();
+ self.mass = 1 ;
}
void spawnfunc_vehicle_raptor()
{
- self.cvar_basename = "g_vehicle_raptor";
- raptor_loadsettings();
+ vehicles_configcheck("vehicle_raptor.cfg", autocvar_g_vehicle_raptor_health);
- self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN;
+ self.vehicle_flags |= VHF_DMGSHAKE;
+ self.vehicle_flags |= VHF_DMGROLL;
+
+ if(autocvar_g_vehicle_raptor_shield)
+ self.vehicle_flags |= VHF_HASSHIELD;
- traceline(self.origin, self.origin - '0 0 2048', MOVE_WORLDONLY, self);
- if(trace_startsolid)
- {
- dprint("WARNING: vehicle_raptor placed in solid\n");
- traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
- if(trace_startsolid || trace_fraction == 1.0)
- {
- dprint("ERROR: vehicle_raptor placed in more then 512 units into solid\n");
- remove(self);
- return;
- }
- }
+ if(autocvar_g_vehicle_raptor_shield_regen)
+ self.vehicle_flags |= VHF_SHIELDREGEN;
- if(trace_fraction != 1.0)
- setorigin(self,trace_endpos + '0 0 8');
- else
- dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+ if(autocvar_g_vehicle_raptor_health_regen)
+ self.vehicle_flags |= VHF_HEALTHREGEN;
+
+ if(autocvar_g_vehicle_raptor_energy_regen)
+ self.vehicle_flags |= VHF_ENERGYREGEN;
precache_model ("models/vehicles/raptor.dpm");
precache_model ("models/vehicles/raptor_gun.dpm");
precache_model ("models/vehicles/spinner.dpm");
precache_model ("models/vehicles/raptor_cockpit.dpm");
- precache_model ("models/vehicles/raptor_bomb.dpm");
-
-
+ //precache_model ("models/vehicles/clusterbomb.md3");
+ precache_model ("models/vehicles/clusterbomb_folded.md3");
+ precache_model ("models/vehicles/raptor_body.dpm");
+
+ precache_sound ("vehicles/raptor_fly.wav");
+ precache_sound ("vehicles/raptor_speed.wav");
+
self.think = raptor_dinit;
- self.nextthink = time + 1;
-}
-
-
-void spawnfunc_vehicle_raptor2()
-{
- entity iqm,dpm,md3;
-
- precache_model ("models/vehicles/test.iqm");
- precache_model ("models/vehicles/test.dpm");
- precache_model ("models/vehicles/test.md3");
-
- iqm = spawn();
- dpm = spawn();
- md3 = spawn();
- iqm.scale = md3.scale = dpm.scale = 10;
-
- //setmodel(iqm,"models/vehicles/test.iqm");
- //setmodel(dpm,"models/vehicles/test.dpm");
- setmodel(md3,"models/vehicles/test.md3");
-
- setorigin(iqm, self.origin + '0 0 16');
- setorigin(dpm, self.origin + '0 20 32');
- setorigin(iqm, self.origin + '0 40 48');
+
+ if(g_assault)
+ self.nextthink = time + 0.5;
+ else
+ self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_raptor_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
}
+#endif // SVQC
-const vector spiderbot_MIN = '-75 -75 0';
-const vector spiderbot_MAX = '75 75 100';
-
-#define spiderbot_spawnpnt wkr_spawn
+const vector SPIDERBOT_MIN = '-75 -75 10';
+const vector SPIDERBOT_MAX = '75 75 125';
+
+#ifdef SVQC
+float autocvar_g_vehicle_spiderbot_respawntime;
+
+float autocvar_g_vehicle_spiderbot_speed_stop;
+float autocvar_g_vehicle_spiderbot_speed_strafe;
+float autocvar_g_vehicle_spiderbot_speed_walk;
+float autocvar_g_vehicle_spiderbot_turnspeed;
+float autocvar_g_vehicle_spiderbot_movement_inertia;
+
+float autocvar_g_vehicle_spiderbot_springlength;
+float autocvar_g_vehicle_spiderbot_springup;
+float autocvar_g_vehicle_spiderbot_springblend;
+
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
+float autocvar_g_vehicle_spiderbot_head_pitchspeed;
+float autocvar_g_vehicle_spiderbot_head_turnlimit;
+float autocvar_g_vehicle_spiderbot_head_turnspeed;
+
+//float autocvar_g_vehicle_spiderbot_energy;
+//float autocvar_g_vehicle_spiderbot_energy_regen;
+//float autocvar_g_vehicle_spiderbot_energy_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_health;
+float autocvar_g_vehicle_spiderbot_health_regen;
+float autocvar_g_vehicle_spiderbot_health_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_shield;
+float autocvar_g_vehicle_spiderbot_shield_regen;
+float autocvar_g_vehicle_spiderbot_shield_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_minigun_damage;
+float autocvar_g_vehicle_spiderbot_minigun_refire;
+float autocvar_g_vehicle_spiderbot_minigun_spread;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_max;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_rocket_damage;
+float autocvar_g_vehicle_spiderbot_rocket_force;
+float autocvar_g_vehicle_spiderbot_rocket_radius;
+float autocvar_g_vehicle_spiderbot_rocket_speed;
+float autocvar_g_vehicle_spiderbot_rocket_refire;
+float autocvar_g_vehicle_spiderbot_rocket_reload;
+float autocvar_g_vehicle_spiderbot_rocket_health;
+float autocvar_g_vehicle_spiderbot_rocket_noise;
+float autocvar_g_vehicle_spiderbot_rocket_turnrate;
+float autocvar_g_vehicle_spiderbot_rocket_lifetime;
void spiderbot_exit(float eject);
void spiderbot_enter();
-
-void spiderbot_rocket_explode()
-{
- vector org2;
-
- if(self.event_damage != SUB_Null)
- {
- self.event_damage = SUB_Null;
- self.think = spiderbot_rocket_explode;
- self.nextthink = time;
- return;
- }
-
- 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);
- w_deathtypestring = "dident escape the rocket barrage";
-
- if(!self.owner)
- self.owner = self.realowner;
-
- RadiusDamage (self, self.owner,
- autocvar_g_vehicle_spiderbot_rocket_damage,
- autocvar_g_vehicle_spiderbot_rocket_edgedamage,
- autocvar_g_vehicle_spiderbot_rocket_radius, world,
- autocvar_g_vehicle_spiderbot_rocket_force, DEATH_SBROCKET, world);
-
- remove (self);
-}
-
-void spiderbot_rocket_touch()
-{
- if(self.owner)
- {
- if(other == self.owner.vehicle)
- return;
-
- if(other == self.owner.vehicle.tur_head)
- return;
- }
-
- PROJECTILE_TOUCH;
- spiderbot_rocket_explode();
-}
+void spiderbot_spawn();
void spiderbot_rocket_unguided()
{
- vector newdir,olddir;
+ vector newdir, olddir;
self.nextthink = time;
-
olddir = normalize(self.velocity);
newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
UpdateCSQCProjectile(self);
- if (self.owner.deadflag != DEAD_NO || self.cnt < time)
- spiderbot_rocket_explode();
-
+ if (self.owner.deadflag != DEAD_NO || self.cnt < time || vlen(self.pos1 - self.origin) < 16)
+ self.use();
}
void spiderbot_rocket_guided()
self.nextthink = time;
- if not (self.owner.vehicle)
+ if not (self.realowner.vehicle)
self.think = spiderbot_rocket_unguided;
- crosshair_trace(self.owner);
+ crosshair_trace(self.realowner);
olddir = normalize(self.velocity);
newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
UpdateCSQCProjectile(self);
if (self.owner.deadflag != DEAD_NO || self.cnt < time)
- spiderbot_rocket_explode();
-}
-
-void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
- self.health -= damage;
- self.velocity += force;
- if(self.health < 1)
- spiderbot_rocket_explode();
+ self.use();
}
void spiderbot_guide_release()
{
entity rkt;
- rkt = findchainentity(owner,self.owner);
+ rkt = findchainentity(realowner, self.owner);
if not (rkt)
return;
crosshair_trace(self.owner);
-
while(rkt)
{
if(rkt.think == spiderbot_rocket_guided)
rkt.pos1 = trace_endpos;
rkt.think = spiderbot_rocket_unguided;
}
-
rkt = rkt.chain;
}
}
void spiderbot_rocket_do()
{
+
+ vector v;
entity rocket;
if (self.owner.BUTTON_ATCK2)
return;
}
-
self.wait = 1;
}
else
if not (self.owner.BUTTON_ATCK2)
return;
- sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
- rocket = spawn ();
- setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
- setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
- te_explosion (rocket.origin);
-
crosshair_trace(self.owner);
- rocket.classname = "spiderbot_rocket";
- rocket.bot_dodge = TRUE;
- rocket.bot_dodgerating = autocvar_g_vehicle_spiderbot_rocket_damage;
- rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
- rocket.health = autocvar_g_vehicle_spiderbot_rocket_health;
- rocket.takedamage = DAMAGE_AIM;
- rocket.event_damage = spiderbot_rocket_damage;
- rocket.owner = self.owner;
- rocket.nextthink = time;
- rocket.movetype = MOVETYPE_FLYMISSILE;
- rocket.velocity = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed;
- rocket.angles = vectoangles(rocket.velocity);
- rocket.think = spiderbot_rocket_guided;
- rocket.touch = spiderbot_rocket_touch;
- rocket.flags = FL_PROJECTILE;
- rocket.solid = SOLID_TRIGGER;
- rocket.pos1 = trace_endpos;
-
- CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+ v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
+ rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
+ v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
+ autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
+ DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE);
+
+ rocket.cnt = time + 15;
+ rocket.classname = "spiderbot_rocket";
+ rocket.pos1 = trace_endpos;
+ rocket.think = spiderbot_rocket_guided;
+ rocket.nextthink = time;
+ rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
self.tur_head.frame += 1;
if (self.tur_head.frame == 9)
self.gun2.cnt = time + self.attack_finished_single;
}
-/*
-void spiderbot_minigun_fire_Flash_Go() {
- if (self.frame > 10)
- {
- self.alpha = -1;
- setmodel(self,"");
- return;
- }
-
- self.frame = self.frame + 2;
- self.alpha = self.alpha - 0.2;
- self.scale -= 0.01;
- self.nextthink = time + 0.02;
-}
-*/
-
-void spiderbot_minigun_fire(entity gun, float trail)
-{
- vector v;
-
- v = gettaginfo(gun,gettagindex(gun,"barrels"));
- v_forward = normalize(v_forward);
-
- sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-
- fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
- autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
-
-
- UziFlash();
- setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
- if(trail)
- trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
-}
-
-void spiderbot_miniguns_do()
-{
- float ftmp;
-
- if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
- {
-
- ftmp = 1 / autocvar_g_vehicle_spiderbot_minigun_cooldown * sys_frametime;
- self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
- if(self.owner.vehicle_reload1 <= 0)
- self.vehicle_reload1 = 0;
-
- return ;
- }
-
- if (self.owner.BUTTON_ATCK)
- {
-
- // Animate miniguns
- self.gun1.angles_z += (1440 * sys_frametime);
- self.gun2.angles_z -= (1440 * sys_frametime);
- if(self.gun1.angles_z >= 360)
- {
- self.gun1.angles_z = 0;
- self.gun2.angles_z = 360;
- }
-
- if (self.tur_head.attack_finished_single < time)
- {
- // Fire bullets, alternating trails left<->right
- self = self.owner;
- if(self.misc_bulletcounter == 1)
- {
- spiderbot_minigun_fire(self.vehicle.gun1, 0);
- spiderbot_minigun_fire(self.vehicle.gun2, 1);
- self.misc_bulletcounter = 0;
- }
- else
- {
- spiderbot_minigun_fire(self.vehicle.gun1, 1);
- spiderbot_minigun_fire(self.vehicle.gun2, 0);
- self.misc_bulletcounter += 1;
- }
-
- self = self.vehicle;
-
- ftmp = autocvar_g_vehicle_spiderbot_minigun_refire / autocvar_g_vehicle_spiderbot_minigun_heat;
- self.owner.vehicle_reload1 += ftmp;
-
- if(self.owner.vehicle_reload1 >= 1)
- {
- self.vehicle_reload1 = 1;
- self.owner.vehicle_reload1 = 1;
- self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_cooldown + time;
- }
- else
- self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_refire + time;
- }
-
- self = self.owner;
- return;
- }
-}
-
-float spiderbot_pplug()
+float spiderbot_frame()
{
vector ad;
- entity player,spider;
+ entity player, spider;
float ftmp;
- if not (self.owner)
- {
- }
-
+ if(intermission_running)
+ return 1;
+
player = self;
spider = self.vehicle;
+ self = spider;
- player.BUTTON_ZOOM = 0;
- player.BUTTON_CROUCH = 0;
- player.switchweapon = 0;
-
- if(player.BUTTON_USE)
- {
- self = spider;
- spiderbot_exit(0);
- self = player;
- return 0;
- }
+ vehicles_painframe();
+
+ player.BUTTON_ZOOM = 0;
+ player.BUTTON_CROUCH = 0;
+ player.switchweapon = 0;
crosshair_trace(player);
- ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+ //UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload2) + ('0 1 0' * (1 - player.vehicle_reload2)), 2);
- fixedmakevectors(spider.angles);
- if(ad_x > 180) ad_x -= 360;
+ //player.v_angle_x *= -1;
+ //gettaginfo(spider.tur_head, 0);
+ //ad = player.v_angle - vectoangles2(v_forward, v_up);
+ //ad = player.v_angle - (spider.tur_head.angles + spider.angles);
+ //player.v_angle_x *= -1;
+ ad = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(spider.angles), AnglesTransform_FromVAngles(player.v_angle))) - spider.tur_head.angles;
+
+ if(ad_x > 180) ad_x -= 360;
if(ad_x < -180) ad_x += 360;
- if(ad_y > 180) ad_y -= 360;
+ if(ad_y > 180) ad_y -= 360;
if(ad_y < -180) ad_y += 360;
-
+
// Rotate head
ftmp = autocvar_g_vehicle_spiderbot_head_turnspeed * sys_frametime;
ad_y = bound(-ftmp, ad_y, ftmp);
spider.tur_head.angles_y = bound(autocvar_g_vehicle_spiderbot_head_turnlimit * -1, spider.tur_head.angles_y + ad_y, autocvar_g_vehicle_spiderbot_head_turnlimit);
// Pitch head
+#if 0 // Enable to pich by cross-trace (more precise in chase, but less predictable)
+ ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+ if(ad_x > 180) ad_x -= 360;
+ if(ad_x < -180) ad_x += 360;
+#endif
ftmp = autocvar_g_vehicle_spiderbot_head_pitchspeed * sys_frametime;
- ad_x = bound(-ftmp, ad_x, ftmp);
+ ad_x = bound(ftmp * -1, ad_x, ftmp);
spider.tur_head.angles_x = bound(autocvar_g_vehicle_spiderbot_head_pitchlimit_down, spider.tur_head.angles_x + ad_x, autocvar_g_vehicle_spiderbot_head_pitchlimit_up);
// Turn Body
ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime;
ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
- self = spider;
+ makevectors(spider.angles + '-2 0 0' * spider.angles_x);
+
+/*
+ vector ofs;
+ ofs = self.origin + v_up * 128;
+ te_lightning1(world, ofs, ofs + v_up * 32);
+ te_lightning1(world, ofs, ofs + v_right * 128);
+ te_lightning1(world, ofs, ofs + v_forward * 256);
+*/
+
+ movelib_groundalign4point(autocvar_g_vehicle_spiderbot_springlength, autocvar_g_vehicle_spiderbot_springup, autocvar_g_vehicle_spiderbot_springblend);
+
if(spider.flags & FL_ONGROUND)
{
- if(player.BUTTON_JUMP && self.tur_head.wait < time)
+ if(spider.frame == 4 && self.tur_head.wait != 0)
{
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_land.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ spider.frame = 5;
+ }
+
+ if(player.BUTTON_JUMP && self.tur_head.wait < time)
+ {
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_jump.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ //dprint("spiderbot_jump:", ftos(soundlength("vehicles/spiderbot_jump.wav")), "\n");
+ self.delay = 0;
+
self.tur_head.wait = time + 2;
player.BUTTON_JUMP = 0;
spider.velocity = v_forward * 700 + v_up * 600;
{
if(vlen(player.movement) == 0)
{
+ if(self.sound_nexttime < time || self.delay != 3)
+ {
+ self.delay = 3;
+ self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_idle.wav");
+ //dprint("spiderbot_idle:", ftos(soundlength("vehicles/spiderbot_idle.wav")), "\n");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ }
movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
spider.frame = 5;
}
}
player.movement_y = 0;
movelib_move_simple(normalize(v_forward * player.movement_x),autocvar_g_vehicle_spiderbot_speed_walk,autocvar_g_vehicle_spiderbot_movement_inertia);
+
+ if(self.sound_nexttime < time || self.delay != 1)
+ {
+ self.delay = 1;
+ self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_walk.wav");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_walk.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n");
+ }
}
else if(player.movement_y != 0)
{
spider.frame = 3;
}
movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia);
+ if(self.sound_nexttime < time || self.delay != 2)
+ {
+ self.delay = 2;
+ self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_strafe.wav");
+ sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_strafe.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+ //dprint("spiderbot_strafe:", ftos(soundlength("vehicles/spiderbot_strafe.wav")), "\n");
+ }
}
+ }
+ }
+ }
+
+ self.angles_x = bound(-45, self.angles_x, 45);
+ self.angles_z = bound(-45, self.angles_z, 45);
+
+ if(player.BUTTON_ATCK)
+ {
+ spider.cnt = time;
+ if(spider.vehicle_ammo1 >= autocvar_g_vehicle_spiderbot_minigun_ammo_cost && spider.tur_head.attack_finished_single <= time)
+ {
+ entity gun;
+ vector v;
+ spider.misc_bulletcounter += 1;
+
+ self = player;
+
+ mod(spider.misc_bulletcounter, 2) ? gun = spider.gun1 : gun = spider.gun2;
+ v = gettaginfo(gun, gettagindex(gun, "barrels"));
+ v_forward = normalize(v_forward);
+ v += v_forward * 50;
+ fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+ autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+ sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+ trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
+ pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1);
+
+ self = spider;
+
+ spider.vehicle_ammo1 -= autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+ spider.tur_head.attack_finished_single = time + autocvar_g_vehicle_spiderbot_minigun_refire;
+ player.vehicle_ammo1 = (spider.vehicle_ammo1 / autocvar_g_vehicle_spiderbot_minigun_ammo_max) * 100;
+ spider.gun1.angles_z += 45;
+ spider.gun2.angles_z -= 45;
+ if(spider.gun1.angles_z >= 360)
+ {
+ spider.gun1.angles_z = 0;
+ spider.gun2.angles_z = 0;
}
}
- movelib_groundalign4point(300,100,0.25);
}
+ else
+ vehicles_regen(cnt, vehicle_ammo1, autocvar_g_vehicle_spiderbot_minigun_ammo_max,
+ autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause,
+ autocvar_g_vehicle_spiderbot_minigun_ammo_regen, frametime);
+
- spiderbot_miniguns_do();
spiderbot_rocket_do();
- vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
- vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
+
+ if(self.vehicle_flags & VHF_SHIELDREGEN)
+ vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_spiderbot_shield, autocvar_g_vehicle_spiderbot_shield_regen_pause, autocvar_g_vehicle_spiderbot_shield_regen, frametime);
+
+ if(self.vehicle_flags & VHF_HEALTHREGEN)
+ vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_spiderbot_health, autocvar_g_vehicle_spiderbot_health_regen_pause, autocvar_g_vehicle_spiderbot_health_regen, frametime);
player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
player.vehicle_ammo2 = spider.tur_head.frame;
if(spider.gun2.cnt <= time)
- player.vehicle_reload2 = 1;
+ player.vehicle_reload2 = 100;
else
- player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
+ player.vehicle_reload2 = 100 - ((spider.gun2.cnt - time) / spider.attack_finished_single) * 100;
- setorigin(player,spider.origin + '0 0 64');
+ setorigin(player, spider.origin + '0 0 1' * SPIDERBOT_MAX_z);
player.velocity = spider.velocity;
- self = player;
+ VEHICLE_UPDATE_PLAYER(health, spiderbot);
+
+ if(self.vehicle_flags & VHF_HASSHIELD)
+ VEHICLE_UPDATE_PLAYER(shield, spiderbot);
+
+#if 1 // 0 to enable per-gun impact aux crosshairs
+ // Avarage gun impact point's -> aux cross
+ vector vf;
+ ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+ vf = v_forward;
+ ad += gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+ vf += v_forward;
+ ad = ad * 0.5;
+ v_forward = vf * 0.5;
+ traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+ UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+#else
+ ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+ traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+ UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+ ad = gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+ traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+ UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 1);
+#endif
+ self = player;
return 1;
}
void spiderbot_enter()
{
- // Remove this when bots know how to use the spiderbot
- if (clienttype(other) != CLIENTTYPE_REAL)
- return;
-
- self.colormod = self.tur_head.colormod = '0 0 0';
-
- if(teams_matter)
- if(self.team)
- if(self.team != other.team)
- return;
+ self.movetype = MOVETYPE_WALK;
- self.owner = other;
- self.switchweapon = other.switchweapon;
-
- self.event_damage = vehicle_stdproc_damage ;
- self.colormap = self.owner.colormap;
- self.tur_head.colormap = self.owner.colormap;
- self.vehicle_hudmodel.viewmodelforclient = self.owner;
- self.nextthink = 0;
- self.owner.angles = self.angles;
- self.owner.takedamage = DAMAGE_NO;
- self.owner.solid = SOLID_NOT;
- self.owner.movetype = MOVETYPE_NOCLIP;
- self.owner.alpha = -1;
- self.owner.PlayerPhysplug = spiderbot_pplug;
- self.owner.vehicle = self;
- self.owner.event_damage = SUB_Null;
- self.owner.hud = HUD_SPIDERBOT;
self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health);
self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield);
- self.owner.view_ofs = '0 0 0';
- self.owner.vehicle_ammo1 = self.vehicle_ammo1;
- self.owner.vehicle_ammo2 = self.vehicle_ammo2;
- self.owner.vehicle_reload1 = self.vehicle_reload1;
- self.owner.vehicle_reload2 = self.vehicle_reload2;
-
- //if(other.flags & FL_ONGROUND)
- other.flags &~= FL_ONGROUND;
- //if(self.flags & FL_ONGROUND)
- self.flags &~= FL_ONGROUND;
-
- self.team = self.owner.team;
- self.flags -= FL_NOTARGET;
-
- if(clienttype(other) == CLIENTTYPE_REAL)
+ if(self.owner.flagcarried)
{
- msg_entity = other;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity(MSG_ONE, self.vehicle_viewport);
-
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt
- WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
+ setattachment(self.owner.flagcarried, self.tur_head, "");
+ setorigin(self.owner.flagcarried, '-20 0 120');
}
}
void spiderbot_exit(float eject)
{
entity e;
- self.frame = 5;
-
- self.flags |= FL_NOTARGET;
-
+ vector spot;
+
e = findchain(classname,"spiderbot_rocket");
while(e)
{
e = e.chain;
}
- self.owner.switchweapon = self.switchweapon;
-
- self.velocity = '0 0 0';
- if(clienttype(self.owner) == CLIENTTYPE_REAL)
- {
- msg_entity = self.owner;
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity( MSG_ONE, self.owner);
-
- WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
- WriteAngle(MSG_ONE, 0); // tilt
- WriteAngle(MSG_ONE, self.angles_y); // yaw
- WriteAngle(MSG_ONE, 0); // roll
- }
-
- self.think = spiderbot_think;
- self.nextthink = time;
- self.owner.takedamage = DAMAGE_AIM;
- self.owner.solid = SOLID_SLIDEBOX;
- self.owner.movetype = MOVETYPE_WALK;
-
- setsize(self.owner,PL_MIN,PL_MAX);
-
- self.owner.alpha = 1;
- self.owner.PlayerPhysplug = SUB_Null;
- self.owner.vehicle = world;
- self.owner.view_ofs = PL_VIEW_OFS;
- self.owner.hud = HUD_NORMAL;
- self.owner.event_damage = PlayerDamage;
-
- self.colormap = 1024;
- self.tur_head.colormap = 1024;
-
- if not (teams_matter)
- self.team = 0;
- else
- {
- self.team = self.spiderbot_spawnpnt.team ;
- if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
- if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
- self.tur_head.colormod = self.colormod;
- }
-
- self.vehicle_hudmodel.viewmodelforclient = self;
- self.tur_head.nodrawtoclient = self;
-
- setattachment(self.owner,world,"");
+ self.velocity = '0 0 0';
+ self.think = spiderbot_think;
+ self.nextthink = time;
+ self.frame = 5;
+ self.movetype = MOVETYPE_WALK;
+
+ if not (self.owner)
+ return;
makevectors(self.angles);
if(eject)
{
- setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');
+ spot = self.origin + v_forward * 100 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
}
else
- setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');
-
+ {
+ spot = self.origin - v_forward * 200 + '0 0 64';
+ spot = vehicles_findgoodexit(spot);
+ setorigin(self.owner , spot);
+ }
+
self.owner = world;
}
-float spiderbot_crushable(entity e)
+void spiderbot_spawn()
{
- if(e.classname == "corpse")
- return 1;
-
- if(e.classname == "player")
- return 1;
-
- if(e.classname == "monster_zombie")
- return 1;
-
- return 0;
+ self.frame = 5;
+ self.tur_head.frame = 1;
+ self.think = spiderbot_think;
+ self.nextthink = time;
+ self.vehicle_health = autocvar_g_vehicle_spiderbot_health;
+ self.vehicle_shield = autocvar_g_vehicle_spiderbot_shield;
+ self.movetype = MOVETYPE_WALK;
+ self.solid = SOLID_SLIDEBOX;
+ self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
+ self.tur_head.angles = '0 0 0';
+
+ setorigin(self, self.pos1 + '0 0 128');
+ self.angles = self.pos2;
}
-void spiderbot_touch()
+void spiderbot_headfade()
{
- if(self.owner)
- {
- if(vlen(self.velocity) == 0)
- return;
-
- if not (spiderbot_crushable(other))
- return;
-
- //todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
+ self.think = spiderbot_headfade;
+ self.nextthink = self.fade_time;
+ self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
- Damage(other,self,self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force );
- return;
+ if(self.cnt < time || self.alpha < 0.1)
+ {
+ if(self.alpha > 0.1)
+ {
+ sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("explosion_big"), self.origin + '0 0 100', '0 0 0', 1);
+ }
+ remove(self);
}
-
- if(other.classname != "player")
- return;
-
- if(other.deadflag != DEAD_NO)
- return;
-
- if(other.vehicle != world)
- return;
-
- spiderbot_enter();
-}
-
-float spiderbot_customizeentityforclient()
-{
- if(self.deadflag == DEAD_DEAD)
- return FALSE;
-
- return TRUE;
-}
-
-void spiderbot_spawn()
-{
- self.frame = 5;
- self.think = spiderbot_think;
- self.nextthink = time;
-
- setsize(self,spiderbot_MIN,spiderbot_MAX);
-
- self.owner = world;
- self.velocity = '0 0 0';
- self.vehicle_health = CCVAR("_health");
- self.vehicle_shield = CCVAR("_shield");
- self.event_damage = vehicle_stdproc_damage;
- self.iscreature = TRUE;
- self.movetype = MOVETYPE_WALK;
- self.solid = SOLID_SLIDEBOX;
- self.takedamage = DAMAGE_AIM;
- self.touch = spiderbot_touch;
- self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
- self.tur_head.angles = '0 0 0';
- self.colormap = 1024;
- self.tur_head.colormap = 1024;
- self.deadflag = DEAD_NO;
- self.bot_attack = TRUE;
- self.flags |= FL_NOTARGET;
- self.vehicle_hudmodel.viewmodelforclient = self;
- self.tur_head.frame = 1;
-
- setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
- self.angles = self.spiderbot_spawnpnt.angles;
-
- if (self.team == COLOR_TEAM1)
- self.colormod = '1.4 0.8 0.8';
- else if (self.team == COLOR_TEAM2)
- self.colormod = '0.8 0.8 1.4';
- else
- self.colormod = '0 0 0';
-
- self.tur_head.colormod = self.colormod;
-
-
- pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
}
void spiderbot_blowup()
{
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
- pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+ if(self.cnt > time)
+ {
+ if(random() < 0.1)
+ {
+ sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
+ }
+ self.nextthink = time + 0.1;
+ return;
+ }
+
+ entity h, g1, g2, b;
+ b = spawn();
+ h = spawn();
+ g1 = spawn();
+ g2 = spawn();
+
+ setmodel(b, "models/vehicles/spiderbot.dpm");
+ setmodel(h, "models/vehicles/spiderbot_top.dpm");
+ setmodel(g1, "models/vehicles/spiderbot_barrels.dpm");
+ setmodel(g2, "models/vehicles/spiderbot_barrels.dpm");
+
+ setorigin(b, self.origin);
+ b.frame = 11;
+ b.angles = self.angles;
+ setsize(b, self.mins, self.maxs);
+
+ setorigin(h, gettaginfo(self, gettagindex(self, "tag_head")));
+ h.movetype = MOVETYPE_BOUNCE;
+ h.solid = SOLID_BBOX;
+ h.velocity = v_up * (500 + random() * 500) + randomvec() * 128;
+ h.modelflags = MF_ROCKET;
+ h.effects = EF_FLAME | EF_LOWPRECISION;
+ h.avelocity = randomvec() * 360;
+
+ h.alpha = 1;
+ h.cnt = time + (3.5 * random());
+ h.fade_rate = 1 / min(autocvar_g_vehicle_spiderbot_respawntime, 10);
+ h.fade_time = time;
+ h.think = spiderbot_headfade;
+ h.nextthink = time;
+
+ setorigin(g1, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint01")));
+ g1.movetype = MOVETYPE_TOSS;
+ g1.solid = SOLID_CORPSE;
+ g1.velocity = v_forward * 700 + (randomvec() * 32);
+ g1.avelocity = randomvec() * 180;
+
+ setorigin(g2, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint02")));
+ g2.movetype = MOVETYPE_TOSS;
+ g2.solid = SOLID_CORPSE;
+ g2.velocity = v_forward * 700 + (randomvec() * 32);
+ g2.avelocity = randomvec() * 180;
+
+ h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2';
+
+ SUB_SetFade(b, time + 5, min(autocvar_g_vehicle_spiderbot_respawntime, 1));
+ //SUB_SetFade(h, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+ SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+ SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
- self.nextthink = time + autocvar_g_vehicle_spiderbot_respawntime;
- self.think = spiderbot_spawn;
self.movetype = MOVETYPE_NONE;
-
- setorigin(self, self.tur_aimpos);
+ self.deadflag = DEAD_DEAD;
+ self.solid = SOLID_NOT;
+ self.tur_head.effects &~= EF_FLAME;
+ self.vehicle_hudmodel.viewmodelforclient = self;
}
void spiderbot_die()
{
-
- self.health = 0;
- self.event_damage = SUB_Null;
- self.iscreature = FALSE;
- self.solid = SOLID_NOT;
- self.takedamage = DAMAGE_NO;
- self.touch = SUB_Null;
- self.nextthink = time + random() * 2;
- self.think = spiderbot_blowup;
- self.deadflag = DEAD_DEAD;
- self.vehicle_hudmodel.viewmodelforclient = self;
- self.frame = 0;
- self.tur_head.frame = 1;
-
+ self.health = 0;
+ self.event_damage = SUB_Null;
+ self.takedamage = DAMAGE_NO;
+ self.touch = SUB_Null;
+ self.cnt = 3.4 + time + random() * 2;
+ self.think = spiderbot_blowup;
+ self.nextthink = time;
+ self.deadflag = DEAD_DYING;
+ self.frame = 5;
+ self.tur_head.effects |= EF_FLAME;
+ self.colormod = self.tur_head.colormod = '-1 -1 -1';
+ self.frame = 10;
+ self.movetype = MOVETYPE_TOSS;
}
void vewhicle_spiderbot_dinit()
{
+ if not (vehicle_initialize(
+ "Spiderbot",
+ "models/vehicles/spiderbot.dpm",
+ "models/vehicles/spiderbot_top.dpm",
+ "models/vehicles/spiderbot_cockpit.dpm",
+ "tag_head", "tag_hud", "",
+ HUD_SPIDERBOT,
+ SPIDERBOT_MIN, SPIDERBOT_MAX,
+ FALSE,
+ spiderbot_spawn, autocvar_g_vehicle_spiderbot_respawntime,
+ spiderbot_frame,
+ spiderbot_enter, spiderbot_exit,
+ spiderbot_die, spiderbot_think,
+ FALSE))
+ {
+ remove(self);
+ return;
+ }
- self.spiderbot_spawnpnt = spawn();
- self.spiderbot_spawnpnt.angles = self.angles;
-
- setorigin(self,self.origin);
- tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
- setorigin(self.spiderbot_spawnpnt,trace_endpos);
-
- if(self.team && !teams_matter)
- self.team = 0;
- else
- self.spiderbot_spawnpnt.team = self.team;
-
- addstat(STAT_HUD, AS_INT, hud);
- addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
- addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
- addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
- addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
- addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
- addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
- addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
- if (self.netname == "")
- self.netname = "spiderbot";
- self.tur_head = spawn();
self.gun1 = spawn();
self.gun2 = spawn();
- self.vehicle_viewport = spawn();
- self.vehicle_hudmodel = spawn();
- self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT;
- self.cvar_basename = "g_vehicle_spiderbot";
- self.gravity = 2;
- setmodel(self, "models/vehicles/spiderbot.dpm");
- setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm");
setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
- setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm");
- setmodel(self.vehicle_viewport, "null");
-
- setattachment(self.tur_head, self, "tag_head");
- setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
- setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
- self.tur_head.owner = self;
- self.customizeentityforclient = spiderbot_customizeentityforclient;
-
- self.tur_aimpos = self.origin;
-
- spiderbot_spawn();
-
- self.vehicle_die = spiderbot_die;
- self.vehicle_exit = spiderbot_exit;
+ self.gravity = 2;
+ self.mass = 5000;
}
void spawnfunc_vehicle_spiderbot()
{
+ self.vehicle_flags |= VHF_DMGSHAKE;
+ //self.vehicle_flags |= VHF_DMGROLL;
+ //self.vehicle_flags |= VHF_DMGHEADROLL;
+
precache_model ( "models/vhshield.md3");
precache_model ( "models/vehicles/spiderbot.dpm");
precache_model ( "models/vehicles/spiderbot_top.dpm");
precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
precache_model ( "models/uziflash.md3");
- precache_sound ( "weapons/rocket_impact.wav" );
-
- //self.team = -1;
+ precache_sound ( "weapons/uzi_fire.wav" );
+ precache_sound ( "weapons/rocket_impact.wav");
+
+ precache_sound ( "vehicles/spiderbot_die.wav");
+ precache_sound ( "vehicles/spiderbot_idle.wav");
+ precache_sound ( "vehicles/spiderbot_jump.wav");
+ precache_sound ( "vehicles/spiderbot_strafe.wav");
+ precache_sound ( "vehicles/spiderbot_walk.wav");
+ precache_sound ( "vehicles/spiderbot_land.wav");
+
+ vehicles_configcheck("vehicle_spiderbot.cfg", autocvar_g_vehicle_spiderbot_health);
+ if(autocvar_g_vehicle_spiderbot_shield)
+ self.vehicle_flags |= VHF_HASSHIELD;
+
+ if(autocvar_g_vehicle_spiderbot_shield_regen)
+ self.vehicle_flags |= VHF_SHIELDREGEN;
+
+ if(autocvar_g_vehicle_spiderbot_health_regen)
+ self.vehicle_flags |= VHF_HEALTHREGEN;
+
self.think = vewhicle_spiderbot_dinit;
- self.nextthink = time + 0.5;
+
+ if(g_assault)
+ self.nextthink = time + 0.5;
+ else
+ self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_spiderbot_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
}
+#endif // SVQC
-void vehicle_stdproc_enter()
+float autocvar_g_vehicles_crush_dmg;
+float autocvar_g_vehicles_crush_force;
+float autocvar_g_vehicles_delayspawn;
+float autocvar_g_vehicles_delayspawn_jitter;
+float autocvar_g_vehicles_allow_flagcarry;
+
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+void vehicles_return();
+void vehicles_enter();
+void vehicles_touch();
+void vehicles_reset_colors();
+void vehicles_clearrturn();
+void vehicles_setreturn();
+
+
+/** AuxiliaryXhair*
+ Send additional points of interest to be drawn, to vehicle owner
+**/
+float MAX_AXH = 4;
+.entity AuxiliaryXhair[MAX_AXH];
+
+float SendAuxiliaryXhair(entity to, float sf)
+{
+
+ WriteByte(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
+
+ WriteByte(MSG_ENTITY, self.cnt);
+
+ WriteCoord(MSG_ENTITY, self.origin_x);
+ WriteCoord(MSG_ENTITY, self.origin_y);
+ WriteCoord(MSG_ENTITY, self.origin_z);
+
+ WriteByte(MSG_ENTITY, rint(self.colormod_x * 255));
+ WriteByte(MSG_ENTITY, rint(self.colormod_y * 255));
+ WriteByte(MSG_ENTITY, rint(self.colormod_z * 255));
+
+ return TRUE;
+}
+
+void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
+{
+ entity axh;
+
+ axh_id = bound(0, axh_id, MAX_AXH);
+ axh = own.AuxiliaryXhair[axh_id];
+
+ if(axh == world || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+ {
+ axh = spawn();
+ axh.cnt = axh_id;
+ axh.drawonlytoclient = own;
+ axh.owner = own;
+ Net_LinkEntity(axh, FALSE, 0, SendAuxiliaryXhair);
+ }
+
+ setorigin(axh, loc);
+ axh.colormod = clr;
+ axh.SendFlags = 0x01;
+ own.AuxiliaryXhair[axh_id] = axh;
+}
+
+/*
+// SVC_TEMPENTITY based, horrible with even 50 ping. hm.
+// WriteByte(MSG_ONE, SVC_TEMPENTITY) uses reliable messagess, never use for thinsg that need continous updates.
+void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id)
{
+ msg_entity = own;
+
+ WriteByte(MSG_ONE, SVC_TEMPENTITY);
+ WriteByte(MSG_ONE, TE_CSQC_AUXILIARYXHAIR);
+
+ WriteByte(MSG_ONE, axh_id);
+
+ WriteCoord(MSG_ONE, loc_x);
+ WriteCoord(MSG_ONE, loc_y);
+ WriteCoord(MSG_ONE, loc_z);
+
+ WriteByte(MSG_ONE, rint(clr_x * 255));
+ WriteByte(MSG_ONE, rint(clr_y * 255));
+ WriteByte(MSG_ONE, rint(clr_z * 255));
+
}
+*/
+// End AuxiliaryXhair
-void vehicle_stdproc_exit(float eject)
+/**
+ Notifies the client that he enterd a vehicle, and sends
+ realavent data.
+
+ only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT)
+**/
+void CSQCVehicleSetup(entity own, float vehicle_id)
{
+ msg_entity = own;
+
+ WriteByte(MSG_ONE, SVC_TEMPENTITY);
+ WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP);
+ WriteByte(MSG_ONE, vehicle_id);
}
-void vehicle_stdproc_shiledregen(float rmax, float dt)
+/** vehicles_locktarget
+
+ Generic target locking.
+
+ Figure out if what target is "locked" (if any), for missile tracking as such.
+
+ after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean
+ you have a locked in target.
+
+ Exspects a crosshair_trace() or equivalent to be
+ dont before calling.
+
+**/
+.entity lock_target;
+.float lock_strength;
+.float lock_time;
+.float lock_soundtime;
+void vehicles_locktarget(float incr, float decr, float _lock_time)
{
- if(self.vehicle_shield < rmax)
- if(self.dmg_time + CCVAR("_shield_regen_dmgpause") < time)
+ if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
{
- self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") * dt, rmax);
+ self.lock_target = world;
+ self.lock_strength = 0;
+ self.lock_time = 0;
+ }
- if(self.owner)
- self.owner.vehicle_shield = self.vehicle_shield / rmax;
+ if(self.lock_time > time)
+ {
+ if(self.lock_target)
+ if(self.lock_soundtime < time)
+ {
+ self.lock_soundtime = time + 0.5;
+ play2(self.owner, "vehicles/locked.wav");
+ }
+
+ return;
}
+
+ if(trace_ent != world)
+ {
+ if(teamplay && trace_ent.team == self.team)
+ trace_ent = world;
+
+ if(trace_ent.deadflag != DEAD_NO)
+ trace_ent = world;
+
+ if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+ trace_ent = world;
+ }
+
+ if(self.lock_target == world && trace_ent != world)
+ self.lock_target = trace_ent;
+
+ if(self.lock_target && trace_ent == self.lock_target)
+ {
+ if(self.lock_strength != 1 && self.lock_strength + incr >= 1)
+ {
+ play2(self.owner, "vehicles/lock.wav");
+ self.lock_soundtime = time + 0.8;
+ }
+ else if (self.lock_strength != 1 && self.lock_soundtime < time)
+ {
+ play2(self.owner, "vehicles/locking.wav");
+ self.lock_soundtime = time + 0.3;
+ }
+
+ }
+
+ // Have a locking target
+ // Trace hit current target
+ if(trace_ent == self.lock_target && trace_ent != world)
+ {
+ self.lock_strength = min(self.lock_strength + incr, 1);
+ if(self.lock_strength == 1)
+ self.lock_time = time + _lock_time;
+ }
+ else
+ {
+ if(trace_ent)
+ self.lock_strength = max(self.lock_strength - decr * 2, 0);
+ else
+ self.lock_strength = max(self.lock_strength - decr, 0);
+
+ if(self.lock_strength == 0)
+ self.lock_target = world;
+ }
+}
+
+#define VEHICLE_UPDATE_PLAYER(fld,vhname) \
+self.owner.vehicle_##fld = (self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld) * 100
+
+#define vehicles_sweap_collision(orig,vel,dt,acm,mult) \
+traceline(orig, orig + vel * dt, MOVE_NORMAL, self); \
+if(trace_fraction != 1) \
+ acm += normalize(self.origin - trace_endpos) * (vlen(vel) * mult)
+
+// Hover movement support
+float force_fromtag_power;
+float force_fromtag_normpower;
+vector force_fromtag_origin;
+vector vehicles_force_fromtag_hover(string tag_name, float spring_length, float max_power)
+{
+ force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+ v_forward = normalize(v_forward) * -1;
+ traceline(force_fromtag_origin, force_fromtag_origin - (v_forward * spring_length), MOVE_NORMAL, self);
+
+ force_fromtag_power = (1 - trace_fraction) * max_power;
+ force_fromtag_normpower = force_fromtag_power / max_power;
+
+ return v_forward * force_fromtag_power;
}
-void vehicle_stdproc_healthregen(float rmax, float dt)
+// Experimental hovermode wich uses attraction/repulstion from surface insted of gravity/repulsion
+// Can possibly be use to move abt any surface (inclusing walls/celings)
+vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float max_power)
{
- if(self.dmg_time + CCVAR("_health_regen_dmgpause") < time)
- if(self.vehicle_health < rmax)
+ force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+ v_forward = normalize(v_forward) * -1;
+ traceline(force_fromtag_origin, force_fromtag_origin - (v_forward * spring_length), MOVE_NORMAL, self);
+
+ // TODO - this may NOT be compatible with wall/celing movement, unhardcode 0.25 (engine count multiplier)
+ if(trace_fraction == 1.0)
{
- self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") * dt, rmax);
+ force_fromtag_normpower = -0.25;
+ return '0 0 -200';
+ }
- if(self.owner)
- self.owner.vehicle_health = self.vehicle_health / rmax;
+ force_fromtag_power = ((1 - trace_fraction) - trace_fraction) * max_power;
+ force_fromtag_normpower = force_fromtag_power / max_power;
+
+ return v_forward * force_fromtag_power;
+}
+
+// Generic vehile projectile system
+void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+ // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
+ if(inflictor.owner == self.owner)
+ return;
+
+ self.health -= damage;
+ self.velocity += force;
+ if(self.health < 1)
+ {
+ self.takedamage = DAMAGE_NO;
+ self.event_damage = SUB_Null;
+ self.think = self.use;
+ self.nextthink = time;
+ }
+
+}
+
+void vehicles_projectile_explode()
+{
+ if(self.owner && other != world)
+ {
+ if(other == self.owner.vehicle)
+ return;
+
+ if(other == self.owner.vehicle.tur_head)
+ return;
+ }
+
+ PROJECTILE_TOUCH;
+
+ self.event_damage = SUB_Null;
+ RadiusDamage (self, self.realowner, self.shot_dmg, 0, self.shot_radius, self, self.shot_force, self.totalfrags, other);
+
+ remove (self);
+}
+
+entity vehicles_projectile(string _mzlfx, string _mzlsound,
+ vector _org, vector _vel,
+ float _dmg, float _radi, float _force, float _size,
+ float _deahtype, float _projtype, float _health,
+ float _cull, float _clianim)
+{
+ entity proj;
+
+ proj = spawn();
+
+ PROJECTILE_MAKETRIGGER(proj);
+ setorigin(proj, _org);
+
+ proj.shot_dmg = _dmg;
+ proj.shot_radius = _radi;
+ proj.shot_force = _force;
+ proj.totalfrags = _deahtype;
+ proj.solid = SOLID_BBOX;
+ proj.movetype = MOVETYPE_FLYMISSILE;
+ proj.flags = FL_PROJECTILE;
+ proj.bot_dodge = TRUE;
+ proj.bot_dodgerating = _dmg;
+ proj.velocity = _vel;
+ proj.touch = vehicles_projectile_explode;
+ proj.use = vehicles_projectile_explode;
+ proj.owner = self;
+ proj.realowner = self.owner;
+ proj.think = SUB_Remove;
+ proj.nextthink = time + 30;
+
+ if(_health)
+ {
+ proj.takedamage = DAMAGE_AIM;
+ proj.event_damage = vehicles_projectile_damage;
+ proj.health = _health;
+ }
+ else
+ proj.flags = FL_PROJECTILE | FL_NOTARGET;
+
+ if(_mzlsound)
+ sound (self, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTN_NORM);
+
+ if(_mzlfx)
+ pointparticles(particleeffectnum(_mzlfx), proj.origin, proj.velocity, 1);
+
+
+ setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
+
+ CSQCProjectile(proj, _clianim, _projtype, _cull);
+
+ return proj;
+}
+// End generic vehile projectile system
+
+/** vehicles_spawn
+ Exetuted for all vehicles on (re)spawn.
+ Sets defaults for newly spawned units.
+**/
+void vehicles_spawn()
+{
+ dprint("Spawning vehicle: ", self.netname, "\n");
+
+ // De-own & reset
+ self.vehicle_hudmodel.viewmodelforclient = self;
+
+ self.owner = world;
+ self.touch = vehicles_touch;
+ self.event_damage = vehicles_damage;
+ self.iscreature = TRUE;
+ self.movetype = MOVETYPE_WALK;
+ self.solid = SOLID_SLIDEBOX;
+ self.takedamage = DAMAGE_AIM;
+ self.deadflag = DEAD_NO;
+ self.bot_attack = TRUE;
+ self.flags = FL_NOTARGET;
+ self.avelocity = '0 0 0';
+ self.velocity = '0 0 0';
+
+ // Reset locking
+ self.lock_strength = 0;
+ self.lock_target = world;
+ self.misc_bulletcounter = 0;
+
+ // Return to spawn
+ self.angles = self.pos2;
+ setorigin(self, self.pos1 + '0 0 128');
+ // Show it
+ pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+
+ vehicles_reset_colors();
+ self.vehicle_spawn();
+}
+
+// Better way of determening whats crushable needed! (fl_crushable?)
+float vehicles_crushable(entity e)
+{
+ if(e.classname == "player")
+ return TRUE;
+
+ if(e.classname == "monster_zombie")
+ return TRUE;
+
+ return FALSE;
+}
+
+void vehicles_touch()
+{
+ // Vehicle currently in use
+ if(self.owner)
+ {
+ // Colided with world?
+ if(other == world)
+ {
+ }
+ else
+ {
+ if(other.vehicle_flags & VHF_ISVEHICLE)
+ {
+ //other.velocity += self.velocity * (self.mass / other.mass);
+ }
+ else if(vehicles_crushable(other))
+ {
+ if(vlen(self.velocity) != 0)
+ Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+ }
+ }
+ return;
+ }
+
+ if(other.classname != "player")
+ return;
+
+ if(other.deadflag != DEAD_NO)
+ return;
+
+ if(other.vehicle != world)
+ return;
+
+ // Remove this when bots know how to use vehicles.
+ if (clienttype(other) != CLIENTTYPE_REAL)
+ return;
+
+ vehicles_enter();
+}
+
+void vehicles_enter()
+{
+ // Remove this when bots know how to use vehicles
+ if (clienttype(other) != CLIENTTYPE_REAL)
+ return;
+
+ if(self.phase > time)
+ return;
+
+ if(teamplay)
+ if(self.team)
+ if(self.team != other.team)
+ return;
+
+ RemoveGrapplingHook(other);
+
+ self.vehicle_ammo1 = 0;
+ self.vehicle_ammo2 = 0;
+ self.vehicle_reload1 = 0;
+ self.vehicle_reload2 = 0;
+ self.vehicle_energy = 0;
+
+ self.owner = other;
+ self.switchweapon = other.switchweapon;
+
+ // .viewmodelforclient works better.
+ //self.vehicle_hudmodel.drawonlytoclient = self.owner;
+
+ self.vehicle_hudmodel.viewmodelforclient = self.owner;
+
+ self.event_damage = vehicles_damage;
+ self.nextthink = 0;
+ self.owner.angles = self.angles;
+ self.owner.takedamage = DAMAGE_NO;
+ self.owner.solid = SOLID_NOT;
+ self.owner.movetype = MOVETYPE_NOCLIP;
+ self.owner.alpha = -1;
+ self.owner.vehicle = self;
+ self.owner.event_damage = SUB_Null;
+ self.owner.view_ofs = '0 0 0';
+ self.colormap = self.owner.colormap;
+ if(self.tur_head)
+ self.tur_head.colormap = self.owner.colormap;
+
+ self.owner.hud = self.hud;
+ self.owner.PlayerPhysplug = self.PlayerPhysplug;
+
+ self.owner.vehicle_ammo1 = self.vehicle_ammo1;
+ self.owner.vehicle_ammo2 = self.vehicle_ammo2;
+ self.owner.vehicle_reload1 = self.vehicle_reload1;
+ self.owner.vehicle_reload2 = self.vehicle_reload2;
+
+ // Cant do this, hides attached objects too.
+ //self.exteriormodeltoclient = self.owner;
+ //self.tur_head.exteriormodeltoclient = self.owner;
+
+ other.flags &~= FL_ONGROUND;
+ self.flags &~= FL_ONGROUND;
+
+ self.team = self.owner.team;
+ self.flags -= FL_NOTARGET;
+
+ msg_entity = other;
+ WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+ WriteEntity(MSG_ONE, self.vehicle_viewport);
+
+ WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+ if(self.tur_head)
+ {
+ WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt
+ WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw
+ WriteAngle(MSG_ONE, 0); // roll
+ }
+ else
+ {
+ WriteAngle(MSG_ONE, self.angles_x * -1); // tilt
+ WriteAngle(MSG_ONE, self.angles_y); // yaw
+ WriteAngle(MSG_ONE, 0); // roll
+ }
+
+ vehicles_clearrturn();
+
+ CSQCVehicleSetup(self.owner, self.hud);
+
+ if(other.flagcarried)
+ {
+ if(!autocvar_g_vehicles_allow_flagcarry)
+ DropFlag(other.flagcarried, world, world);
+ else
+ {
+ other.flagcarried.scale = 1;
+ setattachment(other.flagcarried, self, "");
+ setorigin(other, '0 0 96');
+ }
}
+
+ self.vehicle_enter();
}
-void vehicle_stdproc_energyregen(float rmax, float dt)
+/** vehicles_findgoodexit
+ Locates a valid location for the player to exit the vehicle.
+ Will first try prefer_spot, then up 100 random spots arround the vehicle
+ wich are in direct line of sight and empty enougth to hold a players bbox
+**/
+vector vehicles_findgoodexit(vector prefer_spot)
{
- if(self.vehicle_energy < rmax)
+ //vector exitspot;
+ float mysize;
+
+ tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return prefer_spot;
+
+ mysize = vlen(self.maxs - self.mins);
+ float i;
+ vector v, v2;
+ v2 = 0.5 * (self.absmin + self.absmax);
+ for(i = 0; i < 100; ++i)
+ {
+ v = randomvec();
+ v_z = 0;
+ v = v2 + normalize(v) * mysize;
+ tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return v;
+ }
+
+ /*
+ exitspot = (self.origin + '0 0 48') + v_forward * mysize;
+ tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return exitspot;
+
+ exitspot = (self.origin + '0 0 48') - v_forward * mysize;
+ tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return exitspot;
+
+ exitspot = (self.origin + '0 0 48') + v_right * mysize;
+ tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return exitspot;
+
+ exitspot = (self.origin + '0 0 48') - v_right * mysize;
+ tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+ if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+ return exitspot;
+ */
+
+ return self.origin;
+}
+
+/** vehicles_exit
+ Standarrd vehicle release fucntion.
+ custom code goes in self.vehicle_exit
+**/
+void vehicles_exit(float eject)
+{
+ entity oldself;
+ if(self.flags & FL_CLIENT)
{
- self.vehicle_energy = min(self.vehicle_energy + CCVAR("_energy_regen") * dt, rmax);
+ oldself = self;
+ self = self.vehicle;
+ }
+
+ self.flags |= FL_NOTARGET;
+
+ if (self.owner)
+ {
+ msg_entity = self.owner;
+ WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+ WriteEntity( MSG_ONE, self.owner);
+
+ WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+ WriteAngle(MSG_ONE, 0); // pich
+ WriteAngle(MSG_ONE, self.angles_y); // yaw
+ WriteAngle(MSG_ONE, 0); // roll
+
+ setsize(self.owner, PL_MIN,PL_MAX);
+
+ self.owner.takedamage = DAMAGE_AIM;
+ self.owner.solid = SOLID_SLIDEBOX;
+ self.owner.movetype = MOVETYPE_WALK;
+ self.owner.effects &~= EF_NODRAW;
+ self.owner.alpha = 1;
+ self.owner.PlayerPhysplug = SUB_Null;
+ self.owner.vehicle = world;
+ self.owner.view_ofs = PL_VIEW_OFS;
+ self.owner.event_damage = PlayerDamage;
+ self.owner.hud = HUD_NORMAL;
+ self.owner.switchweapon = self.switchweapon;
+ //self.owner.BUTTON_USE = 0;
+ }
+
+ if(self.deadflag == DEAD_NO)
+ self.avelocity = '0 0 0';
+
+ self.vehicle_hudmodel.viewmodelforclient = self;
+ self.tur_head.nodrawtoclient = world;
+ vehicles_setreturn();
+
+ self.phase = time + 1;
+
+ if(!teamplay)
+ self.team = 0;
+ else
+ self.team = self.tur_head.team;
+
+ if(self.owner.flagcarried)
+ {
+ self.owner.flagcarried.scale = 0.6;
+ setattachment(self.owner.flagcarried, self.owner, "");
+ setorigin(self.owner.flagcarried, FLAG_CARRY_POS);
+ }
+
+ sound (self, CH_TRIGGER_SINGLE, "misc/null.wav", 1, ATTN_NORM);
+ self.vehicle_exit(eject);
+ self.owner = world;
+ vehicles_reset_colors();
+
+ if(oldself)
+ self = oldself;
+}
+
+
+void vehicles_regen(.float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time)
+{
+ if(self.regen_field < field_max)
+ if(self.timer + rpause < time)
+ {
+ self.regen_field = min(self.regen_field + regen * delta_time, field_max);
if(self.owner)
- self.owner.vehicle_energy = self.vehicle_energy / rmax;
+ self.owner.regen_field = (self.regen_field / field_max) * 100;
}
}
void shieldhit_think()
{
- self.alpha = self.alpha - 0.2;
+ self.alpha -= 0.1;
if (self.alpha <= 0)
{
- setmodel(self,"");
+ //setmodel(self, "");
self.alpha = -1;
}
else
}
}
-void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+void vehicles_painframe()
{
+//.float pain_finished; //Added by Supajoe
+
+ if(self.owner.vehicle_health <= 50)
+ if(self.pain_frame < time)
+ {
+ float _ftmp;
+ _ftmp = self.owner.vehicle_health / 50;
+ self.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp);
+ pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+
+ if(self.vehicle_flags & VHF_DMGSHAKE)
+ self.velocity += randomvec() * 30;
+
+ if(self.vehicle_flags & VHF_DMGROLL)
+ if(self.vehicle_flags & VHF_DMGHEADROLL)
+ self.tur_head.angles += randomvec();
+ else
+ self.angles += randomvec();
+
+ }
+}
- float ddmg_take;
-
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
self.dmg_time = time;
if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0))
{
-
-
- if (wasfreed(self.tur_head.enemy) || self.tur_head.enemy == world)
+ if (wasfreed(self.vehicle_shieldent) || self.vehicle_shieldent == world)
{
- self.tur_head.enemy = spawn();
- self.tur_head.enemy.effects = EF_LOWPRECISION;
- }
+ self.vehicle_shieldent = spawn();
+ self.vehicle_shieldent.effects = EF_LOWPRECISION;
- setmodel(self.tur_head.enemy, "models/vhshield.md3");
- setattachment(self.tur_head.enemy, self, "");
+ setmodel(self.vehicle_shieldent, "models/vhshield.md3");
+ setattachment(self.vehicle_shieldent, self, "");
+ setorigin(self.vehicle_shieldent, real_origin(self) - self.origin);
+ self.vehicle_shieldent.scale = 256 / vlen(self.maxs - self.mins);
+ self.vehicle_shieldent.think = shieldhit_think;
+ }
- self.tur_head.enemy.colormod = '1 1 1';
- self.tur_head.enemy.alpha = 0.45;
- self.tur_head.enemy.scale = (256 / vlen(self.maxs - self.mins));
- self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles;
- self.tur_head.enemy.think = shieldhit_think;
- self.tur_head.enemy.nextthink = time;
+ self.vehicle_shieldent.colormod = '1 1 1';
+ self.vehicle_shieldent.alpha = 0.45;
+ self.vehicle_shieldent.angles = vectoangles(normalize(hitloc - (self.origin + self.vehicle_shieldent.origin))) - self.angles;
+ self.vehicle_shieldent.nextthink = time;
self.vehicle_shield -= damage;
+
if(self.vehicle_shield < 0)
{
- self.tur_head.enemy.colormod = '10 0 -1';
- ddmg_take = fabs(self.vehicle_shield);
- self.vehicle_shield = 0;
- self.tur_head.enemy.alpha = 0.75;
- self.vehicle_health -= ddmg_take;
+ self.vehicle_health -= fabs(self.vehicle_shield);
+ self.vehicle_shieldent.colormod = '2 0 0';
+ self.vehicle_shield = 0;
+ self.vehicle_shieldent.alpha = 0.75;
+
+ if(sound_allowed(MSG_BROADCAST, attacker))
+ spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER
}
+ else
+ if(sound_allowed(MSG_BROADCAST, attacker))
+ spamsound (self, CH_PAIN, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER
+
}
else
- self.vehicle_health -= damage;
-
- if(self.owner)
{
- self.owner.vehicle_health = self.vehicle_health / CCVAR("_health");
-
- if(self.vehicle_flags & VHF_HASSHIELD)
- self.owner.vehicle_shield = self.vehicle_shield / cvar(strcat(self.cvar_basename,"_shield"));
+ self.vehicle_health -= damage;
+ if(sound_allowed(MSG_BROADCAST, attacker))
+ spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER
}
+ self.velocity += force; // * (vlen(force) / self.mass);
+
if(self.vehicle_health <= 0)
{
if(self.owner)
if(self.vehicle_flags & VHF_DEATHEJECT)
- self.vehicle_exit(VHEF_EJECT);
+ vehicles_exit(VHEF_EJECT);
+ else
+ vehicles_exit(VHEF_RELESE);
self.vehicle_die();
+ vehicles_setreturn();
+ }
+}
+
+void vehicles_clearrturn()
+{
+ entity ret;
+ // Remove "return helper", if any.
+ ret = findchain(classname, "vehicle_return");
+ while(ret)
+ {
+ if(ret.enemy == self)
+ {
+ ret.classname = "";
+ ret.think = SUB_Remove;
+ ret.nextthink = time + 0.1;
+
+ if(ret.waypointsprite_attached)
+ WaypointSprite_Kill(ret.waypointsprite_attached);
+
+ return;
+ }
+ ret = ret.chain;
}
+}
+void vehicles_return()
+{
+ pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
+
+ self.enemy.think = vehicles_spawn;
+ self.enemy.nextthink = time;
+
+ if(self.waypointsprite_attached)
+ WaypointSprite_Kill(self.waypointsprite_attached);
+
+ remove(self);
+}
+
+void vehicles_showwp_goaway()
+{
+ if(self.waypointsprite_attached)
+ WaypointSprite_Kill(self.waypointsprite_attached);
+
+ remove(self);
+
+}
+
+void vehicles_showwp()
+{
+ entity oldself;
+ vector rgb;
+
+ if(self.cnt)
+ {
+ self.think = vehicles_return;
+ self.nextthink = self.cnt;
+ }
+ else
+ {
+ self.think = vehicles_return;
+ self.nextthink = time +1;
+
+ oldself = self;
+ self = spawn();
+ setmodel(self, "null");
+ self.team = oldself.enemy.team;
+ self.enemy = oldself.enemy;
+ setorigin(self, oldself.enemy.pos1);
+
+ self.nextthink = time + 5;
+ self.think = vehicles_showwp_goaway;
+ }
+
+ if(teamplay && self.team)
+ rgb = TeamColor(self.team);
+ else
+ rgb = '1 1 1';
+ WaypointSprite_Spawn("vehicle", 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
+ if(self.waypointsprite_attached)
+ {
+ WaypointSprite_UpdateRule(self.waypointsprite_attached, self.enemy.team, SPRITERULE_DEFAULT);
+ if(oldself == world)
+ WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, self.nextthink);
+ WaypointSprite_Ping(self.waypointsprite_attached);
+ }
+
+ if(oldself != world)
+ self = oldself;
+}
+
+void vehicles_setreturn()
+{
+ entity ret;
+
+ vehicles_clearrturn();
+
+ ret = spawn();
+ ret.classname = "vehicle_return";
+ ret.enemy = self;
+ ret.team = self.team;
+ ret.think = vehicles_showwp;
+
+ if(self.deadflag != DEAD_NO)
+ {
+ ret.cnt = time + self.vehicle_respawntime;
+ ret.nextthink = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 5);
+ }
+ else
+ {
+ ret.nextthink = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 1);
+ }
+
+ setmodel(ret, "null");
+ setorigin(ret, self.pos1 + '0 0 96');
+
+}
+
+void vehicles_configcheck(string configname, float check_cvar)
+{
+ if(check_cvar == 0)
+ localcmd(strcat("exec ", configname, "\n"));
+}
+
+void vehicles_reset_colors()
+{
+ entity e;
+ float _effects, _colormap;
+ vector _glowmod, _colormod;
+
+ if(autocvar_g_nodepthtestplayers)
+ _effects = EF_NODEPTHTEST;
+
+ if(autocvar_g_fullbrightplayers)
+ _effects |= EF_FULLBRIGHT;
+
+ if(self.team)
+ _colormap = 1024 + (self.team - 1) * 17;
+ else
+ _colormap = 1024;
+
+ _glowmod = '0 0 0';
+ _colormod = '0 0 0';
+
+ // Find all ents attacked to main model and setup effects, colormod etc.
+ e = findchainentity(tag_entity, self);
+ while(e)
+ {
+ if(e != self.vehicle_shieldent)
+ {
+ e.effects = _effects; // | EF_LOWPRECISION;
+ e.colormod = _colormod;
+ e.colormap = _colormap;
+ e.alpha = 1;
+ }
+ e = e.chain;
+ }
+
+ self.vehicle_hudmodel.effects = self.effects = _effects; // | EF_LOWPRECISION;
+ self.vehicle_hudmodel.colormod = self.colormod = _colormod;
+ self.vehicle_hudmodel.colormap = self.colormap = _colormap;
+ self.vehicle_viewport.effects = (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT);
+
+ self.alpha = 1;
+ self.avelocity = '0 0 0';
+ self.velocity = '0 0 0';
+ self.effects = _effects;
+}
+
+float vehicle_initialize(string net_name,
+ string bodymodel,
+ string topmodel,
+ string hudmodel,
+ string toptag,
+ string hudtag,
+ string viewtag,
+ float vhud,
+ vector min_s,
+ vector max_s,
+ float nodrop,
+ void() spawnproc,
+ float _respawntime,
+ float() physproc,
+ void() enterproc,
+ void(float extflag) exitfunc,
+ void() dieproc,
+ void() thinkproc,
+ float use_csqc)
+{
+ addstat(STAT_HUD, AS_INT, hud);
+ addstat(STAT_VEHICLESTAT_HEALTH, AS_INT, vehicle_health);
+ addstat(STAT_VEHICLESTAT_SHIELD, AS_INT, vehicle_shield);
+ addstat(STAT_VEHICLESTAT_ENERGY, AS_INT, vehicle_energy);
+
+ addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
+ addstat(STAT_VEHICLESTAT_RELOAD1, AS_INT, vehicle_reload1);
+
+ addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
+ addstat(STAT_VEHICLESTAT_RELOAD2, AS_INT, vehicle_reload2);
+
+ if(bodymodel == "")
+ error("vehicles: missing bodymodel!");
+
+ if(hudmodel == "")
+ error("vehicles: missing hudmodel!");
+
+ if(net_name == "")
+ self.netname = self.classname;
+ else
+ self.netname = net_name;
+
+ if(self.team && !teamplay)
+ self.team = 0;
+
+ self.vehicle_flags |= VHF_ISVEHICLE;
+
+ setmodel(self, bodymodel);
+
+ self.vehicle_viewport = spawn();
+ self.vehicle_hudmodel = spawn();
+ self.tur_head = spawn();
+ self.tur_head.owner = self;
+ self.takedamage = DAMAGE_AIM;
+ self.bot_attack = TRUE;
+ self.iscreature = TRUE;
+ self.hud = vhud;
+
+ self.vehicle_die = dieproc;
+ self.vehicle_exit = exitfunc;
+ self.vehicle_enter = enterproc;
+ self.PlayerPhysplug = physproc;
+ self.event_damage = vehicles_damage;
+ self.touch = vehicles_touch;
+ self.think = vehicles_spawn;
+ self.nextthink = time;
+ self.vehicle_respawntime = _respawntime;
+ self.vehicle_spawn = spawnproc;
+
+ if(autocvar_g_nodepthtestplayers)
+ self.effects = self.effects | EF_NODEPTHTEST;
+
+ if(autocvar_g_fullbrightplayers)
+ self.effects = self.effects | EF_FULLBRIGHT;
+
+ setmodel(self.vehicle_hudmodel, hudmodel);
+ setmodel(self.vehicle_viewport, "null");
+
+
+ if(topmodel != "")
+ {
+ setmodel(self.tur_head, topmodel);
+ setattachment(self.tur_head, self, toptag);
+ setattachment(self.vehicle_hudmodel, self.tur_head, hudtag);
+ setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+ }
+ else
+ {
+ setattachment(self.tur_head, self, "");
+ setattachment(self.vehicle_hudmodel, self, hudtag);
+ setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+ }
+
+ setsize(self, min_s, max_s);
+ if not (nodrop)
+ {
+ setorigin(self, self.origin);
+ tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
+ setorigin(self, trace_endpos);
+ }
+ self.pos1 = self.origin;
+ self.pos2 = self.angles;
+ self.tur_head.team = self.team;
+
+ return TRUE;
}
void bugmenot()
self.vehicle_enter = self.vehicle_exit;
self.vehicle_die = self.vehicle_exit;
self.vehicle_spawn = self.vehicle_exit;
- //self.vehicle_message = self.vehicle_exit;
+ self.AuxiliaryXhair = self.AuxiliaryXhair;
}
-//#define VEHICLES_ENABLED
#ifdef VEHICLES_ENABLED
-
-#message "with tZork vehicles (experimental)"
-
-float SVC_SETVIEWPORT = 5; // Net.Protocol 0x05
-float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A
-float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80
-
-#define CCVAR(part) cvar(strcat(self.cvar_basename,part))
-//.string cvar_basename;
-
-.float vehicle_flags;
-#define VHF_HASSHIELD 2
-#define VHF_SHIELDREGEN 4
-#define VHF_HEALTHREGEN 8
-#define VHF_DEATHEJECT 16
-#define VHF_ENERGYREGEN 32
-
-.float hud;
-
-.entity gun1;
-.entity gun2;
-
-.entity shield;
-
-.float vehicle_health;
-.float vehicle_shield;
-.float vehicle_energy;
-
-.float vehicle_ammo1;
-.float vehicle_reload1;
-
-.float vehicle_ammo2;
-.float vehicle_reload2;
-
-.entity vehicle;
-.entity vehicle_viewport;
-.entity vehicle_hudmodel;
-
-//.float anim_start;
-//.float anim_end;
-
-.float dmg_time;
-
-#define VHEF_NORMAL 0
-#define VHEF_EJECT 1
-
-var .void(float exit_flags) vehicle_exit;
-var .void() vehicle_enter;
-var .void() vehicle_die;
-var .void() vehicle_spawn;
-//var .float(float message) vehicle_message;
-
#include "vehicles.qc"
-#include "spiderbot.qc"
#include "racer.qc"
+#include "spiderbot.qc"
#include "raptor.qc"
-
+//#include "bumblebee.qc"
#endif
--- /dev/null
+// #define VEHICLES_USE_ODE
+#define VEHICLES_ENABLED
+#ifdef VEHICLES_ENABLED
+
+//#message "with tZork vehicles (experimental)"
+
+.float vehicle_flags;
+float VHF_ISVEHICLE = 2; /// Indicates vehicle
+float VHF_HASSHIELD = 4; /// Vehicle has shileding
+float VHF_SHIELDREGEN = 8; /// Vehicles shield regenerates
+float VHF_HEALTHREGEN = 16; /// Vehicles health regenerates
+float VHF_ENERGYREGEN = 32; /// Vehicles energy regenerates
+float VHF_DEATHEJECT = 64; /// Vehicle ejects pilot upon fatal damage
+float VHF_MOVE_GROUND = 128; /// Vehicle moves on gound
+float VHF_MOVE_HOVER = 256; /// Vehicle hover close to gound
+float VHF_MOVE_FLY = 512; /// Vehicle is airborn
+float VHF_DMGSHAKE = 1024;
+float VHF_DMGROLL = 2048;
+float VHF_DMGHEADROLL = 4096;
+
+.entity gun1;
+.entity gun2;
+
+.float vehicle_health; /// If self is player this is 0..100 indicating precentage of health left on vehicle. If self is vehile, this is the real health value.
+.float vehicle_energy; /// If self is player this is 0..100 indicating precentage of energy left on vehicle. If self is vehile, this is the real energy value.
+.float vehicle_shield; /// If self is player this is 0..100 indicating precentage of shield left on vehicle. If self is vehile, this is the real shield value.
+.entity vehicle_shieldent; /// Entity to disply the shild effect on damage
+
+.float vehicle_ammo1; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo1 value.
+.float vehicle_reload1; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload1 value.
+.float vehicle_ammo2; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo2 value.
+.float vehicle_reload2; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload2 value.
+
+.entity vehicle;
+.entity vehicle_viewport;
+.entity vehicle_hudmodel;
+
+.float sound_nexttime;
+#define VOL_VEHICLEENGINE 1
+
+.float hud;
+.float dmg_time;
+.float vehicle_respawntime;
+.void() vehicle_spawn;
+
+void vehicles_exit(float eject);
+var .void(float exit_flags) vehicle_exit;
+float VHEF_NORMAL = 0; /// User pressed exit key
+float VHEF_EJECT = 1; /// User pressed exit key 3 times fast (not implemented) or vehile is dying
+float VHEF_RELESE = 2; /// Release ownership, client possibly allready dissconnected / went spec / changed team / used "kill" (not implemented)
+
+float SVC_SETVIEWPORT = 5; // Net.Protocol 0x05
+float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A
+float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80
+
+var .void() vehicle_enter; /// Vehicles custom funciton to be executed when owner exit it
+var .void() vehicle_die; /// Vehicles custom function to be executed when vehile die
+var .void() vehicle_spawn; /// Vehicles custom fucntion to be efecuted when vehicle (re)spawns
+
+#ifdef VEHICLES_USE_ODE
+void(entity e, float physics_enabled) physics_enable = #540; // enable or disable physics on object
+void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
+void(entity e, vector torque) physics_addtorque = #542; // add relative torque
+#endif // VEHICLES_USE_ODE
+#endif // VEHICLES_ENABLED
return TRUE;
}
-void VoteDialog_UpdateHighlight(float selected) {
- WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_VOTE);
- WriteByte(MSG_ONE, 1);
- WriteByte(MSG_ONE, selected);
-}
-
-void VoteDialog_Reset() {
- WriteByte(MSG_ALL, SVC_TEMPENTITY);
- WriteByte(MSG_ALL, TE_CSQC_VOTERESET);
-}
-
float GameCommand_Vote(string s, entity e) {
local float playercount;
float argc;
bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote for ", votecalledvote_display, "\n");
if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
- VoteCount(); // needed if you are the only one
Nagger_VoteChanged();
+ VoteCount(); // needed if you are the only one
msg_entity = e;
- VoteDialog_UpdateHighlight(1);
local entity player;
FOR_EACH_REALCLIENT(player)
if(!votecalled) {
print_to(e, "^1No vote called.");
} else if(e == votecaller) { // the votecaller can stop a vote
- VoteDialog_Reset();
VoteStop(e);
} else if(!e) { // server admin / console can too
- VoteDialog_Reset();
VoteStop(e);
} else if(e.vote_master) { // masters can too
- VoteDialog_Reset();
VoteStop(e);
} else {
print_to(e, "^1You are not allowed to stop that Vote.");
bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote to become ^3master^2.\n");
if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
- VoteCount(); // needed if you are the only one
Nagger_VoteChanged();
+ VoteCount(); // needed if you are the only one
}
} else {
print_to(e, "^1Vote to become master is NOT allowed.");
} else if(e.vote_vote == 0
|| autocvar_sv_vote_change) {
msg_entity = e;
- VoteDialog_UpdateHighlight(1);
print_to(e, "^1You accepted the vote.");
e.vote_vote = 1;
- centerprint_expire(e, CENTERPRIO_VOTE);
if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
} else if(e.vote_vote == 0
|| autocvar_sv_vote_change) {
msg_entity = e;
- VoteDialog_UpdateHighlight(2);
print_to(e, "^1You rejected the vote.");
e.vote_vote = -1;
- centerprint_expire(e, CENTERPRIO_VOTE);
if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
} else if(e.vote_vote == 0
|| autocvar_sv_vote_change) {
msg_entity = e;
- VoteDialog_UpdateHighlight(3);
print_to(e, "^1You abstained from your vote.");
e.vote_vote = -2;
- centerprint_expire(e, CENTERPRIO_VOTE);
if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
FOR_EACH_CLIENT(player)
{
player.vote_vote = 0;
- centerprint_expire(player, CENTERPRIO_VOTE);
}
if(votecalled)
votecalled = FALSE;
votecalledmaster = FALSE;
votefinished = 0;
+ votecalledvote = string_null;
+ votecalledvote_display = string_null;
+
+ Nagger_VoteChanged();
}
void VoteAccept() {
VoteReset();
}
-void VoteSpam(float yescount, float nocount, float abstaincount, float notvoters, float mincount, string result)
+void VoteSpam(float notvoters, float mincount, string result)
{
string s;
if(mincount >= 0)
{
- s = strcat("\{1}^2* vote results: ^1", ftos(yescount), "^2:^1");
- s = strcat(s, ftos(nocount), "^2 (^1");
+ s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
+ s = strcat(s, ftos(vote_nocount), "^2 (^1");
s = strcat(s, ftos(mincount), "^2 needed), ^1");
- s = strcat(s, ftos(abstaincount), "^2 didn't care, ^1");
+ s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
s = strcat(s, ftos(notvoters), "^2 didn't vote\n");
}
else
{
- s = strcat("\{1}^2* vote results: ^1", ftos(yescount), "^2:^1");
- s = strcat(s, ftos(nocount), "^2, ^1");
- s = strcat(s, ftos(abstaincount), "^2 didn't care, ^1");
+ s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
+ s = strcat(s, ftos(vote_nocount), "^2, ^1");
+ s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
s = strcat(s, ftos(notvoters), "^2 didn't have to vote\n");
}
bprint(s);
if(autocvar_sv_eventlog)
{
- s = strcat(":vote:v", result, ":", ftos(yescount));
- s = strcat(s, ":", ftos(nocount));
- s = strcat(s, ":", ftos(abstaincount));
+ s = strcat(":vote:v", result, ":", ftos(vote_yescount));
+ s = strcat(s, ":", ftos(vote_nocount));
+ s = strcat(s, ":", ftos(vote_abstaincount));
s = strcat(s, ":", ftos(notvoters));
s = strcat(s, ":", ftos(mincount));
GameLogEcho(s);
}
}
-void VoteDialog_Update(float msg, float vyes, float vno, float needed) {
- WriteByte(msg, SVC_TEMPENTITY);
- WriteByte(msg, TE_CSQC_VOTE);
- WriteByte(msg, 0);
- WriteByte(msg, vyes);
- WriteByte(msg, vno);
- WriteByte(msg, needed);
-}
-
void VoteCount() {
local float playercount;
playercount = 0;
- local float yescount;
- yescount = 0;
- local float nocount;
- nocount = 0;
- local float abstaincount;
- abstaincount = 0;
+ vote_yescount = 0;
+ vote_nocount = 0;
+ vote_abstaincount = 0;
local entity player;
//same for real players
local float realplayercount;
local float realplayerabstaincount;
realplayercount = realplayernocount = realplayerabstaincount = realplayeryescount = 0;
+ Nagger_VoteCountChanged();
+
FOR_EACH_REALCLIENT(player)
{
if(player.vote_vote == -1) {
- ++nocount;
+ ++vote_nocount;
} else if(player.vote_vote == 1) {
- ++yescount;
+ ++vote_yescount;
} else if(player.vote_vote == -2) {
- ++abstaincount;
+ ++vote_abstaincount;
}
++playercount;
//do the same for real players
//in tournament mode, if we have at least one player then don't make the vote dependent on spectators (so specs don't have to press F1)
if(autocvar_sv_vote_nospectators)
if(realplayercount > 0) {
- yescount = realplayeryescount;
- nocount = realplayernocount;
- abstaincount = realplayerabstaincount;
+ vote_yescount = realplayeryescount;
+ vote_nocount = realplayernocount;
+ vote_abstaincount = realplayerabstaincount;
playercount = realplayercount;
}
float votefactor, simplevotefactor;
votefactor = bound(0.5, autocvar_sv_vote_majority_factor, 0.999);
simplevotefactor = autocvar_sv_vote_simple_majority_factor;
- float needed;
- needed = floor((playercount - abstaincount) * max(votefactor, simplevotefactor)) + 1;
- VoteDialog_Update(MSG_ALL, yescount, nocount, needed);
+
+ // FIXME this number is a guess
+ vote_needed_absolute = floor((playercount - vote_abstaincount) * votefactor) + 1;
+ if(simplevotefactor)
+ {
+ simplevotefactor = bound(votefactor, simplevotefactor, 0.999);
+ vote_needed_simple = floor((vote_yescount + vote_nocount) * simplevotefactor) + 1;
+ }
+ else
+ vote_needed_simple = 0;
if(votecalledmaster
&& playercount == 1) {
}
VoteReset();
} else {
- if(yescount > (playercount - abstaincount) * votefactor)
+ if(vote_yescount >= vote_needed_absolute)
{
- VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, -1, "yes");
+ VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "yes");
VoteAccept();
- VoteDialog_Reset();
}
- else if(nocount >= (playercount - abstaincount) * (1 - votefactor)) // that means, yescount cannot reach minyes any more
+ else if(vote_nocount > playercount - vote_abstaincount - vote_needed_absolute) // that means, vote_yescount cannot reach vote_needed_absolute any more
{
- VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, -1, "no");
+ VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "no");
VoteReject();
- VoteDialog_Reset();
}
else if(time > votefinished)
{
if(simplevotefactor)
{
string result;
- simplevotefactor = bound(votefactor, simplevotefactor, 0.999);
- if(yescount > (yescount + nocount) * simplevotefactor)
+ if(vote_yescount >= vote_needed_simple)
result = "yes";
- else if(yescount + nocount > 0)
+ else if(vote_yescount + vote_nocount > 0)
result = "no";
else
result = "timeout";
- VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor(min((playercount - abstaincount) * votefactor, (yescount + nocount) * simplevotefactor)) + 1, result);
+ VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, min(vote_needed_absolute, vote_needed_simple), result);
if(result == "yes")
VoteAccept();
else if(result == "no")
}
else
{
- VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor((playercount - abstaincount) * votefactor) + 1, "timeout");
+ VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, vote_needed_absolute, "timeout");
VoteTimeout();
}
- VoteDialog_Reset();
}
}
}
.float vote_master;
.float vote_next;
.float vote_vote;
+float vote_yescount;
+float vote_nocount;
+float vote_abstaincount;
+float vote_needed_absolute;
+float vote_needed_simple;
float VoteCheckNasty(string cmd);
entity GetKickVoteVictim(string vote, string cmd, entity caller);
void VoteReject();
void VoteTimeout();
void VoteStop(entity stopper);
-void VoteSpam(float yescount, float nocount, float abstaincount, float notvoters, float mincount, string result);
+void VoteSpam(float notvoters, float mincount, string result);
void VoteCount();
local entity ent, endent;
local float endq3surfaceflags;
float totaldmg;
+ entity o;
float length;
vector beampos;
// trace multiple times until we hit a wall, each obstacle will be made
// non-solid so we can hit the next, while doing this we spawn effects and
// note down which entities were hit so we can damage them later
+ o = self;
while (1)
{
if(self.antilag_debug)
- WarpZone_traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
+ WarpZone_traceline_antilag (self, start, end, FALSE, o, self.antilag_debug);
else
- WarpZone_traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
+ WarpZone_traceline_antilag (self, start, end, FALSE, o, ANTILAG_LATENCY(self));
+ if(o && WarpZone_trace_firstzone)
+ {
+ o = world;
+ continue;
+ }
// if it is world we can't hurt it so stop now
if (trace_ent == world || trace_fraction == 1)
if(!pseudoprojectile)
pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
- soundtoat(MSG_ONE, pseudoprojectile, beampos, CHAN_PROJECTILE, snd, VOL_BASE * f, ATTN_NONE);
+ soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, snd, VOL_BASE * f, ATTN_NONE);
}
if(pseudoprojectile)
f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
- if(accuracy_isgooddamage(self.owner, ent))
+ if(accuracy_isgooddamage(self.realowner, ent))
totaldmg += bdamage * f;
// apply the damage
damage_headshotbonus = self.dmg_edge * f;
railgun_start = self.origin - 2 * frametime * self.velocity;
railgun_end = self.origin + 2 * frametime * self.velocity;
- g = accuracy_isgooddamage(self.owner, other);
- Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
+ g = accuracy_isgooddamage(self.realowner, other);
+ Damage(other, self, self.realowner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
damage_headshotbonus = 0;
if(headshot)
if(self.dmg_edge > 0)
{
if(headshot)
- AnnounceTo(self.owner, "headshot");
+ AnnounceTo(self.realowner, "headshot");
if(yoda)
- AnnounceTo(self.owner, "awesome");
+ AnnounceTo(self.realowner, "awesome");
}
// calculate hits for ballistic weapons
// do not exceed 100%
q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total;
self.dmg_total += f * self.dmg;
- accuracy_add(self.owner, self.owner.weapon, 0, q);
+ accuracy_add(self.realowner, self.realowner.weapon, 0, q);
}
}
entity proj;
proj = spawn();
proj.classname = "bullet";
- proj.owner = self;
+ proj.owner = proj.realowner = self;
PROJECTILE_MAKETRIGGER(proj);
if(gravityfactor > 0)
{
trace_fraction = 0;
fireBallisticBullet_trace_callback_ent = self;
fireBallisticBullet_trace_callback_eff = eff;
- WarpZone_TraceToss_ThroughZone(self, oldself, world, fireBallisticBullet_trace_callback);
+ // FIXME can we somehow do this with just ONE trace?
+ WarpZone_TraceToss(self, self.owner);
+ if(self.owner && WarpZone_trace_firstzone)
+ {
+ self.owner = world;
+ self.velocity = v0;
+ self.gravity = g0;
+ continue;
+ }
+ WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
self.velocity = v0;
self.gravity = g0;
if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY))
{
- pointparticles(particleeffectnum("TE_KNIGHTSPIKE"),end,trace_plane_normal * 2500,1);
- if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
- Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);
+ if not (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);
+
Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
- //void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC
}
trace_endpos = end;
}
if(e == world)
error("W_Crylink_CheckLinks: entity is world");
- if(e.classname != "spike")
- error("W_Crylink_CheckLinks: entity is not a spike");
+ if(e.classname != "spike" || wasfreed(e))
+ error(sprintf("W_Crylink_CheckLinks: entity is not a spike but a %s (freed: %d)", e.classname, wasfreed(e)));
p = e;
for(i = 0; i < 1000; ++i)
own.crylink_lastgroup = ((me == next) ? world : next);
prev.queuenext = next;
next.queueprev = prev;
+ me.classname = "spike_oktoremove";
if(me != next)
W_Crylink_CheckLinks(next);
}
W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext);
}
+void W_Crylink_Reset(void)
+{
+ W_Crylink_Dequeue(self);
+ remove(self);
+}
+
// force projectile to explode
void W_Crylink_LinkExplode (entity e, entity e2)
{
float a;
+
+ if(e == e2)
+ return;
+
a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1);
if(e == e.realowner.crylink_lastgroup)
else
RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_primary_damage * a, autocvar_g_balance_crylink_primary_edgedamage * a, autocvar_g_balance_crylink_primary_radius, world, autocvar_g_balance_crylink_primary_force * a, e.projectiledeathtype, other);
- if(e.queuenext != e2)
- W_Crylink_LinkExplode(e.queuenext, e2);
+ W_Crylink_LinkExplode(e.queuenext, e2);
+ e.classname = "spike_oktoremove";
remove (e);
}
remove(self);
}
-
// NO bounce protection, as bounces are limited!
void W_Crylink_Touch (void)
{
float finalhit;
float f;
- //PROJECTILE_TOUCH;
- local entity savenext, saveprev, saveown;
- saveown = self.realowner;
- savenext = self.queuenext;
- saveprev = self.queueprev;
- if(WarpZone_Projectile_Touch())
- {
- if(wasfreed(self))
- W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
- return;
- }
+ PROJECTILE_TOUCH;
float a;
a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1);
if(self == self.realowner.crylink_lastgroup)
self.realowner.crylink_lastgroup = world;
W_Crylink_LinkExplode(self.queuenext, self);
+ self.classname = "spike_oktoremove";
remove (self);
return;
}
{
float finalhit;
float f;
- //PROJECTILE_TOUCH;
- local entity savenext, saveprev, saveown;
- savenext = self.queuenext;
- saveprev = self.queueprev;
- saveown = self.realowner;
- if(WarpZone_Projectile_Touch())
- {
- if(wasfreed(self))
- W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
- return;
- }
+ PROJECTILE_TOUCH;
float a;
a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1);
if(self == self.realowner.crylink_lastgroup)
self.realowner.crylink_lastgroup = world;
W_Crylink_LinkExplode(self.queuenext, self);
+ self.classname = "spike_oktoremove";
remove (self);
return;
}
if(autocvar_g_balance_crylink_primary_joinexplode)
maxdmg += autocvar_g_balance_crylink_primary_joinexplode_damage;
- W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CHAN_WEAPON, maxdmg);
+ W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CH_WEAPON_A, maxdmg);
forward = v_forward;
right = v_right;
up = v_up;
while (counter < shots)
{
proj = spawn ();
+ proj.reset = W_Crylink_Reset;
proj.realowner = proj.owner = self;
proj.classname = "spike";
proj.bot_dodge = TRUE;
counter = counter + 1;
}
- self.crylink_lastgroup = proj;
- W_Crylink_CheckLinks(proj);
+ if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0)
+ {
+ self.crylink_lastgroup = proj;
+ W_Crylink_CheckLinks(proj);
+ self.crylink_waitrelease = 1;
+ }
}
void W_Crylink_Attack2 (void)
if(autocvar_g_balance_crylink_secondary_joinexplode)
maxdmg += autocvar_g_balance_crylink_secondary_joinexplode_damage;
- W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CHAN_WEAPON, maxdmg);
+ W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CH_WEAPON_A, maxdmg);
shots = autocvar_g_balance_crylink_secondary_shots;
pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
while (counter < shots)
{
proj = spawn ();
+ proj.reset = W_Crylink_Reset;
proj.realowner = proj.owner = self;
proj.classname = "spike";
proj.bot_dodge = TRUE;
counter = counter + 1;
}
- self.crylink_lastgroup = proj;
+ if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0)
+ {
+ self.crylink_lastgroup = proj;
+ W_Crylink_CheckLinks(proj);
+ self.crylink_waitrelease = 2;
+ }
}
void spawnfunc_weapon_crylink (void)
{
if(autocvar_g_balance_crylink_reload_ammo && self.clip_load < min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo)) // forced reload
weapon_action(self.weapon, WR_RELOAD);
- else if (self.BUTTON_ATCK)
+
+ if (self.BUTTON_ATCK)
{
- if (!self.crylink_waitrelease)
+ if (self.crylink_waitrelease != 1)
if (weapon_prepareattack(0, autocvar_g_balance_crylink_primary_refire))
{
W_Crylink_Attack();
weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_crylink_primary_animtime, w_ready);
- if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0)
- self.crylink_waitrelease = 1;
}
}
- else if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
+
+ if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
{
- if (!self.crylink_waitrelease)
+ if (self.crylink_waitrelease != 2)
if (weapon_prepareattack(1, autocvar_g_balance_crylink_secondary_refire))
{
W_Crylink_Attack2();
weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_crylink_secondary_animtime, w_ready);
- if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0)
- self.crylink_waitrelease = 2;
}
}
- else
+
+ if ((self.crylink_waitrelease == 1 && !self.BUTTON_ATCK) || (self.crylink_waitrelease == 2 && !self.BUTTON_ATCK2))
{
- if (self.crylink_waitrelease && (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time))
+ if (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time)
{
// fired and released now!
if(self.crylink_lastgroup)
{
pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
}
else
{
pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
}
}
else if(req == WR_PRECACHE)
if (e.classname == "plasma")
{
// change owner to whoever caused the combo explosion
- e.owner = own;
+ e.realowner = own;
e.takedamage = DAMAGE_NO;
e.classname = "plasma_chain";
e.think = W_Plasma_Explode_Combo;
{
if(other.takedamage == DAMAGE_AIM)
if(other.classname == "player")
- if(IsDifferentTeam(self.owner, other))
+ if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
- AnnounceTo(self.owner, "electrobitch");
+ AnnounceTo(self.realowner, "electrobitch");
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
if (self.movetype == MOVETYPE_BOUNCE)
{
- RadiusDamage (self, self.owner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
}
else
{
- W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.owner);
- RadiusDamage (self, self.owner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
+ W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.realowner);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
}
remove (self);
void W_Plasma_Explode_Combo (void)
{
- W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.owner);
+ W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.realowner);
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
+ RadiusDamage (self, self.realowner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
remove (self);
}
W_Plasma_Explode ();
} else {
//UpdateCSQCProjectile(self);
- spamsound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
self.projectiledeathtype |= HITTYPE_BOUNCE;
}
}
if (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim")
{
// change owner to whoever caused the combo explosion
- self.owner = inflictor.owner;
+ self.realowner = inflictor.realowner;
self.classname = "plasma_chain";
self.think = W_Plasma_Explode_Combo;
self.nextthink = time + min(autocvar_g_balance_electro_combo_radius, vlen(self.origin - inflictor.origin)) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler
W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_reload_ammo);
- W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CHAN_WEAPON, autocvar_g_balance_electro_primary_damage);
+ W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CH_WEAPON_A, autocvar_g_balance_electro_primary_damage);
pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
proj = spawn ();
proj.classname = "plasma_prim";
- proj.owner = self;
+ proj.owner = proj.realowner = self;
proj.bot_dodge = TRUE;
proj.bot_dodgerating = autocvar_g_balance_electro_primary_damage;
proj.use = W_Plasma_Explode;
setsize(proj, '0 0 -3', '0 0 -3');
proj.flags = FL_PROJECTILE;
- //sound (proj, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
- //sounds bad
-
CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
other = proj; MUTATOR_CALLHOOK(EditProjectile);
W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_secondary_ammo, autocvar_g_balance_electro_reload_ammo);
- W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CHAN_WEAPON, autocvar_g_balance_electro_secondary_damage);
+ W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CH_WEAPON_A, autocvar_g_balance_electro_secondary_damage);
w_shotdir = v_forward; // no TrueAim for grenades please
proj = spawn ();
proj.classname = "plasma";
- proj.owner = self;
+ proj.owner = proj.realowner = self;
proj.use = W_Plasma_Explode;
proj.think = adaptor_think2use_hittype_splash;
proj.bot_dodge = TRUE;
{
WriteByte(MSG_ENTITY, ENT_CLIENT_LGBEAM);
sf = sf & 0x7F;
- if(sound_allowed(MSG_BROADCAST, self.owner))
+ if(sound_allowed(MSG_BROADCAST, self.realowner))
sf |= 0x80;
WriteByte(MSG_ENTITY, sf);
if(sf & 1)
{
- WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+ WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range);
}
if(sf & 2)
.float prevlgfire;
float lgbeam_checkammo()
{
- if(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+ if(self.realowner.items & IT_UNLIMITED_WEAPON_AMMO)
return TRUE;
else if(autocvar_g_balance_electro_reload_ammo)
- return self.owner.clip_load > 0;
+ return self.realowner.clip_load > 0;
else
- return self.owner.ammo_cells > 0;
+ return self.realowner.ammo_cells > 0;
}
+entity lgbeam_owner_ent;
void lgbeam_think()
{
entity owner_player;
- owner_player = self.owner;
+ owner_player = self.realowner;
owner_player.prevlgfire = time;
if (self != owner_player.lgbeam)
}
W_SetupShot_Range(owner_player, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range);
- WarpZone_traceline_antilag(owner_player, w_shotorg, w_shotend, MOVE_NORMAL, owner_player, ANTILAG_LATENCY(owner_player));
+ if(!lgbeam_owner_ent)
+ {
+ lgbeam_owner_ent = spawn();
+ lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+ }
+ WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(owner_player));
// apply the damage
if(trace_ent)
{
// only play fire sound if 0.5 sec has passed since player let go the fire button
if(time - self.prevlgfire > 0.5)
- sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
entity beam, oldself;
beam.classname = "lgbeam";
beam.solid = SOLID_NOT;
beam.think = lgbeam_think;
- beam.owner = self;
+ beam.owner = beam.realowner = self;
beam.movetype = MOVETYPE_NONE;
beam.shot_spread = 0;
beam.bot_dodge = TRUE;
{
pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
}
else
{
// this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls
pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
}
else
{
pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
}
}
}
self.takedamage = DAMAGE_NO;
// 1. dist damage
- d = (self.owner.health + self.owner.armorvalue);
+ d = (self.realowner.health + self.realowner.armorvalue);
RadiusDamage (self, self.realowner, autocvar_g_balance_fireball_primary_damage, autocvar_g_balance_fireball_primary_edgedamage, autocvar_g_balance_fireball_primary_radius, world, autocvar_g_balance_fireball_primary_force, self.projectiledeathtype, other);
if(self.realowner.health + self.realowner.armorvalue >= d)
if(!self.cnt)
// 2. bfg effect
// NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain)
- if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+ if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
{
// can we see fireball?
traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e);
RandomSelection_Init();
for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain)
- if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+ if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
{
p = e.origin;
p_x += e.mins_x + random() * (e.maxs_x - e.mins_x);
{
local entity proj;
- W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", CHAN_WEAPON, autocvar_g_balance_fireball_primary_damage + autocvar_g_balance_fireball_primary_bfgdamage);
+ W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", CH_WEAPON_A, autocvar_g_balance_fireball_primary_damage + autocvar_g_balance_fireball_primary_bfgdamage);
pointparticles(particleeffectnum("fireball_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
W_DecreaseAmmo(ammo_fuel, autocvar_g_balance_fireball_primary_ammo, autocvar_g_balance_fireball_reload_ammo);
W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
- sound (self, CHAN_WEAPON, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_SINGLE, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame1);
}
f_diff = '+1.25 +3.75 0';
break;
}
- W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", CHAN_WEAPON, autocvar_g_balance_fireball_secondary_damage);
+ W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", CH_WEAPON_A, autocvar_g_balance_fireball_secondary_damage);
traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, self);
w_shotorg = trace_endpos;
if (weapon_prepareattack(0, autocvar_g_balance_fireball_primary_refire))
{
W_Fireball_Attack1_Frame0();
- self.fireball_primarytime = time + autocvar_g_balance_fireball_primary_refire2;
+ self.fireball_primarytime = time + autocvar_g_balance_fireball_primary_refire2 * W_WeaponRateFactor();
}
}
else if (self.BUTTON_ATCK2)
org2 = w_org + w_backoff * 16;
pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
+ sound(self, CH_SHOTS, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
}
}
else if(req == WR_PRECACHE)
{
if(other.takedamage == DAMAGE_AIM)
if(other.classname == "player")
- if(IsDifferentTeam(self.owner, other))
+ if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
- AnnounceTo(self.owner, "airshot");
+ AnnounceTo(self.realowner, "airshot");
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
if(self.movetype == MOVETYPE_NONE)
self.velocity = self.oldvelocity;
- RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
remove (self);
}
{
if(other.takedamage == DAMAGE_AIM)
if(other.classname == "player")
- if(IsDifferentTeam(self.owner, other))
+ if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
- AnnounceTo(self.owner, "airshot");
+ AnnounceTo(self.realowner, "airshot");
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
if(self.movetype == MOVETYPE_NONE)
self.velocity = self.oldvelocity;
- RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
remove (self);
}
float r;
r = random() * 6;
if(r < 1)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
else if(r < 2)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
else if(r < 3)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
else if(r < 4)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
else if(r < 5)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
else
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
self.projectiledeathtype |= HITTYPE_BOUNCE;
self.gl_bouncecnt += 1;
}
else if(autocvar_g_balance_grenadelauncher_primary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
{
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
// let it stick whereever it is
self.oldvelocity = self.velocity;
// do not respond to any more touches
self.solid = SOLID_NOT;
- self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_primary_lifetime2);
+ self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_primary_lifetime_stick);
}
}
float r;
r = random() * 6;
if(r < 1)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
else if(r < 2)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
else if(r < 3)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
else if(r < 4)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
else if(r < 5)
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
else
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
self.projectiledeathtype |= HITTYPE_BOUNCE;
self.gl_bouncecnt += 1;
+
+ if (autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce && self.gl_bouncecnt == 1)
+ self.nextthink = time + autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
+
}
else if(autocvar_g_balance_grenadelauncher_secondary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
{
- spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
// let it stick whereever it is
self.oldvelocity = self.velocity;
// do not respond to any more touches
self.solid = SOLID_NOT;
- self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_secondary_lifetime2);
+ self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_secondary_lifetime_stick);
}
}
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_grenadelauncher_primary_ammo, autocvar_g_balance_grenadelauncher_reload_ammo);
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_primary_damage);
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CH_WEAPON_A, autocvar_g_balance_grenadelauncher_primary_damage);
w_shotdir = v_forward; // no TrueAim for grenades please
pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
gren = spawn ();
- gren.owner = self;
+ gren.owner = gren.realowner = self;
gren.classname = "grenade";
gren.bot_dodge = TRUE;
gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_primary_damage;
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_grenadelauncher_secondary_ammo, autocvar_g_balance_grenadelauncher_reload_ammo);
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_secondary_damage);
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CH_WEAPON_A, autocvar_g_balance_grenadelauncher_secondary_damage);
w_shotdir = v_forward; // no TrueAim for grenades please
pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
gren = spawn ();
- gren.owner = self;
+ gren.owner = gren.realowner = self;
gren.classname = "grenade";
gren.bot_dodge = TRUE;
gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_secondary_damage;
if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary"))
{
nadefound = 0;
- for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.owner == self)
+ for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.realowner == self)
{
if(!nade.gl_detonate_later)
{
}
}
if(nadefound)
- sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_B, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
}
else if (weapon_prepareattack(1, autocvar_g_balance_grenadelauncher_secondary_refire))
{
org2 = w_org + w_backoff * 12;
pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_primary_ammo, autocvar_g_balance_hagar_reload_ammo);
- W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_primary_damage);
+ W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_primary_damage);
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo, autocvar_g_balance_hagar_reload_ammo);
- W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_secondary_damage);
+ W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_secondary_damage);
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
// time to release the rockets we've loaded
local entity missile;
- local float counter, shots;
+ local float counter, shots, spread_pershot;
local vector s;
vector forward, right, up;
weapon_prepareattack_do(1, autocvar_g_balance_hagar_secondary_refire);
- W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_secondary_damage);
+ W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_secondary_damage);
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
forward = v_forward;
setorigin (missile, w_shotorg);
setsize(missile, '0 0 0', '0 0 0');
missile.movetype = MOVETYPE_FLY;
-
+
+ // per-shot spread calculation: the more shots there are, the less spread is applied (based on the bias cvar)
+ spread_pershot = ((shots - 1) / (autocvar_g_balance_hagar_secondary_load_max - 1));
+ spread_pershot = (1 - (spread_pershot * autocvar_g_balance_hagar_secondary_load_spread_bias));
+ spread_pershot = (autocvar_g_balance_hagar_secondary_spread * spread_pershot * g_weaponspreadfactor);
+
+ // pattern spread calculation
s = '0 0 0';
if (counter == 0)
s = '0 0 0';
s_y = v_forward_x;
s_z = v_forward_y;
}
- s = s * cvar("g_balance_hagar_secondary_spread") * g_weaponspreadfactor;
- W_SetupProjectileVelocityEx(missile, w_shotdir + right * s_y + up * s_z, v_up, cvar("g_balance_hagar_secondary_speed"), 0, 0, 0, FALSE);
+ s = s * autocvar_g_balance_hagar_secondary_load_spread * g_weaponspreadfactor;
+
+ W_SetupProjectileVelocityEx(missile, w_shotdir + right * s_y + up * s_z, v_up, autocvar_g_balance_hagar_secondary_speed, 0, 0, spread_pershot, FALSE);
missile.angles = vectoangles (missile.velocity);
missile.flags = FL_PROJECTILE;
}
weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hagar_secondary_refire, w_ready);
- self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_refire;
+ self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_refire * W_WeaponRateFactor();
self.hagar_load = 0;
}
if(self.hagar_load)
{
// if we pressed primary fire while loading, unload all rockets and abort
+ self.weaponentity.state = WS_READY;
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo * self.hagar_load * -1, autocvar_g_balance_hagar_reload_ammo); // give back ammo
self.hagar_load = 0;
- sound(self, CHAN_WEAPON, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_WEAPON_A, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
// pause until we can load rockets again, once we re-press the alt fire button
- self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed;
+ self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed * W_WeaponRateFactor();
// require letting go of the alt fire button before we can load again
self.hagar_loadblock = TRUE;
if(!self.hagar_loadblock && self.hagar_loadstep < time)
{
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo, autocvar_g_balance_hagar_reload_ammo);
+ self.weaponentity.state = WS_INUSE;
self.hagar_load += 1;
- sound(self, CHAN_WEAPON2, "weapons/hagar_load.wav", VOL_BASE * 0.8, ATTN_NORM); // sound is too loud according to most
+ sound(self, CH_WEAPON_B, "weapons/hagar_load.wav", VOL_BASE * 0.8, ATTN_NORM); // sound is too loud according to most
if (self.hagar_load >= autocvar_g_balance_hagar_secondary_load_max)
- self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_hold;
+ self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_hold * W_WeaponRateFactor();
else
- self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed;
+ self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed * W_WeaponRateFactor();
}
}
else if(!self.hagar_loadbeep && self.hagar_load) // prevents the beep from playing each frame
{
// if this is the last rocket we can load, play a beep sound to notify the player
- sound(self, CHAN_WEAPON, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_WEAPON_A, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
self.hagar_loadbeep = TRUE;
}
}
if(self.hagar_load)
{
- self.weapon_forbidchange = TRUE;
if(!self.BUTTON_ATCK2 || ((loaded || !enough_ammo) && self.hagar_loadstep < time && autocvar_g_balance_hagar_secondary_load_hold >= 0))
+ {
+ self.weaponentity.state = WS_READY;
W_Hagar_Attack2_Load_Release();
+ }
}
else
{
- self.weapon_forbidchange = FALSE;
self.hagar_loadbeep = FALSE;
}
// we aren't checking ammo during an attack, so we must do it here
if not(weapon_action(self.weapon, WR_CHECKAMMO1) + weapon_action(self.weapon, WR_CHECKAMMO2))
{
+ // note: this doesn't force the switch
W_SwitchToOtherWeapon(self);
return;
}
}
}
}
+ else if (req == WR_GONETHINK)
+ {
+ // we lost the weapon and want to prepare switching away
+ if(self.hagar_load)
+ {
+ self.weaponentity.state = WS_READY;
+ W_Hagar_Attack2_Load_Release();
+ }
+ }
else if (req == WR_PRECACHE)
{
precache_model ("models/weapons/g_hagar.md3");
if(!w_issilent)
{
if (w_random<0.15)
- sound(self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
else if (w_random<0.7)
- sound(self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
else
- sound(self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
}
}
else if(req == WR_PRECACHE)
self.event_damage = SUB_Null;
if(self.projectiledeathtype & HITTYPE_SECONDARY)
- RadiusDamage (self, self.owner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
else
- RadiusDamage (self, self.owner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
remove (self);
}
if(self.crouch)
spread = spread * autocvar_g_balance_hlac_primary_spread_crouchmod;
- W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_primary_damage);
+ W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_primary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
if (!g_norecoil)
{
}
missile = spawn ();
- missile.owner = self;
+ missile.owner = missile.realowner = self;
missile.classname = "hlacbolt";
missile.bot_dodge = TRUE;
if(self.crouch)
spread = spread * autocvar_g_balance_hlac_secondary_spread_crouchmod;
- W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_secondary_damage);
+ W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_secondary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
- missile.owner = self;
+ missile.owner = missile.realowner = self;
missile.classname = "hlacbolt";
missile.bot_dodge = TRUE;
org2 = w_org + w_backoff * 6;
pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
f = self.dmg_last - dmg_remaining_next;
self.dmg_last = dmg_remaining_next;
- RadiusDamage (self, self.owner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.owner, self.dmg_force * f, self.projectiledeathtype, world);
+ RadiusDamage (self, self.realowner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.realowner, self.dmg_force * f, self.projectiledeathtype, world);
self.projectiledeathtype |= HITTYPE_BOUNCE;
//RadiusDamage (self, world, self.dmg * f, self.dmg_edge * f, self.dmg_radius, world, self.dmg_force * f, self.projectiledeathtype, world);
local entity gren;
W_DecreaseAmmo(ammo_cells, autocvar_g_balance_hook_secondary_ammo, FALSE);
- W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CHAN_WEAPON, autocvar_g_balance_hook_secondary_damage);
+ W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CH_WEAPON_A, autocvar_g_balance_hook_secondary_damage);
gren = spawn ();
- gren.owner = self;
+ gren.owner = gren.realowner = self;
gren.classname = "hookbomb";
gren.bot_dodge = TRUE;
gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage;
if(self.hook)
{
// if hooked, no bombs, and increase the timer
- self.hook_refire = max(self.hook_refire, time + autocvar_g_balance_hook_primary_refire);
+ self.hook_refire = max(self.hook_refire, time + autocvar_g_balance_hook_primary_refire * W_WeaponRateFactor());
// hook also inhibits health regeneration, but only for 1 second
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
org2 = w_org + w_backoff * 2;
pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
#else
#ifdef SVQC
void(float imp) W_SwitchWeapon;
+void() W_LastWeapon;
void W_Laser_Touch (void)
{
self.event_damage = SUB_Null;
if (self.dmg)
- RadiusDamage (self, self.owner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
else
- RadiusDamage (self, self.owner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
remove (self);
}
s_forward = v_forward * cos(a * DEG2RAD) + v_up * sin(a * DEG2RAD);
if(nodamage)
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, 0);
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, 0);
else if(issecondary == 1)
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_secondary_damage);
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_secondary_damage);
else
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_primary_damage);
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_primary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
- missile.owner = self;
+ missile.owner = missile.realowner = self;
missile.classname = "laserbolt";
missile.dmg = 0;
if(!nodamage)
{
WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET);
sf = sf & 0x7F;
- if(sound_allowed(MSG_BROADCAST, self.owner))
+ if(sound_allowed(MSG_BROADCAST, self.realowner))
sf |= 0x80;
WriteByte(MSG_ENTITY, sf);
if(sf & 1)
{
- WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+ WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
}
if(sf & 2)
{
}
.entity gauntletbeam;
.float prevgauntletfire;
+entity lgbeam_owner_ent;
void gauntletbeam_think()
{
float damage, myforce, myradius;
myforce = autocvar_g_balance_laser_secondary_force;
myradius = autocvar_g_balance_laser_secondary_radius;
- self.owner.prevgauntletfire = time;
- if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK2)
+ self.realowner.prevgauntletfire = time;
+ if (self.realowner.weaponentity.state != WS_INUSE || self != self.realowner.gauntletbeam || self.realowner.deadflag != DEAD_NO || !self.realowner.BUTTON_ATCK2)
{
remove(self);
return;
self.nextthink = time;
- makevectors(self.owner.v_angle);
+ makevectors(self.realowner.v_angle);
float dt;
dt = frametime;
- W_SetupShot_Range(self.owner, TRUE, 0, "", 0, damage * dt, myradius);
- WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+ W_SetupShot_Range(self.realowner, TRUE, 0, "", 0, damage * dt, myradius);
+ if(!lgbeam_owner_ent)
+ {
+ lgbeam_owner_ent = spawn();
+ lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+ }
+ WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(self.owner));
// apply the damage
if(trace_ent)
// only play fire sound if 0.5 sec has passed since player let go the fire button
if(time - self.prevgauntletfire > 0.5)
{
- sound (self, CHAN_WEAPON, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_A, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
}
entity beam, oldself;
else
{
if(self.switchweapon == WEP_LASER) // don't do this if already switching
- W_SwitchWeapon (self.cnt);
+ W_LastWeapon();
}
}
}
org2 = w_org + w_backoff * 6;
pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
weapon_defaultspawnfunc(WEP_MINE_LAYER);
}
-void W_Mine_Stick ()
+void W_Mine_Stick (entity to)
{
- spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
// in order for mines to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile
newmine.bot_dodgerating = self.bot_dodgerating;
newmine.owner = self.owner;
+ newmine.realowner = self.realowner;
setsize(newmine, '-4 -4 -4', '4 4 4');
setorigin(newmine, self.origin);
setmodel(newmine, "models/mine.md3");
remove(self);
self = newmine;
+
+ if(to)
+ SetMovetypeFollow(self, to);
}
void W_Mine_Explode ()
{
if(other.takedamage == DAMAGE_AIM)
if(other.classname == "player")
- if(IsDifferentTeam(self.owner, other))
+ if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
- AnnounceTo(self.owner, "airshot");
+ AnnounceTo(self.realowner, "airshot");
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
- if (self.owner.weapon == WEP_MINE_LAYER)
+ if (self.realowner.weapon == WEP_MINE_LAYER)
{
entity oldself;
oldself = self;
- self = self.owner;
+ self = self.realowner;
if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
{
self.cnt = WEP_MINE_LAYER;
}
self = oldself;
}
- self.owner.minelayer_mines -= 1;
+ self.realowner.minelayer_mines -= 1;
remove (self);
}
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- if(self.movetype == MOVETYPE_NONE)
+ if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
self.velocity = self.oldvelocity;
- RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
- if (self.owner.weapon == WEP_MINE_LAYER)
+ if (self.realowner.weapon == WEP_MINE_LAYER)
{
entity oldself;
oldself = self;
- self = self.owner;
+ self = self.realowner;
if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
{
self.cnt = WEP_MINE_LAYER;
}
self = oldself;
}
- self.owner.minelayer_mines -= 1;
+ self.realowner.minelayer_mines -= 1;
remove (self);
}
void W_Mine_RemoteExplode ()
{
- if(self.owner.deadflag == DEAD_NO)
+ if(self.realowner.deadflag == DEAD_NO)
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
+ : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
)
{
W_Mine_DoRemoteExplode();
head = findradius(self.origin, autocvar_g_balance_minelayer_radius);
while(head)
{
- if(head == self.owner || !IsDifferentTeam(head, self.owner))
+ if(head == self.realowner || !IsDifferentTeam(head, self.realowner))
return;
head = head.chain;
}
{
float minecount;
entity mine;
- for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e)
+ for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == e)
minecount += 1;
return minecount;
entity head;
self.nextthink = time;
+
+ if(self.movetype == MOVETYPE_FOLLOW)
+ {
+ if(LostMovetypeFollow(self))
+ {
+ UnsetMovetypeFollow(self);
+ self.movetype = MOVETYPE_NONE;
+ }
+ }
// our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
// TODO: replace this mine_trigger.wav sound with a real countdown
if ((time > self.cnt) && (!self.mine_time))
{
if(autocvar_g_balance_minelayer_lifetime_countdown > 0)
- spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
self.mine_time = time + autocvar_g_balance_minelayer_lifetime_countdown;
self.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a team mate is near.
}
// a player's mines shall explode if he disconnects or dies
// TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
- if(self.owner.classname != "player" || self.owner.deadflag != DEAD_NO)
+ if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
{
other = world;
self.projectiledeathtype |= HITTYPE_BOUNCE;
while(head)
{
if(head.classname == "player" && head.deadflag == DEAD_NO)
- if(head != self.owner && IsDifferentTeam(head, self.owner)) // don't trigger for team mates
+ if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates
if(!self.mine_time)
{
- spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+ spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
self.mine_time = time + autocvar_g_balance_minelayer_time;
}
head = head.chain;
}
// remote detonation
- if (self.owner.weapon == WEP_MINE_LAYER)
- if (self.owner.deadflag == DEAD_NO)
+ if (self.realowner.weapon == WEP_MINE_LAYER)
+ if (self.realowner.deadflag == DEAD_NO)
if (self.minelayer_detonate)
W_Mine_RemoteExplode();
}
void W_Mine_Touch (void)
{
+ if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+ return; // we're already a stuck mine, why do we get called? TODO does this even happen?
+
PROJECTILE_TOUCH;
- if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))
- W_Mine_Stick();
- else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it
- self.velocity = '0 0 0';
+
+ if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+ {
+ // hit a player
+ // don't stick
+ }
+ else
+ {
+ W_Mine_Stick(other);
+ }
}
void W_Mine_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_minelayer_ammo, autocvar_g_balance_minelayer_reload_ammo);
- W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CHAN_WEAPON, autocvar_g_balance_minelayer_damage);
+ W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CH_WEAPON_A, autocvar_g_balance_minelayer_damage);
pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
mine = WarpZone_RefSys_SpawnSameRefSys(self);
- mine.owner = self;
+ mine.owner = mine.realowner = self;
if(autocvar_g_balance_minelayer_detonatedelay >= 0)
mine.spawnshieldtime = time + autocvar_g_balance_minelayer_detonatedelay;
else
entity mine;
float minfound;
- for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
+ for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == self)
{
if(detonate)
{
mine = find(world, classname, "mine");
while (mine)
{
- if (mine.owner != self)
+ if (mine.realowner != self)
{
mine = find(mine, classname, "mine");
continue;
// count potential damage according to type of target
if (targ == self)
selfdamage = selfdamage + d;
- else if (targ.team == self.team && teams_matter)
+ else if (targ.team == self.team && teamplay)
teamdamage = teamdamage + d;
else if (bot_shouldattack(targ))
enemydamage = enemydamage + d;
desirabledamage = enemydamage;
if (time > self.invincible_finished && time > self.spawnshieldtime)
desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
- if (teams_matter && self.team)
+ if (teamplay && self.team)
desirabledamage = desirabledamage - teamdamage;
mine = find(world, classname, "mine");
while (mine)
{
- if (mine.owner != self)
+ if (mine.realowner != self)
{
mine = find(mine, classname, "mine");
continue;
if (self.BUTTON_ATCK2)
{
if(W_PlacedMines(TRUE))
- sound (self, CHAN_WEAPON2, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_B, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
}
}
else if (req == WR_PRECACHE)
org2 = w_org + w_backoff * 12;
pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/mine_exp.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/mine_exp.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
float flying;
flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
- W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CHAN_WEAPON, 10000);
+ W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CH_WEAPON_A, 10000);
yoda = 0;
damage_goodhits = 0;
// teamcolor / hit beam effect
vector v;
v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
- if(teams_matter)
+ if(teamplay)
{
switch(self.team)
{
.float minstagib_nextthink;
-void minstagib_ammocheck (void)
+.float minstagib_needammo;
+void minstagib_stop_countdown(void)
{
- if (time < self.minstagib_nextthink || self.deadflag || gameover)
+ if (self.minstagib_needammo)
+ {
+ self.health = 100;
+ Send_CSQC_Centerprint_Generic_Expire(self, CPID_MINSTA_FINDAMMO);
+ }
+ self.minstagib_needammo = FALSE;
+}
+void minstagib_ammocheck(void)
+{
+ if (time < self.minstagib_nextthink)
return;
- if (self.ammo_cells <= 0)
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ if (self.deadflag || gameover || self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
+ minstagib_stop_countdown();
+ else
{
+ self.minstagib_needammo = TRUE;
if (self.health == 5)
{
- centerprint(self, "you're dead now...\n");
Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "terminated");
}
else if (self.health == 10)
{
- centerprint(self, "^11^7 second left to find some ammo\n");
Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "1");
}
else if (self.health == 20)
{
- centerprint(self, "^12^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "2");
}
else if (self.health == 30)
{
- centerprint(self, "^13^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "3");
}
else if (self.health == 40)
{
- centerprint(self, "^14^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "4");
}
else if (self.health == 50)
{
- centerprint(self, "^15^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "5");
}
else if (self.health == 60)
{
- centerprint(self, "^36^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "6");
}
else if (self.health == 70)
{
- centerprint(self, "^37^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "7");
}
else if (self.health == 80)
{
- centerprint(self, "^38^7 seconds left to find some ammo\n");
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "8");
}
else if (self.health == 90)
{
- centerprint(self, "^39^7 seconds left to find some ammo\n");
+ Send_CSQC_Centerprint_Generic(self, CPID_MINSTA_FINDAMMO, "^1%d^7 seconds left to find some ammo", 1, 9);
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
AnnounceTo(self, "9");
}
else if (self.health == 100)
{
- centerprint(self, "get some ammo or\nyou'll be dead in ^310^7 seconds...");
+ Send_CSQC_Centerprint_Generic(self, CPID_MINSTA_FINDAMMO, "get some ammo or\nyou'll be dead in ^3%d^7 seconds...", 1, 10);
Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
if not(self.flags & FL_GODMODE)
AnnounceTo(self, "10");
org2 = w_org + w_backoff * 6;
pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
precache_sound("weapons/neximpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = _("%s did the impossible");
+ w_deathtypestring = _("%s is now thinking with portals");
else if (req == WR_KILLMESSAGE)
w_deathtypestring = _("%s has been vaporized by %s");
return TRUE;
mydmg *= charge;
myforce *= charge;
- W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CHAN_WEAPON, mydmg);
+ W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CH_WEAPON_A, mydmg);
if(charge > autocvar_g_balance_nex_charge_animlimit && autocvar_g_balance_nex_charge_animlimit) // if the Nex is overcharged, we play an extra sound
{
- sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_animlimit) / (1 - 0.5 * autocvar_g_balance_nex_charge_animlimit), ATTN_NORM);
+ sound (self, CH_WEAPON_B, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_animlimit) / (1 - 0.5 * autocvar_g_balance_nex_charge_animlimit), ATTN_NORM);
}
yoda = 0;
org2 = w_org + w_backoff * 6;
pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
precache_sound("weapons/neximpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = _("%s did the impossible");
+ w_deathtypestring = _("%s is now thinking with portals");
else if (req == WR_KILLMESSAGE)
w_deathtypestring = _("%s has been vaporized by %s");
return TRUE;
void W_Porto_Success (void)
{
- if(self.owner == world)
+ if(self.realowner == world)
{
objerror("Cannot succeed successfully: no owner\n");
return;
}
- self.owner.porto_current = world;
+ self.realowner.porto_current = world;
remove(self);
}
string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo);
void W_Porto_Fail (float failhard)
{
- if(self.owner == world)
+ if(self.realowner == world)
{
objerror("Cannot fail successfully: no owner\n");
return;
}
// no portals here!
- Portal_ClearWithID(self.owner, self.portal_id);
- self.owner.porto_current = world;
+ Portal_ClearWithID(self.realowner, self.portal_id);
+ self.realowner.porto_current = world;
- if(!failhard && self.owner.playerid == self.playerid && self.owner.deadflag == DEAD_NO && !(self.owner.weapons & WEPBIT_PORTO))
+ if(!failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO))
{
setsize (self, '-16 -16 0', '16 16 32');
setorigin(self, self.origin + trace_plane_normal);
if(move_out_of_solid(self))
{
self.flags = FL_ITEM;
- self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
+ self.velocity = trigger_push_calculatevelocity(self.origin, self.realowner, 128);
tracetoss(self, self);
- if(vlen(trace_endpos - self.owner.origin) < 128)
+ if(vlen(trace_endpos - self.realowner.origin) < 128)
{
- W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
- centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+ W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity);
+ centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
}
}
}
void W_Porto_Remove (entity p)
{
- if(p.porto_current)
+ if(p.porto_current.realowner == p && p.porto_current.classname == "porto")
{
entity oldself;
oldself = self;
void W_Porto_Think (void)
{
trace_plane_normal = '0 0 0';
- if(self.owner.playerid != self.playerid)
+ if(self.realowner.playerid != self.playerid)
remove(self);
else
W_Porto_Fail(0);
return;
}
- if(self.owner.playerid != self.playerid)
+ if(self.realowner.playerid != self.playerid)
{
- sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
remove(self);
}
else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
{
- spamsound(self, CHAN_PROJECTILE, "porto/bounce.wav", VOL_BASE, ATTN_NORM);
+ spamsound(self, CH_SHOTS, "porto/bounce.wav", VOL_BASE, ATTN_NORM);
// just reflect
self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
}
else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
{
- sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
W_Porto_Fail(0);
}
else if(self.effects & EF_RED)
{
self.effects += EF_BLUE - EF_RED;
- if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+ if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
{
- sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM);
trace_plane_normal = norm;
- centerprint(self.owner, "^1In^7-portal created.");
+ centerprint(self.realowner, "^1In^7-portal created.");
self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * norm));
CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE, TRUE); // change type
}
else
{
- sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
trace_plane_normal = norm;
W_Porto_Fail(0);
}
}
else
{
- if(self.owner.portal_in.portal_id == self.portal_id)
+ if(self.realowner.portal_in.portal_id == self.portal_id)
{
- if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+ if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
{
- sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM);
trace_plane_normal = norm;
- centerprint(self.owner, "^4Out^7-portal created.");
+ centerprint(self.realowner, "^4Out^7-portal created.");
W_Porto_Success();
}
else
{
- sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
W_Porto_Fail(0);
}
}
else
{
- sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
W_Porto_Fail(0);
}
}
if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
- W_SetupShot (self, FALSE, 4, "porto/fire.wav", CHAN_WEAPON, 0);
+ W_SetupShot (self, FALSE, 4, "porto/fire.wav", CH_WEAPON_A, 0);
// always shoot from the eye
w_shotdir = v_forward;
w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
//pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
gren = spawn ();
- gren.owner = self;
+ gren.owner = gren.realowner = self;
gren.playerid = self.playerid;
gren.classname = "porto";
gren.bot_dodge = TRUE;
W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_rifle_reload_ammo);
- W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CHAN_WEAPON, (pDamage + pHeadshotAddedDamage) * pShots);
+ W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, (pDamage + pHeadshotAddedDamage) * pShots);
pointparticles(particleeffectnum("rifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
self.bot_secondary_riflemooth = 0;
if(self.bot_secondary_riflemooth == 0)
{
- if(bot_aim(autocvar_g_balance_rifle_primary_speed, 0, autocvar_g_balance_rifle_primary_lifetime, TRUE))
+ if(bot_aim(autocvar_g_balance_rifle_primary_speed, 0, autocvar_g_balance_rifle_primary_lifetime, FALSE))
{
self.BUTTON_ATCK = TRUE;
if(random() < 0.01) self.bot_secondary_riflemooth = 1;
}
else
{
- if(bot_aim(autocvar_g_balance_rifle_secondary_speed, 0, autocvar_g_balance_rifle_secondary_lifetime, TRUE))
+ if(bot_aim(autocvar_g_balance_rifle_secondary_speed, 0, autocvar_g_balance_rifle_secondary_lifetime, FALSE))
{
self.BUTTON_ATCK2 = TRUE;
if(random() < 0.03) self.bot_secondary_riflemooth = 0;
self.rifle_accumulator += autocvar_g_balance_rifle_primary_burstcost;
}
if (self.BUTTON_ATCK2)
- {
+ {
if (autocvar_g_balance_rifle_secondary)
{
if(autocvar_g_balance_rifle_secondary_reload)
if(!w_issilent)
{
if(w_random < 0.2)
- sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.4)
- sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.5)
- sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
}
}
else if(req == WR_PRECACHE)
void W_Rocket_Unregister()
{
- if(self.owner && self.owner.lastrocket == self)
+ if(self.realowner && self.realowner.lastrocket == self)
{
- self.owner.lastrocket = world;
- // self.owner.rl_release = 1;
+ self.realowner.lastrocket = world;
+ // self.realowner.rl_release = 1;
}
}
if(other.takedamage == DAMAGE_AIM)
if(other.classname == "player")
- if(IsDifferentTeam(self.owner, other))
+ if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
- AnnounceTo(self.owner, "airshot");
+ AnnounceTo(self.realowner, "airshot");
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
- if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+ if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
{
- if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+ if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
{
- self.owner.cnt = WEP_ROCKET_LAUNCHER;
- ATTACK_FINISHED(self.owner) = time;
- self.owner.switchweapon = w_getbestweapon(self.owner);
+ self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+ ATTACK_FINISHED(self.realowner) = time;
+ self.realowner.switchweapon = w_getbestweapon(self.realowner);
}
}
remove (self);
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
- if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+ if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
{
- if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+ if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
{
- self.owner.cnt = WEP_ROCKET_LAUNCHER;
- ATTACK_FINISHED(self.owner) = time;
- self.owner.switchweapon = w_getbestweapon(self.owner);
+ self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+ ATTACK_FINISHED(self.realowner) = time;
+ self.realowner.switchweapon = w_getbestweapon(self.realowner);
}
}
remove (self);
head = find(head, classname, "laser_target");
}
- //bprint(selected.owner.netname);
+ //bprint(selected.realowner.netname);
//bprint("\n");
return selected;
}
void W_Rocket_RemoteExplode()
{
- if(self.owner.deadflag == DEAD_NO)
- if(self.owner.lastrocket)
+ if(self.realowner.deadflag == DEAD_NO)
+ if(self.realowner.lastrocket)
{
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
+ : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
)
{
W_Rocket_DoRemoteExplode();
self.velocity = self.velocity + v_forward * min(autocvar_g_balance_rocketlauncher_speedaccel * g_weaponspeedfactor * frametime, velspeed);
// laser guided, or remote detonation
- if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+ if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
{
- if(self == self.owner.lastrocket)
- if not(self.owner.rl_release)
+ if(self == self.realowner.lastrocket)
+ if not(self.realowner.rl_release)
if not(self.BUTTON_ATCK2)
if(autocvar_g_balance_rocketlauncher_guiderate)
if(time > self.pushltime)
- if(self.owner.deadflag == DEAD_NO)
+ if(self.realowner.deadflag == DEAD_NO)
{
f = autocvar_g_balance_rocketlauncher_guideratedelay;
if(f)
velspeed = vlen(self.velocity);
- makevectors(self.owner.v_angle);
- desireddir = WarpZone_RefSys_TransformVelocity(self.owner, self, v_forward);
- desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs);
+ makevectors(self.realowner.v_angle);
+ desireddir = WarpZone_RefSys_TransformVelocity(self.realowner, self, v_forward);
+ desiredorigin = WarpZone_RefSys_TransformOrigin(self.realowner, self, self.realowner.origin + self.realowner.view_ofs);
olddir = normalize(self.velocity);
// now it gets tricky... we want to move like some curve to approximate the target direction
{
pointparticles(particleeffectnum("rocket_guide"), self.origin, self.velocity, 1);
// TODO add a better sound here
- sound (self.owner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
+ sound (self.realowner, CH_WEAPON_B, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
self.count = 1;
}
}
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_rocketlauncher_ammo, autocvar_g_balance_rocketlauncher_reload_ammo);
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", CHAN_WEAPON, autocvar_g_balance_rocketlauncher_damage);
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", CH_WEAPON_A, autocvar_g_balance_rocketlauncher_damage);
pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = WarpZone_RefSys_SpawnSameRefSys(self);
- missile.owner = self;
+ missile.owner = missile.realowner = self;
self.lastrocket = missile;
if(autocvar_g_balance_rocketlauncher_detonatedelay >= 0)
missile.spawnshieldtime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
missile = find(world, classname, "rocket");
while (missile)
{
- if (missile.owner != self)
+ if (missile.realowner != self)
{
missile = find(missile, classname, "rocket");
continue;
// count potential damage according to type of target
if (targ == self)
selfdamage = selfdamage + d;
- else if (targ.team == self.team && teams_matter)
+ else if (targ.team == self.team && teamplay)
teamdamage = teamdamage + d;
else if (bot_shouldattack(targ))
enemydamage = enemydamage + d;
desirabledamage = enemydamage;
if (time > self.invincible_finished && time > self.spawnshieldtime)
desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
- if (teams_matter && self.team)
+ if (teamplay && self.team)
desirabledamage = desirabledamage - teamdamage;
missile = find(world, classname, "rocket");
while (missile)
{
- if (missile.owner != self)
+ if (missile.realowner != self)
{
missile = find(missile, classname, "rocket");
continue;
if (self.BUTTON_ATCK2)
{
rockfound = 0;
- for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self)
+ for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.realowner == self)
{
if(!rock.rl_detonate_later)
{
}
}
if(rockfound)
- sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_B, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
}
}
}
org2 = w_org + w_backoff * 12;
pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
void Seeker_Missile_Explode ()
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
remove (self);
}
if (self.health <= 0)
return;
- if (self.owner == attacker)
+ if (self.realowner == attacker)
self.health = self.health - (damage * 0.25);
else
self.health = self.health - damage;
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_seeker_missile_ammo, autocvar_g_balance_seeker_reload_ammo);
makevectors(self.v_angle);
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", CHAN_WEAPON, 0);
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", CH_WEAPON_A, 0);
w_shotorg += f_diff;
pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
//self.detornator = FALSE;
missile = spawn();
- missile.owner = self;
+ missile.owner = missile.realowner = self;
missile.classname = "seeker_missile";
missile.bot_dodge = TRUE;
missile.bot_dodgerating = autocvar_g_balance_seeker_missile_damage;
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
remove (self);
}
f_diff = '+1.25 +3.75 0';
break;
}
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_flac_damage);
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", CH_WEAPON_A, autocvar_g_balance_seeker_flac_damage);
w_shotorg += f_diff;
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
{
entity tag;
for(tag = world; (tag = find(tag, classname, "tag_tracker")); )
- if ((tag.owner == isowner) && (tag.tag_target == istarget))
+ if ((tag.realowner == isowner) && (tag.tag_target == istarget))
return tag;
return world;
{
entity tracker, closest_target;
- for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.owner == self)
+ for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.realowner == self)
{
if (closest_target)
{
entity oldself,oldenemy;
self.cnt = self.cnt - 1;
- if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER))
+ if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER))
{
remove(self);
return;
}
- self.nextthink = time + autocvar_g_balance_seeker_missile_delay;
+ self.nextthink = time + autocvar_g_balance_seeker_missile_delay * W_WeaponRateFactor();
oldself = self;
- self = self.owner;
+ self = self.realowner;
oldenemy = self.enemy;
self.enemy = oldself.enemy;
void Seeker_Tracker_Think()
{
// commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up
- if ((self.owner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER)
+ if ((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER)
|| (time > self.tag_time + autocvar_g_balance_seeker_tag_tracker_lifetime))
{
if (self)
// ============================
void Seeker_Tag_Explode ()
{
- //if(other==self.owner)
+ //if(other==self.realowner)
// return;
Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self);
vector org2;
entity e;
- dir = normalize (self.owner.origin - self.origin);
+ PROJECTILE_TOUCH;
+
+ dir = normalize (self.realowner.origin - self.origin);
org2 = findbetterlocation (self.origin, 8);
te_knightspike(org2);
if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
{
// check to see if this person is already tagged by me
- entity tag = Seeker_Tagged_Info(self.owner, other);
+ entity tag = Seeker_Tagged_Info(self.realowner, other);
if (tag != world)
{
}
else
{
- //sprint(self.owner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
+ //sprint(self.realowner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
e = spawn();
e.cnt = autocvar_g_balance_seeker_missile_count;
e.classname = "tag_tracker";
e.owner = self.owner;
+ e.realowner = self.realowner;
if (autocvar_g_balance_seeker_type == 1)
{
if (autocvar_g_balance_seeker_type == 1)
{
- WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.owner, 0, other, wps_tag_tracker, TRUE);
+ WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.realowner, 0, other, wps_tag_tracker, TRUE, RADARICON_TAGGED, '0.5 1 0');
WaypointSprite_UpdateRule(other.wps_tag_tracker, 0, SPRITERULE_DEFAULT);
}
}
local entity missile;
W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_seeker_tag_ammo, autocvar_g_balance_seeker_reload_ammo);
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CH_WEAPON_A, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
missile = spawn();
- missile.owner = self;
+ missile.owner = missile.realowner = self;
missile.classname = "seeker_tag";
missile.bot_dodge = TRUE;
missile.bot_dodgerating = 50;
missile.nextthink = time + autocvar_g_balance_seeker_tag_lifetime;
missile.movetype = MOVETYPE_FLY;
missile.solid = SOLID_BBOX;
- missile.owner = self;
missile.takedamage = DAMAGE_YES;
missile.event_damage = Seeker_Tag_Explode;
if(!w_issilent)
{
if (w_random<0.15)
- sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/tagexp1.wav", 1, ATTN_NORM);
else if (w_random<0.7)
- sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/tagexp2.wav", 1, ATTN_NORM);
else
- sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/tagexp3.wav", 1, ATTN_NORM);
}
}
else if(w_deathtype & HITTYPE_HEADSHOT)
{
if(!w_issilent)
- sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/tag_impact.wav", 1, ATTN_NORM);
}
else
{
if(!w_issilent)
{
if (w_random<0.15)
- sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/seekerexp1.wav", 1, ATTN_NORM);
else if (w_random<0.7)
- sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/seekerexp2.wav", 1, ATTN_NORM);
else
- sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/seekerexp3.wav", 1, ATTN_NORM);
}
}
}
W_DecreaseAmmo(ammo_shells, ammoamount, autocvar_g_balance_shotgun_reload_ammo);
- W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CHAN_WEAPON, d * bullets);
+ W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
for (sc = 0;sc < bullets;sc = sc + 1)
fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
endFireBallisticBullet();
W_AttachToShotorg(flash, '5 0 0');
}
+entity lgbeam_owner_ent;
void shotgun_meleethink (void)
{
// store time when we started swinging down inside self.cnt
if(!self.cnt)
self.cnt = time;
- makevectors(self.owner.v_angle);
+ makevectors(self.realowner.v_angle);
vector angle;
angle = v_forward;
float f;
f = (self.cnt + meleetime - time) / meleetime * 2 - 1;
vector targpos;
- targpos = self.owner.origin + self.owner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
+ targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
- WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+ if(!lgbeam_owner_ent)
+ {
+ lgbeam_owner_ent = spawn();
+ lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+ }
+ WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner));
// apply the damage, also remove self
if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body"))
{
vector force;
force = angle * autocvar_g_balance_shotgun_secondary_force;
- if(accuracy_isgooddamage(self.owner, trace_ent))
- accuracy_add(self.owner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
- Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force);
+ if(accuracy_isgooddamage(self.realowner, trace_ent))
+ accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
+ Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force);
remove(self);
}
- else if(time >= self.cnt + meleetime || (self.owner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
+ else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
remove(self);
else // continue swinging the weapon in hope of hitting someone :)
self.nextthink = time;
void W_Shotgun_Attack2 (void)
{
- sound (self, CHAN_PROJECTILE, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
+ sound (self, CH_SHOTS, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_shotgun_secondary_animtime, w_ready);
entity meleetemp;
meleetemp = spawn();
- meleetemp.owner = self;
+ meleetemp.owner = meleetemp.realowner = self;
meleetemp.think = shotgun_meleethink;
- meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay;
+ meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay * W_WeaponRateFactor();
W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_shotgun_secondary_damage, autocvar_g_balance_shotgun_secondary_melee_range);
}
if(vlen(self.origin-self.enemy.origin) <= autocvar_g_balance_shotgun_secondary_melee_range)
self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
else
- self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+ {
+ if(autocvar_g_antilag_bullets)
+ self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+ else
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_shotgun_primary_speed, 0, 0.001, FALSE);
+ }
+
else if (req == WR_THINK)
{
if(autocvar_g_balance_shotgun_reload_ammo && self.clip_load < autocvar_g_balance_shotgun_primary_ammo) // forced reload
if(weapon_prepareattack(0, autocvar_g_balance_shotgun_primary_animtime))
{
W_Shotgun_Attack();
- self.shotgun_primarytime = time + autocvar_g_balance_shotgun_primary_refire;
+ self.shotgun_primarytime = time + autocvar_g_balance_shotgun_primary_refire * W_WeaponRateFactor();
weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_shotgun_primary_animtime, w_ready);
}
}
if(!w_issilent && time - self.prevric > 0.25)
{
if(w_random < 0.0165)
- sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.033)
- sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.05)
- sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
self.prevric = time;
}
}
precache_sound("weapons/ric3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = _("%s did the impossible");
+ w_deathtypestring = _("%s is now thinking with portals");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
#else
#ifdef SVQC
//#define TUBA_NOTE(n) strcat("weapons/tuba_note", ftos(n), ".wav")
-.float tuba_notecount;
.entity tuba_note;
.float tuba_smoketime;
// kind of tuba currently is player slot number, or team number if in
// teamplay
// that way, holes in the range of notes are "plugged"
- if(teams_matter)
+ if(teamplay)
{
if(pl.team == COLOR_TEAM2 || pl.team == COLOR_TEAM4)
note += 3;
WriteCoord(MSG_ENTITY, self.origin_x);
WriteCoord(MSG_ENTITY, self.origin_y);
WriteCoord(MSG_ENTITY, self.origin_z);
- WriteByte(MSG_ENTITY, self.owner != to);
+ WriteByte(MSG_ENTITY, self.realowner != to);
}
return TRUE;
}
entity e;
if(time > self.teleport_time)
{
- self.owner.tuba_note = world;
+ self.realowner.tuba_note = world;
remove(self);
return;
}
self.nextthink = time;
dist_mult = autocvar_g_balance_tuba_attenuation / autocvar_snd_soundradius;
FOR_EACH_REALCLIENT(e)
- if(e != self.owner)
+ if(e != self.realowner)
{
v = self.origin - (e.origin + e.view_ofs);
vol0 = max(0, 1 - vlen(v) * dist_mult);
dir0 = normalize(v);
- v = self.owner.origin - (e.origin + e.view_ofs);
+ v = self.realowner.origin - (e.origin + e.view_ofs);
vol1 = max(0, 1 - vlen(v) * dist_mult);
dir1 = normalize(v);
if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume
{
- setorigin(self, self.owner.origin);
+ setorigin(self, self.realowner.origin);
self.SendFlags |= 1;
break;
}
if(dir0 * dir1 < 0.9994) // 2 degrees change in angle
{
- setorigin(self, self.owner.origin);
+ setorigin(self, self.realowner.origin);
self.SendFlags |= 1;
break;
}
void W_Tuba_Attack(float hittype)
{
vector o;
- float c, n;
+ float n;
W_SetupShot(self, FALSE, 2, "", 0, autocvar_g_balance_tuba_damage);
- if(self.tuba_notecount)
- {
- self.tuba_notecount = FALSE;
- c = CHAN_WEAPON;
- }
- else
- {
- self.tuba_notecount = TRUE;
- c = CHAN_WEAPON2;
- }
n = Tuba_GetNote(self, hittype);
if not(self.tuba_note)
{
self.tuba_note = spawn();
- self.tuba_note.owner = self;
+ self.tuba_note.owner = self.tuba_note.realowner = self;
self.tuba_note.cnt = n;
self.tuba_note.think = W_Tuba_NoteThink;
self.tuba_note.nextthink = time;
Net_LinkEntity(self.tuba_note, FALSE, 0, W_Tuba_NoteSendEntity);
}
- self.tuba_note.teleport_time = time + autocvar_g_balance_tuba_refire * 2; // so it can get prolonged safely
+ self.tuba_note.teleport_time = time + autocvar_g_balance_tuba_refire * 2 * W_WeaponRateFactor(); // so it can get prolonged safely
//sound(self, c, TUBA_NOTE(n), bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1), autocvar_g_balance_tuba_attenuation);
RadiusDamage(self, self, autocvar_g_balance_tuba_damage, autocvar_g_balance_tuba_edgedamage, autocvar_g_balance_tuba_radius, world, autocvar_g_balance_tuba_force, hittype | WEP_TUBA, world);
weapon_setup(WEP_TUBA);
self.current_ammo = ammo_none;
}
+ else if (req == WR_RELOAD)
+ {
+ // TODO switch to alternate instruments :)
+ }
else if (req == WR_CHECKAMMO1)
return TRUE; // TODO use fuel?
else if (req == WR_CHECKAMMO2)
#ifdef SVQC
// leilei's fancy muzzleflash stuff
-void UZI_Flash_Go()
-{
+void UZI_Flash_Go()
+{
self.frame = self.frame + 2;
self.scale = self.scale * 0.5;
self.alpha = self.alpha - 0.25;
{
self.think = SUB_Remove;
self.nextthink = time;
- self.owner.muzzle_flash = world;
+ self.realowner.muzzle_flash = world;
return;
}
-
+
}
void UziFlash()
-{
+{
if (self.muzzle_flash == world)
- self.muzzle_flash = spawn();
-
+ self.muzzle_flash = spawn();
+
// muzzle flash for 1st person view
setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
-
+
self.muzzle_flash.scale = 0.75;
self.muzzle_flash.think = UZI_Flash_Go;
self.muzzle_flash.nextthink = time + 0.02;
self.muzzle_flash.alpha = 0.75;
self.muzzle_flash.angles_z = random() * 180;
self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
- self.muzzle_flash.owner = self;
+ self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
}
void W_UZI_Attack (float deathtype)
{
- W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
{
float uzi_spread;
- W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo);
-
- if (self.BUTTON_ATCK)
- weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
- else
+ if (!self.BUTTON_ATCK)
{
- ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
- weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
+ w_ready();
return;
}
w_ready();
return;
}
-
- W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+
+ W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo);
+
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage);
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
self.punchangle_y = random () - 0.5;
}
-
+
uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
-
+
self.misc_bulletcounter = self.misc_bulletcounter + 1;
-
+
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
UziFlash();
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
-
+
if (autocvar_g_casings >= 2) // casing code
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
+
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
}
void uzi_mode1_fire_burst()
{
- W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage);
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
self.punchangle_y = random () - 0.5;
}
-
+
fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
-
-
+
+
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
UziFlash();
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
-
+
if (autocvar_g_casings >= 2) // casing code
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
{
weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_refire, uzi_mode1_fire_burst);
}
-
+
}
void spawnfunc_weapon_machinegun(); // defined in t_items.qc
{
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, 0))
- {
+ {
self.misc_bulletcounter = 0;
uzi_mode1_fire_auto();
}
-
+
if(self.BUTTON_ATCK2)
if(weapon_prepareattack(1, 0))
{
if (!weapon_action(self.weapon, WR_CHECKAMMO2))
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
W_SwitchWeapon_Force(self, w_getbestweapon(self));
w_ready();
}
else
{
-
+
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, 0))
{
pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
if(!w_issilent)
if(w_random < 0.05)
- sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.1)
- sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
else if(w_random < 0.2)
- sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
}
else if(req == WR_PRECACHE)
{
precache_sound("weapons/ric3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = _("%s did the impossible");
+ w_deathtypestring = _("%s is now thinking with portals");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
}
.float waypointsprite_pingtime;
+.float waypointsprite_helpmetime;
void WaypointSprite_Ping(entity e)
{
// anti spam
e.SendFlags |= 32;
}
+float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
+
+void WaypointSprite_HelpMePing(entity e)
+{
+ WaypointSprite_Ping(e);
+ e.waypointsprite_helpmetime = time + waypointsprite_deployed_lifetime;
+ e.SendFlags |= 32;
+}
+
void WaypointSprite_FadeOutIn(entity e, float t)
{
if(!e.fade_time)
e.SendFlags |= 16;
}
-float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
void WaypointSprite_Init()
{
waypointsprite_limitedrange = autocvar_g_waypointsprite_limitedrange;
{
// personal waypoints
if(self.enemy)
- if(self.enemy != other)
+ if(self.enemy != e)
return FALSE;
// team waypoints
if(self.team && self.rule == SPRITERULE_DEFAULT)
{
- if(self.team != other.team)
+ if(self.team != e.team)
return FALSE;
- if(other.classname != "player")
+ if(e.classname != "player")
return FALSE;
}
return TRUE;
}
+entity WaypointSprite_getviewentity(entity e)
+{
+ if(e.classname == "spectator")
+ e = e.enemy;
+ /* TODO idea (check this breaks nothing)
+ else if(e.classname == "observer")
+ e = world;
+ */
+ return e;
+}
+
+float WaypointSprite_isteammate(entity e, entity e2)
+{
+ if(teamplay)
+ {
+ if(e2.team != e.team)
+ return FALSE;
+ }
+ else
+ {
+ if(e2 != e)
+ return FALSE;
+ }
+ return TRUE;
+}
+
float WaypointSprite_Customize()
{
// this is not in SendEntity because it shall run every frame, not just every update
// make spectators see what the player would see
entity e;
- e = other;
- if(e.classname == "spectator")
- e = e.enemy;
+ e = WaypointSprite_getviewentity(other);
+
+ // as a GENERAL rule:
+ // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
+ // but only apply this to real players, not to spectators
+ if(g_minstagib && (self.owner.items & IT_STRENGTH) && (e == other))
+ {
+ if(!WaypointSprite_isteammate(self.owner, e))
+ return FALSE;
+ }
return self.waypointsprite_visible_for_player(e);
}
WriteByte(MSG_ENTITY, self.colormod_x * 255.0);
WriteByte(MSG_ENTITY, self.colormod_y * 255.0);
WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
+
+ if(WaypointSprite_isteammate(self.owner, WaypointSprite_getviewentity(to)))
+ {
+ dt = (self.waypointsprite_helpmetime - time) / 0.1;
+ if(dt < 0)
+ dt = 0;
+ if(dt > 255)
+ dt = 255;
+ WriteByte(MSG_ENTITY, dt);
+ }
+ else
+ WriteByte(MSG_ENTITY, 0);
}
return TRUE;
entity ref, vector ofs, // position
entity showto, float t, // show to whom? Use a flag to indicate a team
entity own, .entity ownfield, // remove when own gets killed
- float hideable // true when it should be controlled by cl_hidewaypoints
+ float hideable, // true when it should be controlled by cl_hidewaypoints
+ float icon, vector rgb // initial icon and color
)
{
entity wp;
wp.customizeentityforclient = WaypointSprite_Customize;
wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
wp.reset2 = WaypointSprite_Reset;
+ wp.cnt = icon;
+ wp.colormod = rgb;
Net_LinkEntity(wp, FALSE, 0, WaypointSprite_SendEntity);
return wp;
}
string spr,
vector ofs,
entity own,
- .entity ownfield
+ .entity ownfield,
+ float icon, vector rgb // initial icon and color
)
{
- return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE);
+ return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE, icon, rgb);
}
.entity waypointsprite_deployed_fixed;
entity WaypointSprite_DeployFixed(
string spr,
float limited_range,
- vector ofs
+ vector ofs,
+ float icon, vector rgb // initial icon and color
)
{
float t, maxdistance;
- if(teams_matter)
+ if(teamplay)
t = self.team;
else
t = 0;
maxdistance = waypointsprite_limitedrange;
else
maxdistance = 0;
- return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
+ return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE, icon, rgb);
}
.entity waypointsprite_deployed_personal;
entity WaypointSprite_DeployPersonal(
string spr,
- vector ofs
+ vector ofs,
+ float icon, vector rgb // initial icon and color
)
{
- return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE);
+ return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE, icon, rgb);
}
.entity waypointsprite_attached;
.entity waypointsprite_attachedforcarrier;
entity WaypointSprite_Attach(
string spr,
- float limited_range
+ float limited_range,
+ float icon, vector rgb // initial icon and color
)
{
float t, maxdistance;
if(self.waypointsprite_attachedforcarrier)
return world; // can't attach to FC
- if(teams_matter)
+ if(teamplay)
t = self.team;
else
t = 0;
maxdistance = waypointsprite_limitedrange;
else
maxdistance = 0;
- return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
+ return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE, icon, rgb);
}
entity WaypointSprite_AttachCarrier(
string spr,
- entity carrier
+ entity carrier,
+ float icon, vector rgb // initial icon and color
)
{
entity e;
WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
- e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
+ e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE, icon, rgb);
if(e)
{
WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent) * 2);
return transform;
}
-vector AnglesTransform_Divide(vector to_transform, vector from_transform)
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
{
return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
}
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
+{
+ return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
+}
+
vector AnglesTransform_Normalize(vector t, float minimize_roll)
{
float need_flip;
#endif
vector AnglesTransform_Apply(vector transform, vector v);
-vector AnglesTransform_Multiply(vector t1, vector t2);
+vector AnglesTransform_Multiply(vector t1, vector t2); // A B
vector AnglesTransform_Invert(vector transform);
vector AnglesTransform_TurnDirectionFU(vector transform);
vector AnglesTransform_TurnDirectionFR(vector transform);
-vector AnglesTransform_Divide(vector to_transform, vector from_transform);
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform); // A B^-1
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform); // A^-1 B
vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90)
org = R_SetView3fv(VF_ORIGIN);
ang = R_SetView3fv(VF_ANGLES);
+#ifdef WORKAROUND_XON010
+ float dirty;
+ dirty = checkextension("DP_CSQC_ROTATEMOVES");
+#endif
e = WarpZone_Find(org, org);
if(e)
{
org = WarpZone_TransformOrigin(e, org);
ang = WarpZone_TransformVAngles(e, ang);
+#ifdef WORKAROUND_XON010
+ dirty = 1;
+#endif
WarpZone_View_Inside();
}
else
rick *= f;
R_SetView(VF_CL_VIEWANGLES_Z, rick);
+#ifdef WORKAROUND_XON010
+ if(ang_z > 1 || ang_z < -1)
+ dirty = 1;
+#endif
ang_z *= f;
#endif
+#ifdef WORKAROUND_XON010
+ if(dirty)
+ {
+#endif
R_SetView(VF_ORIGIN, org);
R_SetView(VF_ANGLES, ang);
+#ifdef WORKAROUND_XON010
+ }
+#endif
nearclip = '0 0 1' * (cvar("r_nearclip") * 1.125);
corner0 = cs_unproject('0 0 0' + nearclip);
void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
{
- e.warpzone_transform = AnglesTransform_Divide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
+ e.warpzone_transform = AnglesTransform_RightDivide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
e.warpzone_shift = AnglesTransform_PrePostShift_GetPostShift(my_org, e.warpzone_transform, other_org);
e.warpzone_origin = my_org;
e.warpzone_targetorigin = other_org;
break;
}
if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
- forent.dphitcontentsmask |= DPCONTENTS_SOLID;
+ BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
// if starting in warpzone, first transform
wz = WarpZone_Find(org + mi, org + ma);
// we hit a warpzone... so, let's perform the trace after the warp again
org = WarpZone_TransformOrigin(wz, trace_endpos);
end = WarpZone_TransformOrigin(wz, end);
+
+ // we got warped, so let's step back a bit
+ tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, forent);
+ org = trace_endpos;
}
WarpZone_MakeAllOther();
:fail
if(contentshack)
- forent.dphitcontentsmask &~= DPCONTENTS_SOLID;
+ BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
trace_startsolid = sol;
v_forward = vf;
v_right = vr;
tracetoss(e, forent);
if(cb)
cb(e.origin, trace_endpos, trace_endpos);
- e.origin = trace_endpos;
- dt = vlen(e.origin - o0) / vlen(e.velocity);
+ dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
WarpZone_tracetoss_time += dt;
+ e.origin = trace_endpos;
e.velocity_z -= dt * g;
if(trace_fraction >= 1)
break;
// we hit a warpzone... so, let's perform the trace after the warp again
e.origin = WarpZone_TransformOrigin(wz, e.origin);
e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
+
+ // we got warped, so let's step back a bit
+ e.velocity = -e.velocity;
+ tracetoss(e, forent);
+ dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
+ WarpZone_tracetoss_time -= dt;
+ e.origin = trace_endpos;
+ e.velocity = -e.velocity;
}
WarpZone_MakeAllOther();
:fail
t = AnglesTransform_Invert(me.WarpZone_refsys_incremental_transform);
s = AnglesTransform_PrePostShift_GetPostShift(me.WarpZone_refsys_incremental_shift, t, '0 0 0');
WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
- WarpZone_Accumulator_Add(me.WarpZone_refsys, ref);
+ WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys);
me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
}
float warpzone_warpzones_exist;
float warpzone_cameras_exist;
-const void func_null(void); // never assign to this one please
-
.float warpzone_isboxy;
.vector warpzone_shift;
.vector warpzone_origin;
vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang);
vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang);
entity WarpZone_RefSys_SpawnSameRefSys(entity me);
+
+#ifndef BITCLR
+# define BITCLR(a,b) ((a) - ((a) & (b)))
+#endif
+#ifndef BITSET
+# define BITSET(a,b) ((a) | (b))
+#endif
+#ifndef BITXOR
+# define BITXOR(a,b) (((a) | (b)) - ((a) & (b)))
+#endif
+#ifndef BITCLR_ASSIGN
+# define BITCLR_ASSIGN(a,b) ((a) = (a) - ((a) & (b)))
+#endif
+#ifndef BITSET_ASSIGN
+# define BITSET_ASSIGN(a,b) ((a) |= (b))
+#endif
+#ifndef BITXOR_ASSIGN
+# define BITXOR_ASSIGN(a,b) ((a) = ((a) | (b)) - ((a) & (b)))
+#endif
+// for think function
+.vector warpzone_save_origin;
+.vector warpzone_save_angles;
+.vector warpzone_save_eorigin;
+.vector warpzone_save_eangles;
+
+// for all entities
.vector warpzone_oldorigin, warpzone_oldvelocity, warpzone_oldangles;
.float warpzone_teleport_time;
+.float warpzone_teleport_finishtime;
.entity warpzone_teleport_zone;
void WarpZone_StoreProjectileData(entity e)
void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
{
- vector from;
-
- makevectors (to_angles);
-
- from = player.origin;
setorigin (player, to);
player.oldorigin = to; // for DP's unsticking
player.angles = to_angles;
player.fixangle = TRUE;
player.velocity = to_velocity;
- if(player.effects & EF_TELEPORT_BIT)
- player.effects &~= EF_TELEPORT_BIT;
- else
- player.effects |= EF_TELEPORT_BIT;
+ BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
if(player.classname == "player")
- player.flags &~= FL_ONGROUND;
+ BITCLR_ASSIGN(player.flags, FL_ONGROUND);
WarpZone_PostTeleportPlayer_Callback(player);
}
return TRUE;
}
-float WarpZone_Teleport(entity player)
+#define WARPZONE_TELEPORT_FIXSOLID(ret) \
+ do \
+ { \
+ setorigin(player, o1 - player.view_ofs); \
+ if(WarpZoneLib_MoveOutOfSolid(player)) \
+ { \
+ o1 = player.origin + player.view_ofs; \
+ setorigin(player, o0 - player.view_ofs); \
+ } \
+ else \
+ { \
+ print("would have to put player in solid, won't do that\n"); \
+ setorigin(player, o0 - player.view_ofs); \
+ return (ret); \
+ } \
+ } \
+ while(0)
+#define WARPZONE_TELEPORT_DOTELEPORT() \
+ do \
+ { \
+ WarpZone_RefSys_Add(player, wz); \
+ WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1); \
+ WarpZone_StoreProjectileData(player); \
+ player.warpzone_teleport_time = time; \
+ player.warpzone_teleport_finishtime = time; \
+ player.warpzone_teleport_zone = wz; \
+ } \
+ while(0)
+
+float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
{
- vector o0, a0, v0, o1, a1, v1;
+ vector o0, a0, v0, o1, a1, v1, o10;
o0 = player.origin + player.view_ofs;
v0 = player.velocity;
a0 = player.angles;
- if(WarpZone_PlaneDist(self, o0) >= 0) // wrong side of the trigger_warpzone
- return 2;
- // no failure, we simply don't want to teleport yet; TODO in
- // this situation we may want to create a temporary clone
- // entity of the player to fix graphics glitch
-
- o1 = WarpZone_TransformOrigin(self, o0);
- v1 = WarpZone_TransformVelocity(self, v0);
+ o10 = o1 = WarpZone_TransformOrigin(wz, o0);
+ v1 = WarpZone_TransformVelocity(wz, v0);
if(clienttype(player) != CLIENTTYPE_NOTACLIENT)
- a1 = WarpZone_TransformVAngles(self, player.v_angle);
+ a1 = WarpZone_TransformVAngles(wz, player.v_angle);
else
- a1 = WarpZone_TransformAngles(self, a0);
+ a1 = WarpZone_TransformAngles(wz, a0);
- // put him inside solid
- tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
- if(trace_startsolid)
+ if(f0 != 0 || f1 != 0)
{
- vector mi, ma;
- mi = player.mins;
- ma = player.maxs;
- setsize(player, mi - player.view_ofs, ma - player.view_ofs);
- setorigin(player, o1);
- if(WarpZoneLib_MoveOutOfSolid(player))
- {
- o1 = player.origin;
- setsize(player, mi, ma);
- setorigin(player, o0);
- }
- else
+ // retry last move but behind the warpzone!
+ // we must first go back as far as we can, then forward again, to not cause double touch events!
+
+ tracebox(o1 - player.view_ofs + v1 * frametime * f1, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f0, MOVE_WORLDONLY, player);
{
- print("would have to put player in solid, won't do that\n");
- setsize(player, mi, ma);
- setorigin(player, o0 - player.view_ofs);
- return 0; // cannot fix
+ entity own;
+ own = player.owner;
+ player.owner = world;
+ tracebox(trace_endpos, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f1, MOVE_NORMAL, player); // this should get us through the warpzone
+ player.owner = own;
}
+ o1 = trace_endpos + player.view_ofs;
+
+ float d, dv, md;
+ md = max(vlen(player.mins), vlen(player.maxs));
+ d = WarpZone_TargetPlaneDist(wz, o1);
+ dv = WarpZone_TargetPlaneDist(wz, v1);
+ if(d < 0)
+ o1 = o1 - v1 * (d / dv);
}
- if(WarpZone_TargetPlaneDist(self, o1) <= 0)
- {
- print("inconsistent warp zones or evil roundoff error\n");
- return 0;
- }
+ // put him inside solid
+ tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
+ if(trace_startsolid)
+ WARPZONE_TELEPORT_FIXSOLID(0);
+
+ WARPZONE_TELEPORT_DOTELEPORT();
- //print(sprintf("warpzone: %f %f %f -> %f %f %f\n", o0_x, o0_y, o0_z, o1_x, o1_y, o1_z));
+ // prevent further teleports back
+ float dt = (o1 - o10) * v1 * (1 / (v1 * v1));
+ if(dt < sys_frametime)
+ player.warpzone_teleport_finishtime += sys_frametime - dt;
- //o1 = trace_endpos;
- WarpZone_RefSys_Add(player, self);
- WarpZone_TeleportPlayer(self, player, o1 - player.view_ofs, a1, v1);
- WarpZone_StoreProjectileData(player);
- player.warpzone_teleport_time = time;
- player.warpzone_teleport_zone = self;
#ifndef WARPZONE_USE_FIXANGLE
- // instead of fixangle, send the transform to the client for smoother operation
- player.fixangle = FALSE;
-
- entity ts = spawn();
- setmodel(ts, "null");
- ts.SendEntity = WarpZone_Teleported_Send;
- ts.SendFlags = 0xFFFFFF;
- ts.drawonlytoclient = player;
- ts.think = SUB_Remove;
- ts.nextthink = time + 1;
- ts.owner = player;
- ts.enemy = self;
- ts.effects = EF_NODEPTHTEST;
- ts.classname = "warpzone_teleported";
- ts.angles = self.warpzone_transform;
+ if(player.classname == "player")
+ {
+ // instead of fixangle, send the transform to the client for smoother operation
+ player.fixangle = FALSE;
+
+ entity ts = spawn();
+ setmodel(ts, "null");
+ ts.SendEntity = WarpZone_Teleported_Send;
+ ts.SendFlags = 0xFFFFFF;
+ ts.drawonlytoclient = player;
+ ts.think = SUB_Remove;
+ ts.nextthink = time + 1;
+ ts.owner = player;
+ ts.enemy = wz;
+ ts.effects = EF_NODEPTHTEST;
+ ts.classname = "warpzone_teleported";
+ ts.angles = wz.warpzone_transform;
+ }
#endif
return 1;
void WarpZone_Touch (void)
{
- entity oldself, e;
+ entity oldself;
if(other.classname == "trigger_warpzone")
return;
+ if(time <= other.warpzone_teleport_finishtime) // already teleported this frame
+ return;
+
// FIXME needs a better check to know what is safe to teleport and what not
- if(other.movetype == MOVETYPE_NONE)
+ if(other.movetype == MOVETYPE_NONE || other.movetype == MOVETYPE_FOLLOW || other.tag_entity)
return;
if(WarpZoneLib_ExactTrigger_Touch())
return;
- e = self.enemy;
- if(WarpZone_Teleport(other))
+ if(WarpZone_PlaneDist(self, other.origin + other.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet)
+ return;
+
+ float f;
+ // number of frames we need to go back:
+ // dist = 16*sqrt(2) qu
+ // dist ~ 24 qu
+ // 24 qu = v*t
+ // 24 qu = v*frametime*n
+ // n = 24 qu/(v*frametime)
+ // for clients go only one frame though, may be too irritating otherwise
+ // but max 0.25 sec = 0.25/frametime frames
+ // 24/(0.25/frametime)
+ // 96*frametime
+ float d;
+ d = 24 + max(vlen(other.mins), vlen(other.maxs));
+ if(clienttype(other) == CLIENTTYPE_NOTACLIENT)
+ f = -d / bound(frametime * d * 1, frametime * vlen(other.velocity), d);
+ else
+ f = -1;
+ if(WarpZone_Teleport(self, other, f, 0))
{
string save1, save2;
activator = other;
// we must send this flag for clientside to match properly too
f = 0;
if(self.warpzone_isboxy)
- f |= 1;
+ BITSET_ASSIGN(f, 1);
if(self.warpzone_fadestart)
- f |= 2;
+ BITSET_ASSIGN(f, 2);
if(self.origin != '0 0 0')
- f |= 4;
+ BITSET_ASSIGN(f, 4);
WriteByte(MSG_ENTITY, f);
// we need THESE to render the warpzone (and cull properly)...
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
if(self.warpzone_fadestart)
- f |= 2;
+ BITSET_ASSIGN(f, 2);
if(self.origin != '0 0 0')
- f |= 4;
+ BITSET_ASSIGN(f, 4);
WriteByte(MSG_ENTITY, f);
// we need THESE to render the warpzone (and cull properly)...
return TRUE;
}
-float WarpZone_CheckProjectileImpact()
+float WarpZone_CheckProjectileImpact(entity player)
{
- // if self hit a warpzone, abort
- vector o0, v0, a0;
- float mpd, pd, dpd;
+ vector o0, v0;
+
+ o0 = player.origin + player.view_ofs;
+ v0 = player.velocity;
+
+ // if we teleported shortly before, abort
+ if(time <= player.warpzone_teleport_finishtime + 0.1)
+ return 0;
+
+ // if player hit a warpzone, abort
entity wz;
- wz = WarpZone_Find(self.origin + self.mins, self.origin + self.maxs);
+ wz = WarpZone_Find(o0 + player.mins, o0 + player.maxs);
if(!wz)
return 0;
- if(self.warpzone_teleport_time == time)
+
+ print("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n");
+
+ // retry previous move
+ setorigin(player, player.warpzone_oldorigin);
+ player.velocity = player.warpzone_oldvelocity;
+ if(WarpZone_Teleport(wz, player, 0, 1))
{
- // just ignore if we got teleported this frame already and now hit a wall and are in a warpzone again (this will cause a detonation)
- // print("2 warps 1 frame\n");
- return -1;
- }
- o0 = self.origin;
- v0 = self.velocity;
- a0 = self.angles;
-
- // this approach transports the projectile at its full speed, but does
- // not properly retain the projectile trail (but we can't retain it
- // easily anyway without delaying the projectile by two frames, so who
- // cares)
- WarpZone_TraceBox_ThroughZone(self.warpzone_oldorigin, self.mins, self.maxs, self.warpzone_oldorigin + self.warpzone_oldvelocity * frametime, MOVE_NORMAL, self, wz, WarpZone_trace_callback_t_null); // this will get us through the warpzone
- setorigin(self, trace_endpos);
- self.angles = WarpZone_TransformAngles(WarpZone_trace_transform, self.angles);
- self.velocity = WarpZone_TransformVelocity(WarpZone_trace_transform, self.warpzone_oldvelocity);
-
- // in case we are in our warp zone post-teleport, shift the projectile forward a bit
- mpd = max(vlen(self.mins), vlen(self.maxs));
- pd = WarpZone_TargetPlaneDist(wz, self.origin);
- if(pd < mpd)
+ entity oldself;
+ string save1, save2;
+
+ oldself = self;
+ self = wz;
+ other = player;
+ activator = player;
+
+ save1 = self.target; self.target = string_null;
+ save2 = self.target3; self.target3 = string_null;
+ SUB_UseTargets();
+ if not(self.target) self.target = save1;
+ if not(self.target3) self.target3 = save2;
+
+ self = self.enemy;
+ save1 = self.target; self.target = string_null;
+ save2 = self.target2; self.target2 = string_null;
+ SUB_UseTargets();
+ if not(self.target) self.target = save1;
+ if not(self.target2) self.target2 = save2;
+ self = oldself;
+ }
+ else
{
- dpd = normalize(self.velocity) * wz.warpzone_targetforward;
- setorigin(self, self.origin + normalize(self.velocity) * ((mpd - pd) / dpd));
- if(!WarpZoneLib_MoveOutOfSolid(self))
- {
- setorigin(self, o0);
- self.angles = a0;
- self.velocity = v0;
- return 0;
- }
+ setorigin(player, o0 - player.view_ofs);
+ player.velocity = v0;
}
- WarpZone_RefSys_Add(self, wz);
- WarpZone_StoreProjectileData(self);
- self.warpzone_teleport_time = time;
return +1;
}
float f;
if(other.classname == "trigger_warpzone")
return TRUE;
- if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
+
+ // no further impacts if we teleported this frame!
+ if(time == self.warpzone_teleport_time)
return TRUE;
- if((f = WarpZone_CheckProjectileImpact()) != 0)
- return (f > 0);
- if(self.warpzone_teleport_time == time)
+
+ // this SEEMS to not happen at the moment, but if it did, it would be more reliable
{
- // sequence: hit warpzone, get teleported, hit wall
- // print("2 hits 1 frame\n");
- setorigin(self, self.warpzone_oldorigin);
- self.velocity = self.warpzone_oldvelocity;
- self.angles = self.warpzone_oldangles;
- return TRUE;
+ float save_dpstartcontents;
+ float save_dphitcontents;
+ float save_dphitq3surfaceflags;
+ string save_dphittexturename;
+ float save_allsolid;
+ float save_startsolid;
+ float save_fraction;
+ vector save_endpos;
+ vector save_plane_normal;
+ float save_plane_dist;
+ entity save_ent;
+ float save_inopen;
+ float save_inwater;
+ save_dpstartcontents = trace_dpstartcontents;
+ save_dphitcontents = trace_dphitcontents;
+ save_dphitq3surfaceflags = trace_dphitq3surfaceflags;
+ save_dphittexturename = trace_dphittexturename;
+ save_allsolid = trace_allsolid;
+ save_startsolid = trace_startsolid;
+ save_fraction = trace_fraction;
+ save_endpos = trace_endpos;
+ save_plane_normal = trace_plane_normal;
+ save_plane_dist = trace_plane_dist;
+ save_ent = trace_ent;
+ save_inopen = trace_inopen;
+ save_inwater = trace_inwater;
+ if((f = WarpZone_CheckProjectileImpact(self)) != 0)
+ return (f > 0);
+ trace_dpstartcontents = save_dpstartcontents;
+ trace_dphitcontents = save_dphitcontents;
+ trace_dphitq3surfaceflags = save_dphitq3surfaceflags;
+ trace_dphittexturename = save_dphittexturename;
+ trace_allsolid = save_allsolid;
+ trace_startsolid = save_startsolid;
+ trace_fraction = save_fraction;
+ trace_endpos = save_endpos;
+ trace_plane_normal = save_plane_normal;
+ trace_plane_dist = save_plane_dist;
+ trace_ent = save_ent;
+ trace_inopen = save_inopen;
+ trace_inwater = save_inwater;
}
+
+ if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
+ return TRUE;
+
return FALSE;
}
self.enemy.aiment = self;
}
+void WarpZoneCamera_Think(void)
+{
+ if(self.warpzone_save_origin != self.origin
+ || self.warpzone_save_angles != self.angles
+ || self.warpzone_save_eorigin != self.enemy.origin
+ || self.warpzone_save_eangles != self.enemy.angles)
+ {
+ WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
+ self.warpzone_save_origin = self.origin;
+ self.warpzone_save_angles = self.angles;
+ self.warpzone_save_eorigin = self.enemy.origin;
+ self.warpzone_save_eangles = self.enemy.angles;
+ }
+ self.nextthink = time;
+}
+
void WarpZoneCamera_InitStep_FindTarget()
{
entity e;
warpzone_cameras_exist = 1;
WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
self.SendFlags = 0xFFFFFF;
+ if(self.spawnflags & 1)
+ {
+ self.think = WarpZoneCamera_Think;
+ self.nextthink = time;
+ }
+ else
+ self.nextthink = 0;
}
void WarpZone_InitStep_UpdateTransform()
tex = getsurfacetexture(self, i_s);
if not(tex)
break; // this is beyond the last one
- if(tex == "textures/common/trigger")
+ if(tex == "textures/common/trigger" || tex == "trigger")
continue;
n_t = getsurfacenumtriangles(self, i_s);
for(i_t = 0; i_t < n_t; ++i_t)
}
}
+void WarpZone_Think();
void WarpZone_InitStep_FinalizeTransform()
{
if(!self.enemy || self.enemy.enemy != self)
WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles);
self.touch = WarpZone_Touch;
self.SendFlags = 0xFFFFFF;
+ if(self.spawnflags & 1)
+ {
+ self.think = WarpZone_Think;
+ self.nextthink = time;
+ }
+ else
+ self.nextthink = 0;
}
float warpzone_initialized;
// the map, with another killtarget to designate its
// orientation
+#ifndef WARPZONE_USE_FIXANGLE
+ // used when teleporting
+ precache_model("null");
+#endif
+
if(!self.scale)
self.scale = self.modelscale;
if(!self.scale)
setsize(self, self.mins, self.maxs);
self.SendEntity = WarpZone_Send;
self.SendFlags = 0xFFFFFF;
- self.effects |= EF_NODEPTHTEST;
+ BITSET_ASSIGN(self.effects, EF_NODEPTHTEST);
self.warpzone_next = warpzone_first;
warpzone_first = self;
}
self = e;
}
+void WarpZone_Think()
+{
+ if(self.warpzone_save_origin != self.origin
+ || self.warpzone_save_angles != self.angles
+ || self.warpzone_save_eorigin != self.enemy.origin
+ || self.warpzone_save_eangles != self.enemy.angles)
+ {
+ entity oldself;
+ oldself = self;
+ WarpZone_InitStep_UpdateTransform();
+ self = self.enemy;
+ WarpZone_InitStep_UpdateTransform();
+ self = oldself;
+ WarpZone_InitStep_FinalizeTransform();
+ self = self.enemy;
+ WarpZone_InitStep_FinalizeTransform();
+ self = oldself;
+ self.warpzone_save_origin = self.origin;
+ self.warpzone_save_angles = self.angles;
+ self.warpzone_save_eorigin = self.enemy.origin;
+ self.warpzone_save_eangles = self.enemy.angles;
+ }
+ self.nextthink = time;
+}
+
void WarpZone_StartFrame()
{
entity e;
WarpZone_InitStep_UpdateTransform();
self = e;
WarpZones_Reconnect();
+ WarpZone_PostInitialize_Callback();
}
- if(warpzone_warpzones_exist)
+ entity oldself, oldother;
+ oldself = self;
+ oldother = other;
+ for(e = world; (e = nextent(e)); )
{
- entity oldself, oldother;
- oldself = self;
- oldother = other;
- for(e = world; (e = nextent(e)); )
+ if(warpzone_warpzones_exist) { WarpZone_StoreProjectileData(e); }
+
+ float f = clienttype(e);
+ if(f == CLIENTTYPE_REAL)
{
- WarpZone_StoreProjectileData(e);
- float f;
- f = clienttype(e);
- if(f == CLIENTTYPE_REAL)
+ if(e.solid == SOLID_NOT) // not spectating?
+ if(e.movetype == MOVETYPE_NOCLIP || e.movetype == MOVETYPE_FLY || e.movetype == MOVETYPE_FLY_WORLDONLY) // not spectating? (this is to catch observers)
{
- if(e.solid != SOLID_NOT) // not spectating?
- continue;
- if(e.movetype != MOVETYPE_NOCLIP && e.movetype != MOVETYPE_FLY) // not spectating? (this is to catch observers)
- continue;
- self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
- if(!self)
- continue;
- other = e;
- if(WarpZoneLib_ExactTrigger_Touch())
- continue;
- WarpZone_Teleport(e); // NOT triggering targets by this!
+ other = e; // player
+
+ // warpzones
+ if(warpzone_warpzones_exist) {
+ self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
+ if(self)
+ if(!WarpZoneLib_ExactTrigger_Touch())
+ if(WarpZone_PlaneDist(self, e.origin + e.view_ofs) <= 0)
+ WarpZone_Teleport(self, e, -1, 0); } // NOT triggering targets by this!
+
+ // teleporters
+ self = Teleport_Find(e.origin + e.mins, e.origin + e.maxs);
+ if(self)
+ if(!WarpZoneLib_ExactTrigger_Touch())
+ Simple_TeleportPlayer(self, other); // NOT triggering targets by this!
}
- if(f == CLIENTTYPE_NOTACLIENT)
- {
+ }
+
+ if(f == CLIENTTYPE_NOTACLIENT)
+ {
+ if(warpzone_warpzones_exist)
for(; (e = nextent(e)); )
WarpZone_StoreProjectileData(e);
- break;
- }
+ break;
}
- self = oldself;
- other = oldother;
}
+ self = oldself;
+ other = oldother;
}
.float warpzone_reconnecting;
const float ENT_CLIENT_WARPZONE_CAMERA;
void WarpZone_PlayerPhysics_FixVAngle(void);
+
+void WarpZone_PostInitialize_Callback(void);
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_workspace_file>
- <Workspace title="Xonotic Gamecode">
- <Project filename="qc-server.cbp" active="1" />
- <Project filename="qc-client.cbp" />
- <Project filename="qc-common.cbp" />
- </Workspace>
-</CodeBlocks_workspace_file>
exec data/campaign.cfg
exec config_update.cfg
exec font-xolonium.cfg
+exec autoexec/*.cfg
exec autoexec.cfg
stuffcmds
//startdemos demos/demo1 demos/demo2 demos/demo3
--- /dev/null
+models/casing_bronze
+{
+ dpglossintensitymod 2
+ dpglossexponentmod 4
+ dpreflectcube env/exomorph/exomorph
+ {
+ map models/casing_bronze.tga
+ }
+ {
+ map $lightmap
+ rgbGen identity
+ tcGen lightmap
+ blendfunc filter
+ }
+}
+++ /dev/null
-flags/flag_red_cloth {
- cull none
- deformVertexes wave 100 sin 0 0.4 0 2.5
- {
- map textures/flags/flag_red_cloth.tga
- }
-}
-
-flags/flag_red_laser {
- {
- map textures/flags/flag_red_laser.tga
- tcMod scroll 0.2 -1
- blendfunc add
- }
-}
-
-
-flags/flag_blue_cloth {
- cull none
- deformVertexes wave 100 sin 0 0.4 0 2.5
- {
- map textures/flags/flag_blue_cloth.tga
- }
-}
-
-flags/flag_blue_laser {
- {
- map textures/flags/flag_blue_laser.tga
- tcMod scroll 0.2 -1
- blendfunc add
- }
-}
-
deformVertexes autosprite
{
map textures/projectiles/crylink_projectile_core.tga
- blendfunc add
+ blendfunc GL_SRC_ALPHA GL_ONE
rgbGen lightingDiffuse
}
}
deformVertexes autosprite2
{
map textures/projectiles/crylink_projectile_long.tga
- blendfunc add
+ blendfunc GL_SRC_ALPHA GL_ONE
rgbGen lightingDiffuse
}
}
blendfunc add
rgbGen lightingDiffuse
}
-}
\ No newline at end of file
+}
{
{
map models/relics/relic_ring.tga
- blendfunc add
+ blendfunc GL_SRC_ALPHA GL_ONE
rgbgen lightingDiffuse
}
}
cull disable
{
clampmap textures/thrustc1.tga
- blendfunc add
+ blendfunc GL_SRC_ALPHA GL_ONE
tcMod rotate 720
}
}
qer_editorimage models/turrets/phaser_beam
{
map models/turrets/phaser_beam
- blendFunc add
+ blendFunc GL_SRC_ALPHA GL_ONE
}
}
--- /dev/null
+spiderbot
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map textures/spiderbot.tga
+ rgbgen lightingDiffuse
+ }
+}
+wakazachi
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map textures/wakazachi.tga
+ rgbgen lightingDiffuse
+ }
+}
+cockpit
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map textures/cockpit.tga
+ rgbgen lightingDiffuse
+ }
+}
+vehicles/tracercore
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite
+ {
+ map models/vehicles/tracercore.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+ }
+vehicles/tracertrail
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ cull none
+ deformVertexes autosprite2
+ {
+ map models/vehicles/tracertrail.tga
+ blendfunc GL_SRC_ALPHA GL_ONE
+ rgbGen lightingDiffuse
+ }
+}
+
--- /dev/null
+models/vehicles/rockets
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map models/vehicles/rockets.tga
+ rgbgen lightingDiffuse
+ }
+}
+rockets
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map models/vehicles/rockets.tga
+ rgbgen lightingDiffuse
+ }
+}
\ No newline at end of file
-//affirmative sound/player/torus/coms/affirmative 0
-attack sound/player/torus/coms/attack 0
-//attacking sound/player/torus/coms/attacking 0
-attackinfive sound/player/torus/coms/letsgo 0
-coverme sound/player/torus/coms/coverme 0
-//defend sound/player/torus/coms/defend 1
-//defending sound/player/torus/coms/defending 0
-//droppedflag sound/player/torus/coms/droppedflag 0
-//flagcarriertakingdamage sound/player/torus/coms/flagcarriertakingdamage 0
-//freelance sound/player/torus/coms/freelance 1
-//getflag sound/player/torus/coms/getflag 0
-incoming sound/player/torus/coms/incoming 0
-meet sound/player/torus/coms/waypoint 0
-needhelp sound/player/torus/coms/needhelp 0
-//negative sound/player/torus/coms/negative 0
-//onmyway sound/player/torus/coms/onmyway 0
-//roaming sound/player/torus/coms/roaming 0
-//seenenemy sound/player/torus/coms/seenenemy 0
-seenflag sound/player/torus/coms/seenflag 0
-taunt sound/player/torus/coms/taunt 2
-teamshoot sound/player/torus/coms/teamshoot 0
-death sound/player/torus/player/death 0
-drown sound/player/torus/player/drown 0
-//fall sound/player/torus/player/fall 0
-//falling sound/debug/v_falling 0
-gasp sound/player/torus/player/gasp 0
-jump sound/player/torus/player/fall 0
-pain25 sound/player/torus/player/pain25 0
-pain50 sound/player/torus/player/pain50 0
-pain75 sound/player/torus/player/pain75 0
-pain100 sound/player/torus/player/pain100 0
+affirmative sound/player/espeak/coms/affirmative 0
+attack sound/player/espeak/coms/attack 0
+attacking sound/player/espeak/coms/attacking 0
+attackinfive sound/player/espeak/coms/attackinfive 0
+coverme sound/player/espeak/coms/coverme 0
+defend sound/player/espeak/coms/defend 0
+defending sound/player/espeak/coms/defending 0
+droppedflag sound/player/espeak/coms/droppedflag 0
+flagcarriertakingdamage sound/player/espeak/coms/flagcarriertakingdamage 0
+freelance sound/player/espeak/coms/freelance 0
+getflag sound/player/espeak/coms/getflag 0
+incoming sound/player/espeak/coms/incoming 0
+meet sound/player/espeak/coms/meet 0
+needhelp sound/player/espeak/coms/needhelp 0
+negative sound/player/espeak/coms/negative 0
+onmyway sound/player/espeak/coms/onmyway 0
+roaming sound/player/espeak/coms/roaming 0
+seenenemy sound/player/espeak/coms/seenenemy 0
+seenflag sound/player/espeak/coms/seenflag 0
+taunt sound/player/espeak/coms/taunt 0
+teamshoot sound/player/espeak/coms/teamshoot 0
+death sound/player/espeak/player/death 0
+drown sound/player/espeak/player/drown 0
+fall sound/player/espeak/player/fall 0
+falling sound/player/espeak/player/falling 0
+gasp sound/player/espeak/player/gasp 0
+jump sound/player/espeak/player/jump 0
+pain25 sound/player/espeak/player/pain25 0
+pain50 sound/player/espeak/player/pain50 0
+pain75 sound/player/espeak/player/pain75 0
+pain100 sound/player/espeak/player/pain100 0
--- /dev/null
+v()
+{
+ espeak -w "$1.wav" "$2"
+ normalize "$1.wav"
+ oggenc -q1 "$1.wav" -o "$1.ogg"
+ rm -f "$1.wav"
+}
+
+v player/death "Mine Leyben!"
+v player/fall "Ooh!"
+v player/drown "Gloog gloog gloog!"
+v player/gasp "Ha!"
+v player/jump "Hem!"
+v player/pain25 "Owowowow!"
+v player/pain50 "Owow!"
+v player/pain75 "Ouuu!"
+v player/pain100 "Ouch!"
+v player/fall "Arh!"
+v player/falling "Aaaaaaaaaaaaaaaaaaaaa!"
+v coms/attack "Attack!"
+v coms/attackinfive "Attack in 5! In 4! In 3! In 2! In 1! Attack NOW!"
+v coms/meet "Let's meet at the waypoint."
+v coms/seenflag "I've seen the flag!"
+v coms/taunt "Double facepalm!"
+v coms/teamshoot "I'm on your team!"
+v coms/incoming "Incoming!"
+v coms/coverme "Cover me!"
+v coms/needhelp "I need help!"
+v coms/defend "Defend the base!"
+v coms/freelance "Do whatever you want."
+v coms/flagcarriertakingdamage "Our flag carrier is taking damage!"
+v coms/getflag "Somebody get our flag back!"
+v coms/affirmative "Affirmative."
+v coms/attacking "I'm attacking."
+v coms/defending "I'm defending."
+v coms/roaming "I'm roaming around."
+v coms/onmyway "I'm on my way."
+v coms/droppedflag "I dropped the flag!"
+v coms/negative "Negative."
+v coms/seenenemy "I've seen an enemy."
\menu_slist_showempty\Show empty servers
\menu_slist_showfull\Show full servers that have no slots available
\net_slist_pause\Pause updating the server list to prevent servers from "jumping around"
-\XonoticMultiplayerDialog/Info\Show more information about the currently highlighted server
+\XonoticMultiplayerDialog/Info...\Show more information about the currently highlighted server
\XonoticMultiplayerDialog/Bookmark\Bookmark the currently highlighted server so that it's faster to find in the future
-\XonoticMultiplayerDialog/Havoc\Change to Havoc mode which has some modifications to the gameplay
\XonoticMultiplayerDialog/Create\Host your own game
\XonoticMultiplayerDialog/Demos\Browse and view demos
\XonoticMultiplayerDialog/Player Setup\Customize your player settings
\g_minstagib\Players will be given the Minstanex, which is a railgun with infinite damage. If the player runs out of ammo, he will have 10 seconds to find some or if he fails to do so, face death. The secondary fire mode is a laser which does not inflict any damage and is good for doing trickjumps.
\g_nix\No items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon.
\g_nix_with_laser\Always carry the laser as an additional weapon in Nix
-\XonoticMultiplayerDialog/All\Select all maps
-\XonoticMultiplayerDialog/None\Unselect all maps
+\XonoticMultiplayerDialog/Select all\Select all maps
+\XonoticMultiplayerDialog/Select none\Unselect all maps
\XonoticMultiplayerDialog/Timedemo\Benchmark how fast your computer can run the highlighted demo
\crosshair_alpha\Adjust the opacity of the crosshair
\crosshair_color\Adjust the crosshair color
\sbar_hudselector\Use the old HUD layout
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Adjust the radar, HUD and waypoints
+\XonoticMultiplayerDialog/Waypoints setup...\-
\_cl_name\Name under which you will appear in the game
\XonoticSettingsDialog\Change the game settings
\r_damageblur\Amount of motion blur when hurt - 0.4 recommended
\XonoticSettingsDialog/Audio\Audio settings
+\mastervolume\-
\bgmvolume\-
-\volume\-
\snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
\snd_speed\Sound output frequency
\snd_channels\Number of channels for the sound output
\snd_swapstereo\Swap left/right channels
\menu_slist_showempty\Aktiviere die Anzeige von leeren Servern
\menu_slist_showfull\Aktiviere die Anzeige von vollen Servern, die keinen freien Platz mehr haben
\net_slist_pause\Unterbreche die automatische Aktualisierung der Serverliste um ein "Herumspringen" zu verhindern
-\XonoticMultiplayerDialog/Info\Lass dir mehr Informationen über den markierten Server anzeigen
-\XonoticMultiplayerDialog/Bookmark\Setze ein Lesezeichen für den markierten Server um ihn beim nächsten mal schneller wiederzufinden
-\XonoticMultiplayerDialog/Havoc\Wechsel in den Havoc Modus, welcher zu Änderungen des Spielverhaltens führt
+\XonoticMultiplayerDialog/Info...\Lass dir mehr Informationen über den markierten Server anzeigen
+\XonoticMultiplayerDialog/Speichern\Setze ein Lesezeichen für den markierten Server um ihn beim nächsten mal schneller wiederzufinden
\XonoticMultiplayerDialog/Starten\Hoste dein eigenes Spiel
\XonoticMultiplayerDialog/Demos\Gucke dir Demos an
\XonoticMultiplayerDialog/Spieler-Einstellungen\Ändere deine Spieler-Einstellungen
\g_minstagib\Alle Spieler starten mit der Minstanex, eine elektromagnetische Schienenkanone mit unendlich viel Schaden. Wenn ein Spieler keine Munition mehr hat, bleiben ihm 10 Sekunden um neue zu finden, ansonsten stirbt er. Der 2. Feuermodus ist Laser, welcher keinen Schaden hinzufügen kann. Dieser eignet sich gut für Tricksprünge.
\g_nix\Es gibt keine aufzusammelnden Gegenstände in Xonotic - Anstelle der Möglichkeit Waffen aufzusammeln, spielen alle mit der gleichen Waffe. Nach einiger Zeit startet ein Countdown, danach wechseln alle Spieler zu einer neuen gleichen Waffe.
\g_nix_with_laser\In Nix ist als zweite Waffe der Laser vorhanden.
-\XonoticMultiplayerDialog/All\Wähle alle Maps.
-\XonoticMultiplayerDialog/None\Wähle alle Maps ab.
+\XonoticMultiplayerDialog/Select all\Wähle alle Maps.
+\XonoticMultiplayerDialog/Select none\Wähle alle Maps ab.
\XonoticMultiplayerDialog/Timedemo\Mache einen Benchmark-Test der markierten Demo. Die Demo wird in Zeitraffer, -lupe abgespielt. Das Ergebnis wird in "gamedir/data/benchmark.log" gespeichert.
\crosshair_color_green\Grüner Farbanteil des Fadenkreuzes.
\crosshair_color_blue\Blauer Farbanteil des Fadenkreuzes.
\sbar_hudselector\Verwende das alte HUD Layout.
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Stelle Radar, HUD & Wegpunkte ein.
+\XonoticMultiplayerDialog/Waypoints setup...\-
\_cl_name\Lege deinen Namen im Spiel fest.
\XonoticSettingsDialog\Ändere die Spiel-Einstellungen
\r_motionblur\Wert für die Bewegungsunschärfe - 0.5 empfohlen
\r_damageblur\Wert für die Unschärfe bei einer Verletzung - 0.4 empfohlen
-\XonoticSettingsDialog/Audio\Audio-Einstellungen
+\XonoticSettingsDialog/Ton\Audio-Einstellungen
+\mastervolume\-
\bgmvolume\-
-\volume\-
\snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
\snd_speed\Ausgangsfrequenz des Tons
\snd_channels\Anzahl der Kanäle für die Audiowiedergabe
\snd_swapstereo\Linken und rechten Kanal der Stereowiedergabe tauschen
\XonoticMultiplayerDialog\Juega online, contra tus amigos en LAN, ver demos o cambia la configuración del jugador
-\XonoticMultiplayerDialog/Servers\Encuentra servidores para jugar
+\XonoticMultiplayerDialog/Servidores\Encuentra servidores para jugar
\menu_slist_showempty\Mostrar servidores vacíos
\menu_slist_showfull\Mostrar los servidores que no tienen espacio disponible
\net_slist_pause\Pausa la actualización de la lista de servidores para evitar que salteen
-\XonoticMultiplayerDialog/Info\Mostrar mas información sobre el actual servidor resaltado
-\XonoticMultiplayerDialog/Bookmark\Marcar el actual servidor resaltado para que sea mas facil encontrarlo en un futuro
-\XonoticMultiplayerDialog/Havoc\Cambiar a Havoc modo, el cual tiene algunas modificaciones en el juego
-\XonoticMultiplayerDialog/Create\Crear tu propio juego
+\XonoticMultiplayerDialog/Info...\Mostrar mas información sobre el actual servidor resaltado
+\XonoticMultiplayerDialog/Marcador\Marcar el actual servidor resaltado para que sea mas facil encontrarlo en un futuro
+\XonoticMultiplayerDialog/Crear\Crear tu propio juego
\XonoticMultiplayerDialog/Demos\Navegar y ver demos
\XonoticMultiplayerDialog/Player Setup\Configuración de jugador
\XonoticTeamSelectDialog/Unirse al'mejor' equipo (seleccion automática)\Auto seleccionar equipo (recomendado)
-\XonoticTeamSelectDialog/red\Unirse al equipo rojo
-\XonoticTeamSelectDialog/blue\Unirse al equipo azul
-\XonoticTeamSelectDialog/yellow\Unirse al equipo amarillo
-\XonoticTeamSelectDialog/pink\Unirse al equipo rosa
+\XonoticTeamSelectDialog/rojo\Unirse al equipo rojo
+\XonoticTeamSelectDialog/azul\Unirse al equipo azul
+\XonoticTeamSelectDialog/amarillo\Unirse al equipo amarillo
+\XonoticTeamSelectDialog/rosa\Unirse al equipo rosa
\timelimit_override\Límite de tiempo en minutos que cuando pase, terminara el combate
\fraglimit_override\Cantidad de puntos necesarios antes de que termine el combate
\g_minstagib\Los jugadores tendran Minstanex, el cual es un railgun con daño infinito. Si el jugador queda sin munición, tendra 10 segundos para buscar mas o morira. El modo de disparo secundario es un laser que no inflige daño y es bueno para hacer bromas.
\g_nix\Xonotic sin items - en vez de recoger items, todos juegan con la misma arma. Despues de algún tiempo, comienza una cuenta regresiva, despues del cual todos juegan con otra arma.
\g_nix_with_laser\Siempre lleva el láser como arma adicional en Nix
-\XonoticMultiplayerDialog/All\Seleccionar todos los mapas
-\XonoticMultiplayerDialog/None\Deseleccionar todos los mapas
+\XonoticMultiplayerDialog/Select all\Seleccionar todos los mapas
+\XonoticMultiplayerDialog/Select none\Deseleccionar todos los mapas
-\XonoticMultiplayerDialog/Timedemo\Prueba cuan rápido tu computadora puede correr la demo seleccionada
+\XonoticMultiplayerDialog/Demo temporizado\Prueba cuan rápido tu computadora puede correr la demo seleccionada
\fov\Campo de visión en grados de 60 a 130, 90 es el default
\cl_bobcycle\Frecuencia de balanceo de la vista
\cl_weaponpriority_useforcycling\Haz uso de la lista de abajo when cambia de arma con la rueda del raton
\cl_autoswitch\Cambia automáticamente al arma recogida si es mejor que la que esta llevando
\r_drawviewmodel\Muestra el modelo de arma
-\cl_gunalign\Posición del modelo de arma; requiere conección
+\cl_gunalign\Posición del modelo de arma; requiere conexión
\crosshair_per_weapon\Configura diferentes miras para cada arma, esto ayuda si estas jugando sin un modelo de arma
\crosshair_color_override\Tambien configura el color del punto de mira dependiendo del arma que uses actualmente
\crosshair_color_green\Componente verde del color del punto de mira
\crosshair_color_blue\Componente azul del color del punto de mira
\sbar_hudselector\Usar el viejo diseño de HUD
-\XonoticMultiplayerDialog/Radar, HUD & puntos de referencia...\Ajustar el radar, el HUD y los puntos de referencia
+\XonoticMultiplayerDialog/Waypoints setup...\-
\_cl_name\Nombre con el cual aparecerás en el juego
\XonoticSettingsDialog\Cambiar la configuración del juego
\XonoticCvarsDialog\-
\XonoticQuitDialog\Salir del juego
-\XonoticQuitDialog/Yes\Volver al trabajo...
+\XonoticQuitDialog/Si\Volver al trabajo...
\XonoticQuitDialog/No\Tengo algunos puntos más por hacer!
-\XonoticSettingsDialog/Input\configuración de entrada
+\XonoticSettingsDialog/Entrada\configuración de entrada
\sensitivity\Multiplicador de velocidad del ratón
\menu_mouse_speed\Multiplicador de velocidad del raton en el menu, esto no afecta al apuntar en el juego
\m_filter\Suaviza el movimiento del raton, pero hace menos sensible al apuntar al objetivo
\vid_samples\activar antialiasing, el cual suaviza los bordes en geometrias en 3D. Note que esto puede disminuir bastante el rendimiento (por defecto: desactivado)
\v_flipped\Invertir la imagen horizontalmente (por defecto: desactivado)
-\XonoticSettingsDialog/Effects\configuración de efectos.
+\XonoticSettingsDialog/Efectos\configuración de efectos.
\r_subdivisions_tolerance\Cambiar la suavidad de las curvas en el mapa (por defecto: normal)
\gl_picmip\Cambiar la dureza de las texturas. Bajándolo efectivamente reducira el uso de la memoria de la textura, pero hará que las texturas aparezcan muy borrosas. (por defecto: bueno)
\r_picmipworld\Si se activa, solo reduce la calidad de texturas de los modelos (activado por defecto)
\r_coronas_occlusionquery\Coronas apagadas acorde a la visibilidad (activado por defecto)
\r_bloom\Activar efecto bloom, que ilumina los píxeles vecinos de píxeles muy brillantes.Tiene un gran impacto en el rendimiento. (desactivado por defecto)
\r_hdr\Versión de gran calidad de bloom, que tiene un gran impacto en el rendimiento. (desactivado por defecto)
-\r_motionblur\Nivel de desenfoque de movimiento - 0.5 recomendado
-\r_damageblur\Cantidad de desenfoque de movimiento en presencia de daños - 0.4 recomendado
+\r_motionblur\Nivel de difuminado de movimiento - 0.5 recomendado
+\r_damageblur\Cantidad de difuminado de movimiento en presencia de daños - 0.4 recomendado
-\XonoticSettingsDialog/Audio\configuración de audio
+\XonoticSettingsDialog/Sonido\configuración de audio
+\mastervolume\-
\bgmvolume\-
-\volume\-
\snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
\snd_speed\Frecuencia de salida del sonido
\snd_channels\Número de canales para la salida del sonido
\snd_swapstereo\Invertir canales izquierda o derecha
\cl_hitsound\Reproduce un sonido indicador de anotacion cuando disparas a un enemigo
\menu_sounds\Reproduce sonidos cuando se clickea o se posiciona sobre un item del menú
-\XonoticSettingsDialog/Network\configuración de la red
+\XonoticSettingsDialog/Red\configuración de la red
\cl_movement\Activar predicción de movimiento del lado del cliente
\cl_nolerp\Activar actualización suave en la red
\shownetgraph\Activar un gráfico de tamaño de paquetes y otra información
\XonoticMultiplayerDialog\Jouer en ligne avec des amis en réseau local ou sur Internet
-\XonoticMultiplayerDialog/Servers\Trouver des serveurs pour y jouer dessus
+\XonoticMultiplayerDialog/Serveurs\Trouver des serveurs pour y jouer dessus
\menu_slist_showempty\Montrer les serveurs vides
\menu_slist_showfull\Montrer les serveurs où toutes les places sont prises
\net_slist_pause\Ne met pas à jour la liste de serveurs pour éviter de "glisser" sur un autre serveur
-\XonoticMultiplayerDialog/Info\Montrer plus d'information sur le serveur séléctionné
-\XonoticMultiplayerDialog/Bookmark\Mettre le serveur en haut de la liste pour pouvoir le repérer plus facilement plus tard
-\XonoticMultiplayerDialog/Havoc\Changer au mode Havoc qui comporte des modifications sur le jeu
-\XonoticMultiplayerDialog/Create\Héberger votre propre partie
-\XonoticMultiplayerDialog/Demos\Regarder des Vidéos pré-enregistrées
+\XonoticMultiplayerDialog/Info...\Montrer plus d'information sur le serveur séléctionné
+\XonoticMultiplayerDialog/Marque-page\Mettre le serveur en haut de la liste pour pouvoir le repérer plus facilement plus tard
+\XonoticMultiplayerDialog/Créer\Héberger votre propre partie
+\XonoticMultiplayerDialog/Vidéos\Regarder des Vidéos pré-enregistrées
\XonoticMultiplayerDialog/Player Setup\Personaliser vos paramètres
\XonoticTeamSelectDialog/join 'best' team (auto-select)\Auto-séléction de l'équipe qui a le plus besoin de vous (recommandé)
-\XonoticTeamSelectDialog/red\Joindre l'équipe rouge
-\XonoticTeamSelectDialog/blue\Joindre l'équipe bleue
-\XonoticTeamSelectDialog/yellow\Joindre l'équipe jaune
-\XonoticTeamSelectDialog/pink\Joindre l'équipe rose
+\XonoticTeamSelectDialog/rouge\Joindre l'équipe rouge
+\XonoticTeamSelectDialog/bleu\Joindre l'équipe bleue
+\XonoticTeamSelectDialog/jaune\Joindre l'équipe jaune
+\XonoticTeamSelectDialog/rose\Joindre l'équipe rose
\timelimit_override\Limite de temps au match, le match se finit quand elle est atteinte
\fraglimit_override\Limite de tués pour le match, le match se finit quand elle est atteinte
\g_minstagib\Tous les joueurs reçoivent un MinstaNex, qui est un sniper hyperpuissant qui tue d'un coup. Si vous n'avez plus de munitions, vous mourez progressivement.
\g_nix\No Items Xonotic; tous les joueurs ont la même arme en même temps, et on change d'arme régulièrement
\g_nix_with_laser\Porter le laser avec l'arme du No Items Xonotic
-\XonoticMultiplayerDialog/All\Séléctionner toutes les cartes
-\XonoticMultiplayerDialog/None\Déséléctionner toutes les cartes
+\XonoticMultiplayerDialog/Select all\Séléctionner toutes les cartes
+\XonoticMultiplayerDialog/Select none\Déséléctionner toutes les cartes
-\XonoticMultiplayerDialog/Timedemo\Faire un test de performance en utilisant la vidéo choisie
+\XonoticMultiplayerDialog/Test Performance\Faire un test de performance en utilisant la vidéo choisie
\fov\Champ de vision en degrés, par défaut 90, certains joueurs préfèrent entre 110 et 130
\cl_bobcycle\Effet de "tremblement" de la caméra en courant
\crosshair_color_green\Couleur: intensité du vert dans le viseur
\crosshair_color_blue\Couleur: intensité du bleu dans le viseur
\sbar_hudselector\Utiliser l'ancienne interface HUD
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Ajuster les paramètres de l'interface, de la mini-carte et des Waypoints
+\XonoticMultiplayerDialog/Waypoints setup...\-
\_cl_name\Pseudonyme utilisé pour vous reconnaître dans le jeu
\XonoticSettingsDialog\Changer les paramètres du jeu
\XonoticCvarsDialog\-
\XonoticQuitDialog\Quitter Xonotic
-\XonoticQuitDialog/Yes\Retour au boulot...
-\XonoticQuitDialog/No\'Faut que je fragge plus de monde!
+\XonoticQuitDialog/Oui\Retour au boulot...
+\XonoticQuitDialog/Non\'Faut que je fragge plus de monde!
-\XonoticSettingsDialog/Input\Paramètres contrôle souris/clavier
+\XonoticSettingsDialog/Contrôles\Paramètres contrôle souris/clavier
\sensitivity\Sensitivité de la souris
\menu_mouse_speed\Sensitivité de la souris dans les menus, n'affecte pas le jeu
\m_filter\Adoucit le mouvement de souris, mais crée une légère latence de souris
\sbar_showbinds\Afficher les actions possibles avec des touches/commandes
\cl_showpressedkeys\Afficher les touches qu'un joueur est en train d'appuyer
-\XonoticSettingsDialog/Video\Video settings
+\XonoticSettingsDialog/Vidéo\Video settings
\vid_width\Résolution de l'écran
\vid_bitsperpixel\Profondeur des couleurs: 16 bits est plus rapide, mais 32 bits est de meilleure qualité (recommandé)
\vid_fullscreen\Activer le mode plein écran (par défaut: activé)
\vid_samples\Activer l'anticrénelage, réduit l'effet d'escalier sur les modèles 3D, mais augmente fortement l'utilisation des ressources
\v_flipped\Mode mirroir (par défaut: désactivé)
-\XonoticSettingsDialog/Effects\Paramètres des effets graphiques
+\XonoticSettingsDialog/Graphiques\Paramètres des effets graphiques
\r_subdivisions_tolerance\Ajuster la qualité des modèles 3D de carte (courbes, tuyaux) (par défaut: normal)
\gl_picmip\Ajuster la qualité des textures. La baisser diminue l'utilisation des ressources, mais rend les textures floues. (par défaut: normal)
\r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
\r_damageblur\Intensité du flou en recevant des dégâts - 0.4 est recommandé
\XonoticSettingsDialog/Audio\Audio settings
+\mastervolume\-
\bgmvolume\-
-\volume\-
\snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
\snd_speed\Fréquence de la sortie audio
\snd_channels\Nombre de canaux pour la sortie audio
\snd_swapstereo\Échanger les canneaux stéréo gauche/droite
\cl_hitsound\Jouer un son quand vous touchez un enemi
\menu_sounds\Jouer des sons en cliquant ou en passant la souris sur des options
-\XonoticSettingsDialog/Network\Paramètres du jeu en réseau
+\XonoticSettingsDialog/Réseau\Paramètres du jeu en réseau
\cl_movement\Activer la prédiction des mouvements du joueur pour éviter les saccades lors de parties en réseau
\cl_nolerp\Algorithme pour éviter les saccades lors de parties en réseau
\shownetgraph\Show a
\cl_curl_maxspeed\Vitesse maximum de téléchargement
\cl_port\Forcer le client à passer par le port défini (UDP) s'il n'est pas 0
-\XonoticSettingsDialog/Misc\Autres paramètres
+\XonoticSettingsDialog/Autres\Autres paramètres
\showtime\Montrer l'heure, utile pour les captures d'écran
\showdate\Montrer la date, utile pour les captures d'écran
\showfps\Montrer le nombre d'Images Par Seconde rendues (Frames Per Second = FPS)
--- /dev/null
+0
+\XonoticSingleplayerDialog\Gioca la campagna in giocatore singolo o una partita istantanea contro dei bot
+
+
+\XonoticMultiplayerDialog\Gioca online, contro i tuoi amici in LAN, guarda demo o cambia le impostazioni del giocatore
+\XonoticMultiplayerDialog/Server\Cerca dei server dove giocare
+\menu_slist_showempty\Mostra server vuoti
+\menu_slist_showfull\Mostra server pieni che non hanno slot disponibili
+\net_slist_pause\Ferma l'aggiornamento della lista server per prevenire il continuo spostamento di posizione dei server
+\XonoticMultiplayerDialog/Info...\Mostra maggiori informazioni riguardo il server attualmente selezionato
+\XonoticMultiplayerDialog/Aggiungi tra i preferiti\Aggiungi nel segnalibri il server attualmente selezionato in modo che sia più veloce da trovare in futuro
+\XonoticMultiplayerDialog/Crea\Ospita la tua partita
+\XonoticMultiplayerDialog/Demo\Naviga e vedi le demo
+\XonoticMultiplayerDialog/Setup giocatore\Personalizza le tue impostazioni del giocatore
+
+\XonoticTeamSelectDialog/entra nel 'miglior' team (auto-selezione)\Autoseleziona team (raccomandato)
+\XonoticTeamSelectDialog/rosso\Entra nel team rosso
+\XonoticTeamSelectDialog/blu\Entra nel team blu
+\XonoticTeamSelectDialog/giallo\Entra nel team giallo
+\XonoticTeamSelectDialog/rosa\Entra nel team rosa
+
+\timelimit_override\Tempo limite in minuti che appena raggiunto terminerà la partita
+\fraglimit_override\Il numero di frag necessari prima che la partita finisca
+\menu_maxplayers\Il massimo numero di giocatori o bot che possono essere connessi al tuo server alla volta
+\bot_number\Numero di bot nel tuo server
+\skill\Specifica quanto i bot saranno esperti
+\g_maplist_votable\Numero di mappe che sono mostrate nel voto delle mappe alla fine di una partita
+\sv_vote_simple_majority_factor\La semplice maggioranza vince il voto
+\XonoticMultiplayerDialog/Impostazioni avanzate...\Impostazioni avanzate del server
+\XonoticMultiplayerDialog/Mutatori...\Mutatori e arene dedicate ad armi
+\g_dodging\Abilita schivamento
+\g_cloaked\Tutti i giocatori sono quasi invisibili
+\g_footsteps\Abilita suoni dei passi
+\g_midair\È possibile infliggere danni al tuo nemico solo quando è per aria
+\g_vampire\Il danno causato al tuo nemico aumenta la tua vita
+\g_bloodloss\L'ammontare di vita sotto la quale il tuo giocatore viene stordito per la perdita di sangue
+\sv_gravity\Rendi la caduta degli oggetti più lenta, valori inferiori significano minor gravità
+\g_grappling_hook\I giocatori nascono con il grappling hook
+\g_jetpack\I giocatori nascono col jetpack
+\g_pinata\I giocatori rilasceranno tutte le armi che possedevano appena vengono uccisi
+\g_weapon_stay\Le armi rimangono dopo che vengono raccolte
+\g_weaponarena\Selezionando un'arena dedicata ad un'arma si darà a tutti i giocatori quell'arma con munizioni infinite, e disabiliterà tutti gli altri raccoglimenti delle armi.
+\menu_weaponarena_with_laser\Abilita anche il laser nelle arene dedicate ad un'arma
+\g_minstagib\Ai giocatori sarà dato il Minstanex, che è un railgun con danni illimitati. Se il giocatore rimane senza munizioni, avrà 10 secondi per trovarne alcune, altrimenti morirà. Il fuoco secondario è un laser che non infligge nessun danno ed è buono per effettuare vari trickjump.
+\g_nix\"No items Xonotic" - invece di raccogliere oggetti, ognuno giocherà con la stessa arma. Dopo un pò di tempo, un conto alla rovescia inizierà, dopo il quale ognuno passerà ad un'altra arma.
+\g_nix_with_laser\Porta sempre il laser come arma aggiuntiva nella modalità "No items Xonotic"
+\XonoticMultiplayerDialog/Seleziona tutto\Seleziona tutte le mappe
+\XonoticMultiplayerDialog/Deseleziona tutto\Deseleziona tutte le mappe
+
+
+\XonoticMultiplayerDialog/Timedemo\Testa quanto velocemente il tuo computer fa girare il demo selezionato
+
+\fov\Il campo di vista da 60 a 130 gradi, di default è a 90 gradi
+\cl_bobcycle\Frequenza dell'ondeggiamento della visuale, disabilita per nessun ondeggiamento
+\cl_zoomfactor\Quanto grande è il fattore zoom quando il tasto per lo zoom viene premuto
+\cl_zoomsensitivity\Come lo zoom fa variare la sensibilità del mouse, da 0 (sensibilità più bassa) a 1 (nessun cambio di sensibilità)
+\cl_zoomspeed\Quando velocemente la vista viene zoomata, disabilitalo per lo zoom istantaneo
+\XonoticMultiplayerDialog/Impostazioni arma...\Imposta le tue armi preferite, i cambi automatici e le impostazioni dei modelli delle armi
+
+\cl_weaponpriority_useforcycling\Usa la lista qui sotto per definire le armi usando la rotellina del mouse
+\cl_autoswitch\Automaticamente passa all'arma appena raccolta se è migliore di quella che stavi già usando
+\r_drawviewmodel\Mostra il modello dell'arma
+\cl_gunalign\Posizione del modello dell'arma; richiede riconnessione
+
+\crosshair_per_weapon\Imposta un differente mirino per ogni arma, buono se giochi senza i modelli delle armi
+\crosshair_color_per_weapon\Imposta il colore del mirino dipendente dall'arma che stai correntemente usando
+\crosshair_size\Imposta la dimensione del mirino
+\crosshair_alpha\Imposta l'opacità del mirino
+\crosshair_color\Imposta il colore del mirino
+\sbar_hudselector\Usa il tema del vecchio HUD
+\XonoticMultiplayerDialog/Waypoints setup...\-
+\_cl_name\Nome col quale apparirai nel gioco
+
+\XonoticSettingsDialog\Cambia le impostazioni del gioco
+\XonoticCreditsDialog\I crediti di Xonotic
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Esci dal gioco
+\XonoticQuitDialog/Sì\Devo tornare a lavorare...
+\XonoticQuitDialog/No\Ho ancora un pò di frag da fare!
+
+\XonoticSettingsDialog/Comandi\Impostazioni input
+\sensitivity\Moltiplicatore velocità del mouse
+\menu_mouse_speed\Velocità mouse nel menu, non riguarda il puntamento nel gioco
+\m_filter\Rendi più morbido il movimento del mouse, però rende la sua risposta leggermente più lenta
+\m_pitch\Inverti il movimento del mouse nell'asse Y
+\vid_dgamouse\Fai uso dell'input DGA del mouse
+\con_closeontoggleconsole\Rendi il tasto di chiusura console uguale a quella di apertura
+
+\XonoticSettingsDialog/Video\Impostazioni video
+\vid_width\Risoluzione schermo
+\vid_bitsperpixel\Bit per pixel (BPP) per il rendering, 32 è raccomandato
+\vid_fullscreen\Abilita modalità a tutto schermo (predefinito: abilitato)
+\vid_vsync\Abilita la sincronizzazione verticale per prevenire la lacrimazione (tearing), imposta il limite massimo di fps alla velocità di aggiornamento dello schermo (predefinito: disabilitato)
+\r_glsl\Abilita i pixel shader OpenGL 2.0 per l'illuminazione (predefinito: abilitato)
+\gl_vbo\Fai uso dei Vertex Buffer Objects per salvare nella memoria grafica la geometria statica per un rendering più veloce (predefinito: Vertici e Triangoli)
+\r_depthfirst\Elimina eccesso di disegno (overdraw) eseguendo il rendering della sola profondità della scena prima di iniziare il rendering "standard" (predefinito: disabilitato)
+\gl_texturecompression\Comprimi le texture per le schede video con poca memoria grafica disponibile (predefinito: Nessuna)
+\gl_finish\Fa in modo che la CPU attenda che la GPU finisca di elaborare ogni frame, può aiutare con alcuni strani input o in presenza di video lag in alcune macchine (predefinito: disabilitato)
+\v_brightness\Luminosità del nero (predefinito: 0)
+\v_contrast\Luminosità del bianco (predefinito: 1)
+\v_gamma\Valore della correzione gamma inversa, un effetto di luminosità che non tocca il bianco o il nero (predefinito: 1.125)
+\v_contrastboost\Di quanto viene moltiplicato il contrasto nelle aree oscure (predefinito: 1)
+\r_glsl_saturation\Adattamento saturazione (0 = scala di grigi, 1 = normale, 2 = sovra-saturo), richiede il GLSL color control (predefinito: 1)
+\v_glslgamma\Abilita l'uso delle GLSL per applicare la correzione gamma, nota che le performance potrebbero decrementare di tanto (predefinito: disabilitato)
+\r_ambient\Luminosità dell'ambiente, se è impostato ad un valore troppo alto tende a rendere la luce delle mappe opaca e piatta (predefinito: 4)
+\r_hdr_scenebrightness\Luminosità del rendering globale (predefinito: 1)
+\vid_samples\Abilita l'antialiasing, che smussa i bordi dei modelli in 3D. Nota che le performance potrebbero decrementare di un bel pò (predefinito: disabilitato)
+\v_flipped\Modalità mancino (Predefinito: off)
+
+\XonoticSettingsDialog/Effetti\Impostazioni effetti
+\r_subdivisions_tolerance\Cambia lo smussamento delle curve della mappa (predefinito: normali)
+\gl_picmip\Cambia la nitidezza delle textures. Valori più bassi riducono l'uso della memoria per le texture, però faranno apparire quest'ultime molto sfuocate. (predefinito: buona)
+\r_picmipworld\Se impostato, riduce solo la qualità delle texture dei modelli (predefinito: abilitato)
+\mod_q3bsp_nolightmaps\Usa le mappe di luce ad alta risoluzione, che appaiono più gradite alla vista, però sfruttano più memoria video (predefinito: abilitato)
+\cl_particles_quality\Moltiplicatore del numero di particelle. Valori inferiori significano meno particelle, che di conseguenza incrementano le performance (predefinito: 0.5)
+\r_drawparticles_drawdistance\Distanza per cui le particelle non vengono mostrate (predefinito: 1000)
+\cl_decals\Abilita i decal (buchi dei proiettili e sangue) (predefinito: abilitati)
+\r_drawdecals_drawdistance\I decal più lontano di questa distanza non vengono mostrati (predefinito: 300)
+\cl_decals_time\Tempo in secondi passato il quale i decal sfumano (predefinito: 2)
+\cl_gentle\Sostituisci il sangue e i gib con contenuti che non hanno alcun effetto di sangue (predefinito: disabilitato)
+\cl_nogibs\Riduci il numero di gib o rimuovili completamente (predefinito: parecchi)
+\v_kicktime\Quanto dura un colpo alla visuale per il danno (predefinito: 0)
+\gl_texture_anisotropy\Qualità del filtro anisotropico (predefinito: 1x)
+\r_glsl_deluxemapping\Usa gli effetti di illuminazione pixel per pixel (predefinito: abilitati)
+\r_shadow_gloss\Abilita l'uso della lucentezza delle mappe sulle texture che la supportano (predefinito: abilitati)
+\gl_flashblend\Abilita luci dinamiche più veloci ma meno gradevoli tramite il rendering di corone luminose invece di luci dinamiche reali (predefinito: disabilitato)
+\r_shadow_realtime_dlight\Abilita il rendering delle luci dinamiche come esplosioni e lancio di razzi (predefinito: abilitato)
+\r_shadow_realtime_dlight_shadows\Abilita il rendering di ombre dalle luci dinamiche (predefinito: abilitato)
+\r_shadow_realtime_world\Abilita il rendering delle luci dell'ambiente in tempo reale in mappe che le supportano. Nota che questo potrebbe avere un grande impatto sulle performance. (predefinito: disabilitato)
+\r_shadow_realtime_world_shadows\Abilita il rendering di ombre dalle luci dell'ambiente in tempo reale (predefinito: disabilitato)
+\r_shadow_usenormalmap\Abilita l'uso di ombre direzionali sulle texture (predefinito: abilitato)
+\r_showsurfaces\Disabilita completamente le texture per hardware molto lento. Questo dà un enorme boost alle performance, però appare molto poco gradevole. (predefinito: disabilitato)
+\r_glsl_offsetmapping\Effetto del mappaggio in offset che fa sembrare che le texture con bumpmaps "saltino fuori" dalle piane superfici in 2D (predefinito: disabilitato)
+\r_glsl_offsetmapping_reliefmapping\Mappaggio dell'offset di maggior qualità, che ha anche un enorme impatto sulle performance (predefinito: disabilitato)
+\r_water\Qualità dei riflessi e delle rifrazioni, ha un enorme impatto sulle performance nelle mappe superfici riflettenti (predefinito: disabilitato)
+\r_water_resolutionmultiplier\Risoluzione dei riflessi/rifrazioni (predefinito: buona)
+\r_coronas\Abilita i bagliori corona attorno a determinate luci (predefinito: abilitati)
+\r_coronas_occlusionquery\Dissolvi corone rispetto a visibilità (predefinito: abilitato)
+\r_bloom\Abilita effetti bloom, che illuminano i pixel più vicini a pixel molto luminosi. Hanno un grosso impatto sulle performance. (predefinito: disabilitato)
+\r_hdr\Versione a più alta qualità dei bloom, che hanno un enorme impatto sulle performance. (predefinito: disabilitato)
+\r_motionblur\Forza della sfocatura da movimento - raccomandato a 0.5
+\r_damageblur\Ammontare della sfocatura da movimento quando si è colpiti - raccomandato a 0.4
+
+\XonoticSettingsDialog/Audio\Impostazioni audio
+\mastervolume\-
+\bgmvolume\-
+\snd_staticvolume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
+\snd_speed\Frequenza di campionamento in uscita
+\snd_channels\Numero di canali in uscita
+\snd_swapstereo\Inverti canali sinistro/destro
+\snd_spatialization_control\Abilita spazialità (mischia leggermente i canali destro e sinistro per decrementare di un pò la separazione stereo per le cuffie)
+\cl_voice_directional\Abilita voci direzionali
+\cl_voice_directional_taunt_attenuation\Distanza dalla quale gli insulti possono essere uditi
+\cl_autotaunt\Automaticamente insulta i nemici quando gli fragghi
+\cl_sound_maptime_warning\Un annuncio ti avverte dei minuti rimanenti alla fine della partita
+\cl_hitsound\Riproduci un suono quando il tuo sparo colpisce un nemico
+\menu_sounds\Riproduci suoni quando clicchi o navighi su oggetti del menu
+
+\XonoticSettingsDialog/Rete\Impostazioni di rete
+\cl_movement\Abilita predizione del movimento lato client
+\cl_nolerp\Abilita aggiornamento da rete spianato
+\shownetgraph\Mostra un grafico delle dimensioni dei pacchetti e di altre informazioni
+\_cl_rate\Specifica la velocità della tua rete con questa barra
+\cl_netfps\Quanti pacchetti in ingresso inviare al server ogni secondo
+\cl_curl_maxdownloads\Massimo numero di download HTTP/FTP contemporanei
+\cl_curl_maxspeed\Velocità massima di download
+\cl_port\Forza il client a usare la porta selezionata a meno che non è impostata a 0
+
+\XonoticSettingsDialog/Altro\Impostazioni varie
+\showtime\Mostra l'orario corrente, utile negli screenshot
+\showdate\Mostra la data corrente, utile negli screenshot
+\showfps\Mostra i fotogrammi al secondo
+
+\XonoticSettingsDialog/Impostazioni avanzate...\Impostazioni avanzate dove puoi mettere mano ad ogni singola variabile del gioco
+\g_friendlyfire\Percentuale di danno inflitto ai compagni di squadra
+\g_mirrordamage\Percentuale di danno inflitto ai compagni di squadra che viene riversato su di te
+\g_tdm_teams_override\Non tenere conto del numero predefinito di squadre nei giochi di squadra
+
+\viewsize\Abilita/disabilita lo sfondo dell'HUD
+\cl_hidewaypoints\Mostra vari waypoint specifici di certi tipi di gioco
+\g_waypointsprite_scale\Scala moltiplicatore dei waypoint
+\g_waypointsprite_alpha\Controlla la trasparenza dei waypoint
+\cl_shownames\Mostra il nome del giocatore a cui stai mirando
+
+\crosshair_hittest\Nessuno: non fare il test di colpire per il mirino; TrueAim: sfoca il mirino quando non colpiresti il muro; Nemici: allarga anche il mirino quando colpiresti un nemico
\XonoticMultiplayerDialog\Играть по сети, просмотреть демо или изменить настройки игрока
-\XonoticMultiplayerDialog/Servers\Поиск игровых серверов
+\XonoticMultiplayerDialog/Серверы\Поиск игровых серверов
\menu_slist_showempty\Показывать пустые сервера
\menu_slist_showfull\Показывать полные сервера, не имеющие свободных мест
\net_slist_pause\Приостановить обновление списка серверов для предотвращения их скакания
-\XonoticMultiplayerDialog/Info\Показать больше сведений о выбранном сервере
-\XonoticMultiplayerDialog/Bookmark\Добавить выбранный сервер в закладки, так найти его будет быстрее
-\XonoticMultiplayerDialog/Havoc\Change to Havoc mode which has some modifications to the gameplay
-\XonoticMultiplayerDialog/Create\Запустить собственную игру
-\XonoticMultiplayerDialog/Demos\Список демо для просмотра
+\XonoticMultiplayerDialog/Info...\Показать больше сведений о выбранном сервере
+\XonoticMultiplayerDialog/В закладки\Добавить выбранный сервер в закладки, так найти его будет быстрее
+\XonoticMultiplayerDialog/Создать\Запустить собственную игру
+\XonoticMultiplayerDialog/Демо\Список демо для просмотра
\XonoticMultiplayerDialog/Player Setup\Изменить настройки игрока
\XonoticTeamSelectDialog/join 'best' team (auto-select)\Автовыбор команды (советуется)
-\XonoticTeamSelectDialog/red\Присоединиться к красной команде
-\XonoticTeamSelectDialog/blue\Присоединиться к синей команде
-\XonoticTeamSelectDialog/yellow\Присоединиться к жёлтой команде
-\XonoticTeamSelectDialog/pink\Присоединиться к розовой команде
+\XonoticTeamSelectDialog/красная\Присоединиться к красной команде
+\XonoticTeamSelectDialog/синяя\Присоединиться к синей команде
+\XonoticTeamSelectDialog/жёлтая\Присоединиться к жёлтой команде
+\XonoticTeamSelectDialog/розовая\Присоединиться к розовой команде
\timelimit_override\Ограничение времени в минутах, состязание закончится при его достижении
\fraglimit_override\Количество очков, необходимых для завершения состязания
\g_minstagib\Players will be given the Minstanex, which is a railgun with infinite damage. If the player runs out of ammo, he will have 10 seconds to find some or if he fails to do so, face death. The secondary fire mode is a laser which does not inflict any damage and is good for doing trickjumps.
\g_nix\No items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon.
\g_nix_with_laser\Always carry the laser as an additional weapon in Nix
-\XonoticMultiplayerDialog/All\Выбрать все карты
-\XonoticMultiplayerDialog/None\Снять выделение со всех карт
+\XonoticMultiplayerDialog/Select all\Выбрать все карты
+\XonoticMultiplayerDialog/Select none\Снять выделение со всех карт
-\XonoticMultiplayerDialog/Timedemo\Замерить, насколько быстро компьютер способен играть выбранное демо
+\XonoticMultiplayerDialog/Проверка производительности\Замерить, насколько быстро компьютер способен играть выбранное демо
\fov\Угол обзора в градусах, допустимы значения от 60 то 130, по умолчанию 90
\cl_bobcycle\Частота качания вида
\crosshair_color_green\Зелёная составляющая цвета перекрестья
\crosshair_color_blue\Синяя составляющая цвета перекрестья
\sbar_hudselector\Use the old HUD layout
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Настроить радар, HUD и отметки
+\XonoticMultiplayerDialog/Waypoints setup...\-
\_cl_name\Имя, под которым вы появитесь в игре
\XonoticSettingsDialog\Изменить настройки игры
\XonoticCvarsDialog\-
\XonoticQuitDialog\Выйти из игры
-\XonoticQuitDialog/Yes\Пора саночки возить...
-\XonoticQuitDialog/No\Остались здесь ещё дела!
+\XonoticQuitDialog/Да\Пора саночки возить...
+\XonoticQuitDialog/Нет\Остались здесь ещё дела!
-\XonoticSettingsDialog/Input\Настройки устройств ввода
+\XonoticSettingsDialog/Ввод\Настройки устройств ввода
\sensitivity\Множитель скорости мыши
\menu_mouse_speed\Множитель скорости мыши в меню, не влияет на прицеливание в игре
\m_filter\Сглаживает движения мыши, но значительно ухудшает отзывчивость прицеливания
\sbar_showbinds\Отображать действия / привязанные клавиши в строках, показываемых во время игры
\cl_showpressedkeys\Показывать, какие кнопки движений нажимает игрок
-\XonoticSettingsDialog/Video\Настройки изображения
+\XonoticSettingsDialog/Изображение\Настройки изображения
\vid_width\Разрешение экрана
\vid_bitsperpixel\Сколько бит на точку использовать для вывода, советуется 32
\vid_fullscreen\Включить полноэкранный режим (по умолчанию: включено)
\vid_samples\Enable antialiasing, which smooths the edges of 3D geometry. Note that it might decrease performance by quite a lot (default: disabled)
\v_flipped\Poor man's left handed mode (default: off)
-\XonoticSettingsDialog/Effects\Настройки эффектов
+\XonoticSettingsDialog/Эффекты\Настройки эффектов
\r_subdivisions_tolerance\Change the smoothness of the curves on the map (default: normal)
\gl_picmip\Change the sharpness of the textures. Lowering it will effectively reduce texture memory usage, but make the textures appear very blurry. (default: good)
\r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
\r_motionblur\Motion blur strength - 0.5 recommended
\r_damageblur\Amount of motion blur when hurt - 0.4 recommended
-\XonoticSettingsDialog/Audio\Настройки звука
+\XonoticSettingsDialog/Звук\Настройки звука
+\mastervolume\-
\bgmvolume\-
-\volume\-
\snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
\snd_speed\Частота дискретизации для вывода звука
\snd_channels\Число каналов для вывода звука
\snd_swapstereo\Поменять местами правый и левый каналы
\cl_hitsound\Играть звук оповещения, когда выстрел достигает противника
\menu_sounds\Играть звуки при взаимодействии с меню
-\XonoticSettingsDialog/Network\Настройки сети
+\XonoticSettingsDialog/Сеть\Настройки сети
\cl_movement\Включить предсказание движения на стороне клиента
\cl_nolerp\Enable network update smoothing
\shownetgraph\Показывать график размеров пакетов и других сведений
\cl_curl_maxspeed\Предел скорости скачивания
\cl_port\Force client to use chosen port unless it is set to 0
-\XonoticSettingsDialog/Misc\Разные настройки
+\XonoticSettingsDialog/Разное\Разные настройки
\showtime\Показывать текущее время, полезно на снимках экранов
\showdate\Показывать текущую дату, полезно на снимках экранов
\showfps\Show your rendered frames per second
set g_turrets_unit_walker_speed_jump 800
set g_turrets_unit_walker_speed_stop 90
+set g_turrets_unit_walker_turn 20
+set g_turrets_unit_walker_turn_walk 15
+set g_turrets_unit_walker_turn_run 7
+set g_turrets_unit_walker_turn_swim 10
+set g_turrets_unit_walker_turn_strafe 5
+
// Main machineguns prop's
set g_turrets_unit_walker_std_shot_dmg 5
set g_turrets_unit_walker_std_shot_refire 0.05
set g_turrets_unit_walker_std_rockets_range 4000
set g_turrets_unit_walker_std_rockets_range_min 500
set g_turrets_unit_walker_std_rocket_refire 10
-set g_turrets_unit_walker_std_rocket_dmg 50
+set g_turrets_unit_walker_std_rocket_dmg 45
set g_turrets_unit_walker_std_rocket_radius 150
set g_turrets_unit_walker_std_rocket_force 150
-set g_turrets_unit_walker_std_rocket_turnrate 0.4
-set g_turrets_unit_walker_std_rocket_speed 900
+set g_turrets_unit_walker_std_rocket_turnrate 0.05
+set g_turrets_unit_walker_std_rocket_speed 1000
// Meele attack. Only happens when theres a target directly in front
set g_turrets_unit_walker_std_meele_range 100
--- /dev/null
+set g_vehicle_bumblebee_speed_forward 400
+set g_vehicle_bumblebee_speed_strafe 200
+set g_vehicle_bumblebee_speed_up 200
+set g_vehicle_bumblebee_speed_down 200
+set g_vehicle_bumblebee_turnspeed 72
+set g_vehicle_bumblebee_pitchspeed 36
+set g_vehicle_bumblebee_pitchlimit 15
+set g_vehicle_bumblebee_friction 0.75
+
+set g_vehicle_bumblebee_energy 500
+set g_vehicle_bumblebee_energy_regen 50
+set g_vehicle_bumblebee_energy_regen_pause 1
+
+set g_vehicle_bumblebee_health 750
+set g_vehicle_bumblebee_health_regen 25
+set g_vehicle_bumblebee_health_regen_pause 5
+
+set g_vehicle_bumblebee_shield 250
+set g_vehicle_bumblebee_shield_regen 100
+set g_vehicle_bumblebee_shield_regen_pause 2
+
+set g_vehicle_bumblebee_cannon_cost 10
+set g_vehicle_bumblebee_cannon_damage 75
+set g_vehicle_bumblebee_cannon_radius 150
+set g_vehicle_bumblebee_cannon_refire 1.5
+set g_vehicle_bumblebee_cannon_speed 5000
+set g_vehicle_bumblebee_cannon_spread 0.0125
+set g_vehicle_bumblebee_cannon_force 400
+set g_vehicle_bumblebee_cannon_turnspeed 90
+set g_vehicle_bumblebee_cannon_pitchlimit_down 60
+set g_vehicle_bumblebee_cannon_pitchlimit_up 60
+set g_vehicle_bumblebee_cannon_turnlimit_in 5
+set g_vehicle_bumblebee_cannon_turnlimit_out 45
+
+set g_vehicle_bumblebee_respawntime 10
+
+set g_vehicle_bumblebee_blowup_radius 500
+set g_vehicle_bumblebee_blowup_coredamage 500
+set g_vehicle_bumblebee_blowup_edgedamage 100
+set g_vehicle_bumblebee_blowup_forceintensity 600
\ No newline at end of file
-set g_vehicle_racer_reload 1
+set g_vehicle_racer_respawntime 25
-set g_vehicle_racer_respawntime 10
-set g_vehicle_racer_health 250
+set g_vehicle_racer_health 190
+set g_vehicle_racer_health_regen 0
+set g_vehicle_racer_health_regen_pause 0
-set g_vehicle_racer_shield 100
-set g_vehicle_racer_shield_block 1
-set g_vehicle_racer_shield_regen 50
-set g_vehicle_racer_shield_regen_dmgpause 0.25
-set g_vehicle_racer_shield_regen_energyrate 2
+set g_vehicle_racer_shield 75
+set g_vehicle_racer_shield_regen 25
+set g_vehicle_racer_shield_regen_pause 1
-set g_vehicle_racer_energy 150
-set g_vehicle_racer_energy_regen 50
-set g_vehicle_racer_energy_usepause 1
+set g_vehicle_racer_energy 125
+set g_vehicle_racer_energy_regen 40
+set g_vehicle_racer_energy_regen_pause 1
-set g_vehicle_racer_speed_stop 2000
-set g_vehicle_racer_speed_forward 1600
-set g_vehicle_racer_speed_strafe 750
+set g_vehicle_racer_speed_stop 2000
+set g_vehicle_racer_speed_forward 800
+set g_vehicle_racer_speed_strafe 500
+set g_vehicle_racer_speed_afterburn 2000
+set g_vehicle_racer_friction 0.4
+set g_vehicle_racer_afterburn_cost 60 // energy consumed per second
-set g_vehicle_racer_speed_afterburn 3500
-set g_vehicle_racer_speed_afterburn_emin 25
-set g_vehicle_racer_speed_afterburn_cost 50
+set g_vehicle_racer_hovertype 0 // 0 = hover, != 0 = maglev
+set g_vehicle_racer_hoverpower 5000 // NOTE!! x 4 (4 engines)
+set g_vehicle_racer_upforcedamper 10
-set g_vehicle_racer_power_min 0
-set g_vehicle_racer_power_air 0
-set g_vehicle_racer_power_solid 8000
+set g_vehicle_racer_downforce 0.01
+set g_vehicle_racer_springlength 65
+set g_vehicle_racer_collision_multiplier 0.05
+set g_vehicle_racer_anglestabilizer 1.75
-set g_vehicle_racer_drag 0.25
-set g_vehicle_racer_dragexp 0.9
-
-set g_vehicle_racer_downforce 0.01
+set g_vehicle_racer_turnspeed 200
+set g_vehicle_racer_pitchspeed 100
+set g_vehicle_racer_maxpitch 25
+set g_vehicle_racer_turnroll 32
-set g_vehicle_racer_springlength 125
-set g_vehicle_racer_anglestabilizer 18
+set g_vehicle_racer_cannon_speed 9000
+set g_vehicle_racer_cannon_damage 20
+set g_vehicle_racer_cannon_radius 100
+set g_vehicle_racer_cannon_refire 0.1
+set g_vehicle_racer_cannon_cost 4
+set g_vehicle_racer_cannon_spread 0.0125
+set g_vehicle_racer_cannon_force 50
-set g_vehicle_racer_turnspeed 180
-set g_vehicle_racer_pitchspeed 360
-set g_vehicle_racer_maxpitch 25
-set g_vehicle_racer_turnroll 0.3
-
-set g_vehicle_racer_laser_speed 18000
-set g_vehicle_racer_laser_damage 20
-set g_vehicle_racer_laser_radius 100
-set g_vehicle_racer_laser_refire 0.05
-set g_vehicle_racer_laser_cost 2
-
-set g_vehicle_racer_rocket_speed 1500
-set g_vehicle_racer_rocket_accel 1500
-set g_vehicle_racer_rocket_turnrate 0.5
-set g_vehicle_racer_rocket_damage 200
-set g_vehicle_racer_rocket_radius 100
-set g_vehicle_racer_rocket_refire 5
+set g_vehicle_racer_rocket_speed 1000
+set g_vehicle_racer_rocket_accel 1400
+set g_vehicle_racer_rocket_turnrate 0.17
+set g_vehicle_racer_rocket_damage 160
+set g_vehicle_racer_rocket_force 350
+set g_vehicle_racer_rocket_radius 125
+set g_vehicle_racer_rocket_refire 6
set g_vehicle_racer_rocket_cost 0
+set g_vehicle_racer_rocket_locktarget 1
+set g_vehicle_racer_rocket_locking_time 0.4
+set g_vehicle_racer_rocket_locking_releasetime 1.6
+set g_vehicle_racer_rocket_locked_time 5
+set g_vehicle_racer_rocket_locked_maxangle 1.46
+
+set g_vehicle_racer_blowup_radius 250
+set g_vehicle_racer_blowup_coredamage 250
+set g_vehicle_racer_blowup_edgedamage 15
+set g_vehicle_racer_blowup_forceintensity 250
+
+set g_vehicle_racer_mass 900
-set g_vehicle_raptor_reload 1
+set g_vehicle_raptor_respawntime 35
+// 0: go where player aims, +forward etc relative to aim angles
+// 1: ignore aim for up/down movement. +forward always moved forward, +jump always moves up
set g_vehicle_raptor_movestyle 1
-set g_vehicle_raptor_turnspeed 90
+
set g_vehicle_raptor_turnroll 0.1
-set g_vehicle_raptor_pitchspeed 45
-set g_vehicle_raptor_speed_forward 1500
-set g_vehicle_raptor_speed_strafe 1500
-set g_vehicle_raptor_speed_up 1250
-set g_vehicle_raptor_speed_down 1400
-
-set g_vehicle_raptor_bomblet_waves 2
-set g_vehicle_raptor_bomblet_wavefirst 0.5
-set g_vehicle_raptor_bomblet_wavenext 0.3
-set g_vehicle_raptor_bomblet_wawespread 0.3
-set g_vehicle_raptor_bomblets 3
-set g_vehicle_raptor_bomblet_damage 90
-set g_vehicle_raptor_bomblet_edgedamage 40
-set g_vehicle_raptor_bomblet_radius 250
-set g_vehicle_raptor_bomblet_force 300
-set g_vehicle_raptor_bombs_refire 1
-
-set g_vehicle_raptor_beam_dps 200
-set g_vehicle_raptor_beam_fops 150
-set g_vehicle_raptor_beam_aps 100
-set g_vehicle_raptor_beam_size 8
-set g_vehicle_raptor_beam_leangth 1
-set g_vehicle_raptor_beam_refire 2
-
-set g_vehicle_raptor_shield 250
-set g_vehicle_raptor_shield_regen 50
-
-set g_vehicle_raptor_health 250
-set g_vehicle_raptor_health_regen 10
-
-set g_vehicle_raptor_energy 300
-set g_vehicle_raptor_energy_regen 50
\ No newline at end of file
+
+set g_vehicle_raptor_turnspeed 80
+set g_vehicle_raptor_pitchspeed 40
+set g_vehicle_raptor_pitchlimit 35
+
+set g_vehicle_raptor_speed_forward 900
+set g_vehicle_raptor_speed_strafe 700
+set g_vehicle_raptor_speed_up 500
+set g_vehicle_raptor_speed_down 800
+set g_vehicle_raptor_friction 0.7
+
+set g_vehicle_raptor_bomblets 8
+set g_vehicle_raptor_bomblet_alt 750
+set g_vehicle_raptor_bomblet_time 0.5
+set g_vehicle_raptor_bomblet_spread 0.4
+set g_vehicle_raptor_bomblet_damage 50
+set g_vehicle_raptor_bomblet_edgedamage 20
+set g_vehicle_raptor_bomblet_radius 310
+set g_vehicle_raptor_bomblet_force 150
+set g_vehicle_raptor_bomblet_explode_delay 0.4
+set g_vehicle_raptor_bombs_refire 5
+
+set g_vehicle_raptor_cannon_turnspeed 90
+set g_vehicle_raptor_cannon_turnlimit 20
+set g_vehicle_raptor_cannon_pitchlimit_up 12
+set g_vehicle_raptor_cannon_pitchlimit_down 32
+
+set g_vehicle_raptor_cannon_locktarget 1
+set g_vehicle_raptor_cannon_locking_time 0.4
+set g_vehicle_raptor_cannon_locking_releasetime 1.6
+set g_vehicle_raptor_cannon_locked_time 5
+set g_vehicle_raptor_cannon_predicttarget 1
+
+set g_vehicle_raptor_cannon_cost 1
+set g_vehicle_raptor_cannon_damage 25
+set g_vehicle_raptor_cannon_radius 60
+set g_vehicle_raptor_cannon_refire 0.05
+set g_vehicle_raptor_cannon_speed 12000
+set g_vehicle_raptor_cannon_spread 0.01
+set g_vehicle_raptor_cannon_force 50
+
+set g_vehicle_raptor_energy 30
+set g_vehicle_raptor_energy_regen 15
+set g_vehicle_raptor_energy_regen_pause 0.8
+
+set g_vehicle_raptor_health 150
+set g_vehicle_raptor_health_regen 0
+set g_vehicle_raptor_health_regen_pause 0
+
+set g_vehicle_raptor_shield 120
+set g_vehicle_raptor_shield_regen 25
+set g_vehicle_raptor_shield_regen_pause 1.5
+
+set g_vehicle_raptor_mass 2200
-set g_vehicle_spiderbot_respawntime 30
-set g_vehicle_spiderbot_health 875
-set g_vehicle_spiderbot_health_regen 10
-set g_vehicle_spiderbot_health_regen_dmgpause 10
+set g_vehicle_spiderbot_respawntime 45
-set g_vehicle_spiderbot_shield 125
+set g_vehicle_spiderbot_health 850
+set g_vehicle_spiderbot_health_regen 15
+set g_vehicle_spiderbot_health_regen_pause 10
+
+set g_vehicle_spiderbot_shield 150
set g_vehicle_spiderbot_shield_block 1
set g_vehicle_spiderbot_shield_regen 25
-set g_vehicle_spiderbot_shield_regen_dmgpause 0.25
+set g_vehicle_spiderbot_shield_regen_pause 0.2
+
+set g_vehicle_spiderbot_energy 0
+set g_vehicle_spiderbot_energy_regen 0
+set g_vehicle_spiderbot_energy_regen_pause 0
-set g_vehicle_spiderbot_turnspeed 90
+set g_vehicle_spiderbot_turnspeed 180
set g_vehicle_spiderbot_head_turnspeed 120
set g_vehicle_spiderbot_head_turnlimit 120
-set g_vehicle_spiderbot_head_pitchspeed 60
-set g_vehicle_spiderbot_head_pitchlimit_up 8
-set g_vehicle_spiderbot_head_pitchlimit_down -24
+set g_vehicle_spiderbot_head_pitchspeed 70
+set g_vehicle_spiderbot_head_pitchlimit_up 24
+set g_vehicle_spiderbot_head_pitchlimit_down -16
set g_vehicle_spiderbot_speed_stop 50
set g_vehicle_spiderbot_speed_walk 400
set g_vehicle_spiderbot_speed_strafe 300
set g_vehicle_spiderbot_movement_inertia 0.25
-set g_vehicle_spiderbot_minigun_damage 25
+set g_vehicle_spiderbot_minigun_damage 16
set g_vehicle_spiderbot_minigun_spread 0.015
set g_vehicle_spiderbot_minigun_speed 50000
set g_vehicle_spiderbot_minigun_refire 0.05
+set g_vehicle_spiderbot_minigun_ammo_cost 1
+set g_vehicle_spiderbot_minigun_ammo_max 200
+set g_vehicle_spiderbot_minigun_ammo_regen 15
+set g_vehicle_spiderbot_minigun_ammo_regen_pause 1
-set g_vehicle_spiderbot_minigun_heat 10
-set g_vehicle_spiderbot_minigun_cooldown 10
+set g_vehicle_spiderbot_springlength 150
+set g_vehicle_spiderbot_springup 5
+set g_vehicle_spiderbot_springblend 0.15
set g_vehicle_spiderbot_rocket_health 100
set g_vehicle_spiderbot_rocket_damage 75
set g_vehicle_spiderbot_rocket_edgedamage 15
set g_vehicle_spiderbot_rocket_force 150
set g_vehicle_spiderbot_rocket_radius 150
-set g_vehicle_spiderbot_rocket_reload 2.5
-set g_vehicle_spiderbot_rocket_refire 0.15
-set g_vehicle_spiderbot_rocket_speed 900
-set g_vehicle_spiderbot_rocket_turnrate 0.25
-set g_vehicle_spiderbot_rocket_noise 0.25
+set g_vehicle_spiderbot_rocket_reload 4
+set g_vehicle_spiderbot_rocket_refire 0.2
+set g_vehicle_spiderbot_rocket_speed 1750
+set g_vehicle_spiderbot_rocket_turnrate 0.2
+set g_vehicle_spiderbot_rocket_noise 0.3
set g_vehicle_spiderbot_rocket_lifetime 30
set g_vehicle_spiderbot_crush_dmg 50
set g_vehicle_spiderbot_crush_force 50
+set g_vehicle_spiderbot_mass 5000
+
+
set cl_vehicle_spiderbot_cross_alpha 0.4
set cl_vehicle_spiderbot_cross_size 1
--- /dev/null
+set g_vehicles 1
+
+exec vehicle_racer.cfg
+exec vehicle_raptor.cfg
+exec vehicle_spiderbot.cfg
+exec vehicle_bumblebee.cfg
+
+//set g_vehicle_racer_respawntime 10
+//set g_vehicle_spiderbot_respawntime 10
+//set g_vehicle_raptor_respawntime 10
+
+set g_vehicles_crush_dmg 70
+set g_vehicles_crush_force 50
+
+set cl_vehicles_hudscale 0.5way
+
+set g_vehicles_delayspawn 1
+set g_vehicles_delayspawn_jitter 10
+set g_vehicles_allow_flagcarry 1
Tyler "-z-" Mulligan
Merlijn Hofstra
morphed
-mand1nga
+Samual "Ares" Lenks
+Saulo "mand1nga" Gil
Jakob "tZork" Markström Gröhn
**Coordinators
**Translators
+*Dutch
+Alexander "freefang" van Dam
+PinkRobot
+
*German
Rudolf "divVerent" Polzer
*French
Calinou
+Maxime "Taximus" Paradis
+
+*Hungarian
+xaN1C4n3
+
+*Italian
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
*Portuguese
Ricardo "Hellgardia" Silva
Lord Canistra
Nikoli
-**Active Contributors
+*Spanish
+Rodrigo Mouton Laudin
+
+*Swedish
+marcus256
+
+**Other Active Contributors
+Akari
+Ant "Antibody" Zucaro
Antonio "terencehill" Piu
+atheros
Ben "MooKow" Banker
+blkrbt
Calinou
chooksta
+cortez
Cuinn "Cuinnton" Herrick
-Kristian "morfar" Johansson
+Florian Paul "lda17h" Schmidt
kojn
+Kristian "morfar" Johansson
+kuniuthefrogg
+magorian
Maik "SavageX" Merten
+Marvin "Mirio" Beck
+Mick Rippon
MrBougo
+parasti
+Paul Scott
+PlasmaSheep
+Przemysław "atheros" Grzywacz
Ruszkai "C.Brutail" Ákos
-Samual Lenks
+{SC0RP} - Ian "ID" Dorrell
Severin "sev" Meyer
+SoulKeeper_p
Stephan "esteel" Stahl
+The player with the unnecessarily long name
Wolfgang "Blub\0" Bumiller
-SoulKeeper_p
**Past Contributors
Alexander "motorsep" Zubov
Andreas "Black" Kirsch
Attila "WW3" Houtkooper
BigMac
-blkrbt
Braden "meoblast001" Walters
Brain Younds
Chris "amethyst7" Matz
Steve Vermeulen
Supajoe
Tei
-terencehill
Tomaz
Ulrich Galbraith
Vortex
*Français
Calinou
+*Italien
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
*Portugais
Ricardo "Hellgardia" Silva
--- /dev/null
+**Sviluppatori principali
+
+Rudolf "divVerent" Polzer
+Tyler "-z-" Mulligan
+Merlijn Hofstra
+morphed
+mand1nga
+Jakob "tZork" Markström Gröhn
+
+**Coordinatori
+
+*Parte artistica
+Sahil "DiaboliK" Singhal
+
+*Texture / Web
+Tyler "-z-" Mulligan (web / game)
+FruitieX (game / web)
+
+*Modellazione 3D
+morphed
+
+*Concept Art
+LJFHutch
+Pearce "theShadow" Michal
+
+*Animazioni
+Sahil "DiaboliK" Singhal
+nifrek
+
+*Design dei livelli
+FruitieX
+MirceaKitsune
+Jakob "tZork" Markström Gröhn
+
+*Musiche / Effetti sonori
+mand1nga
+Merlijn Hofstra
+remaxim
+Stephan
+
+*Aggiunte al codice del motore e QA
+Rudolf "divVerent" Polzer
+
+*Codice del gioco
+Rudolf "divVerent" Polzer
+FruitieX
+Jakob "tZork" Markström Gröhn
+
+*Marketing / Pubbliche Relazioni
+Tyler "-z-" Mulligan
+mand1nga
+
+*Aspetti legali
+Rudolf "divVerent" Polzer
+Merlijn Hofstra
+
+**Motore del gioco
+DarkPlaces
+by Forest "LordHavoc" Hale
+
+**Traduttori
+
+*Tedesco
+Rudolf "divVerent" Polzer
+
+*Finlandese
+Henry "Exitium" Sanmark
+
+*Francese
+Calinou
+
+*Italiano
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
+*Portoghese
+Ricardo "Hellgardia" Silva
+
+*Rumeno
+MirceaKitsune
+
+*Russo
+Lord Canistra
+Nikoli
+
+**Contributori attivi
+Ant "Antibody" Zucaro
+Antonio "terencehill" Piu
+Ben "MooKow" Banker
+blkrbt
+Calinou
+chooksta
+Cuinn "Cuinnton" Herrick
+Florian Paul "lda17h" Schmidt
+Kristian "morfar" Johansson
+kojn
+Maik "SavageX" Merten
+MrBougo
+Przemysław "atheros" Grzywacz
+Ruszkai "C.Brutail" Ákos
+Samual Lenks
+Severin "sev" Meyer
+Stephan "esteel" Stahl
+Wolfgang "Blub\0" Bumiller
+SoulKeeper_p
+
+**Contributori passati
+Alexander "motorsep" Zubov
+Amos "torus" Dudley
+Andreas "Black" Kirsch
+Attila "WW3" Houtkooper
+BigMac
+Braden "meoblast001" Walters
+Brain Younds
+Chris "amethyst7" Matz
+Christian Ice
+Clinton "Kaziganthe" Freeman
+Dan "Digger" Korostelev
+Dan "Wazat" Hale
+Donkey
+dstrek
+Dustin Geeraert
+Edgenetwork
+Edward "Ed" Holness
+Eric "Munyul Verminard" Sambach
+Fabien "H. Reaper" Tschirhart
+FrikaC
+Garth "Zombie" Hendy
+Gerd "Elysis" Raudenbusch
+Gottfried "Toddd" Hofmann
+Henning "Tymo" Janssen
+"Innovati"
+Jitspoe
+Jody Gallagher
+Juergen "LowDragon" Timm
+KadaverJack
+Kevin "Tyrann" Shanahan
+Kurt Dereli
+lcatlnx
+Lee David Ash
+Lee Vermeulen
+leileilol
+Marius "GreEn`mArine" Shekow
+Marko "Urre" Permanto
+Mathieu "Elric" Olivier
+Mattrew "Tronyn" Rye
+MauveBib
+Mephisto
+michaelb
+Michael "Tenshihan" Quinn
+Munyul
+Netzwerg
+NoelCower
+Parapraxis
+Paul "Strahlemann" Evers
+Petithomme
+Q1 Retexturing Project
+Qantourisc
+Rick "Rat" Kelley
+Robert "ai" Kuroto
+Ronan
+Sajt
+Shaggy
+Shank
+Simon O'Callaghan
+SomeGuy
+Spike
+Spirit
+Steve Vermeulen
+Supajoe
+Tei
+Tomaz
+Ulrich Galbraith
+Vortex
+William Libert
+William "Willis" Weilep
+Yves "EviLair" Allaire
+Zenex