- workflow:\r
- rules:\r
- - if: $CI_COMMIT_MESSAGE =~ /Transifex autosync/\r
- when: never\r
- - when: always\r
- \r
- before_script:\r
- - ln -s $PWD data/xonotic-data.pk3dir\r
- \r
- - export MAKEFLAGS=-j$(nproc); echo MAKEFLAGS=$MAKEFLAGS\r
- # FIXME: -march=native -mtune=native _changes the hash_, why?!?\r
- # - export CC="gcc -pipe -march=native -mtune=native"\r
- - export CC="gcc -pipe"\r
- \r
- - >\r
- if wget -nv https://beta.xonotic.org/pipeline-bin/gmqcc ; then\r
- export QCC="$PWD/gmqcc"\r
- chmod +x "$QCC"\r
- else\r
- git clone --depth=1 --branch=main https://gitlab.com/xonotic/gmqcc.git gmqcc\r
- make -C gmqcc || exit 1\r
- export QCC="$PWD/gmqcc/gmqcc"\r
- fi\r
- \r
- # Makefile: don't complain about lack of tags (fetching them is slow)\r
- - export QCCFLAGS_WATERMARK=gitlab_pipeline\r
- # Makefile: don't compress anything or complain about lack of zip program\r
- - export ZIP=/bin/true\r
- \r
- test_compilation_units:\r
- rules:\r
- - changes:\r
- - qcsrc/**/*\r
- stage: test\r
- script:\r
- - make test\r
- \r
- test_sv_game:\r
- stage: test\r
- script:\r
- - >\r
- if wget -nv https://beta.xonotic.org/pipeline-bin/xonotic-linux64-dedicated ; then\r
- export ENGINE="$PWD/xonotic-linux64-dedicated"\r
- chmod +x "$ENGINE"\r
- else\r
- git clone --depth=1 --branch=div0-stable https://gitlab.com/xonotic/darkplaces.git darkplaces\r
- make -C darkplaces sv-release || exit 1\r
- export ENGINE="$PWD/darkplaces/darkplaces-dedicated -xonotic"\r
- fi\r
- - export ENGINE="$ENGINE -noconfig -nohome"\r
- \r
- - make qc || exit 1\r
- \r
- - mkdir -p data/maps\r
- - wget -nv -O data/maps/_init.bsp https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/_init/_init.bsp\r
- \r
- - while read LINE; do\r
- echo $LINE;\r
- [ "$LINE" = "All tests OK" ] && PASS=1;\r
- done < <(${ENGINE} +developer 1 +map _init +sv_cmd runtest +wait +quit)\r
- - test "$PASS" = "1" || { echo 'sv_cmd runtest failed!'; exit 1; }\r
- \r
- - ${ENGINE} +map _init +sv_cmd dumpnotifs +wait +quit\r
- - diff notifications.cfg data/data/notifications_dump.cfg ||\r
- { echo 'Please update notifications.cfg using `dumpnotifs`!'; exit 1; }\r
- \r
- # - wget -nv -O data/stormkeep.pk3 http://beta.xonotic.org/autobuild-bsp/latest/stormkeep.pk3\r
- # ^^ INCORRECT: /latest/stormkeep.pk3 is the most recently built, not necessarily the one built from master!\r
- # we can't get the one from master directly as there's no /stable/stormkeep.pk3 or /master/stormkeep.pk3\r
- # and we can't run misc/tools/xonotic-map-compiler-autobuild as it uses commit hashes from xonotic-maps.pk3dir to generate filenames\r
- # but the autobuild server can run it and provide us the resulting pk3:\r
- - wget -nv -O data/stormkeep.pk3 https://beta.xonotic.org/pipeline-bin/stormkeep.pk3\r
- # see also: misc/infrastructure/xonotic-release-build.cron\r
- - wget -nv -O data/maps/stormkeep.mapinfo https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.mapinfo\r
- - wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints\r
- - wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache\r
- \r
- - EXPECT=3db0ae13a7c4437997f04036773b6b3e\r
- - HASH=$(${ENGINE} +timestamps 1 +exec serverbench.cfg\r
- | tee /dev/stderr\r
- | sed -e 's,^\[[^]]*\] ,,'\r
- | grep '^:'\r
- | grep -v '^:gamestart:'\r
- | grep -v '^:anticheat:'\r
- | md5sum | awk '{ print $1 }')\r
- - echo 'expected:' $EXPECT\r
- - echo ' actual:' $HASH\r
- - test "$HASH" == "$EXPECT"\r
- - exit $?\r
- \r
- \r
- # NOTE: The generated docs are incomplete - they don't contain code behind SVQC CSQC MENUQC GAMEQC ifdefs.\r
- # With them added to PREDEFINED, it would take over half an hour to generate the docs and even then\r
- # they might not be complete. Doxygen doesn't handle #elif and might not understand some QC definitions.\r
- #doxygen: # rename to 'pages' when gitlab.com allows pages to exceed 100MiB\r
- # before_script:\r
- # - ln -s $PWD data/xonotic-data.pk3dir # is this needed?\r
- # - apt-get update\r
- # - apt-get -y install doxygen graphviz\r
- # stage: deploy\r
- # script:\r
- # - cd qcsrc && doxygen\r
- # - mv html ../public\r
- # - mkdir -p ~/.ssh\r
- # - for i in {0..0}; do eval $(printf "echo \$id_rsa_%02d\n" $i) >> ~/.ssh/id_rsa_base64; done\r
- # - base64 --decode ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa\r
- # - chmod 600 ~/.ssh/id_rsa\r
- # - echo -e "Host *\n\tStrictHostKeyChecking no\n\tLogLevel ERROR\n" >> ~/.ssh/config\r
- # - git config --global user.name "Gitlab CI"\r
- # - git config --global user.email "<>"\r
- # - git clone --single-branch --depth 1 ${DEPLOY_HOST}:${DEPLOY_REPO} ~/deploy_\r
- # - mkdir ~/deploy && mv ~/deploy_/.git ~/deploy && rm -r ~/deploy_\r
- # - cp -r ../public/* ~/deploy\r
- # - cd ~/deploy && git add -A . && git commit -m "Deploy ${CI_BUILD_REF}" && git push origin gh-pages\r
- # artifacts:\r
- # paths:\r
- # - public\r
- # only:\r
- # - master\r
+ workflow:
+ rules:
+ - if: $CI_COMMIT_MESSAGE =~ /Transifex autosync/
+ when: never
+ - when: always
+
+ before_script:
+ - ln -s $PWD data/xonotic-data.pk3dir
+
+ - export MAKEFLAGS=-j$(nproc); echo MAKEFLAGS=$MAKEFLAGS
+ # FIXME: -march=native -mtune=native _changes the hash_, why?!?
+ # - export CC="gcc -pipe -march=native -mtune=native"
+ - export CC="gcc -pipe"
+
+ - >
+ if wget -nv https://beta.xonotic.org/pipeline-bin/gmqcc ; then
+ export QCC="$PWD/gmqcc"
+ chmod +x "$QCC"
+ else
+ git clone --depth=1 --branch=main https://gitlab.com/xonotic/gmqcc.git gmqcc
+ make -C gmqcc || exit 1
+ export QCC="$PWD/gmqcc/gmqcc"
+ fi
+
+ # Makefile: don't complain about lack of tags (fetching them is slow)
+ - export QCCFLAGS_WATERMARK=gitlab_pipeline
+ # Makefile: don't compress anything or complain about lack of zip program
+ - export ZIP=/bin/true
+
+ test_compilation_units:
+ rules:
+ - changes:
+ - qcsrc/**/*
+ stage: test
+ script:
+ - make test
+
+ test_sv_game:
+ stage: test
+ script:
+ - >
+ if wget -nv https://beta.xonotic.org/pipeline-bin/xonotic-linux64-dedicated ; then
+ export ENGINE="$PWD/xonotic-linux64-dedicated"
+ chmod +x "$ENGINE"
+ else
+ git clone --depth=1 --branch=div0-stable https://gitlab.com/xonotic/darkplaces.git darkplaces
+ make -C darkplaces sv-release || exit 1
+ export ENGINE="$PWD/darkplaces/darkplaces-dedicated -xonotic"
+ fi
+ - export ENGINE="$ENGINE -noconfig -nohome"
+
+ - make qc || exit 1
+
+ - mkdir -p data/maps
+ - wget -nv -O data/maps/_init.bsp https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/_init/_init.bsp
+
+ - while read LINE; do
+ echo $LINE;
+ [ "$LINE" = "All tests OK" ] && PASS=1;
+ done < <(${ENGINE} +developer 1 +map _init +sv_cmd runtest +wait +quit)
+ - test "$PASS" = "1" || { echo 'sv_cmd runtest failed!'; exit 1; }
+
+ - ${ENGINE} +map _init +sv_cmd dumpnotifs +wait +quit
+ - diff notifications.cfg data/data/notifications_dump.cfg ||
+ { echo 'Please update notifications.cfg using `dumpnotifs`!'; exit 1; }
+
+ # - wget -nv -O data/stormkeep.pk3 http://beta.xonotic.org/autobuild-bsp/latest/stormkeep.pk3
+ # ^^ INCORRECT: /latest/stormkeep.pk3 is the most recently built, not necessarily the one built from master!
+ # we can't get the one from master directly as there's no /stable/stormkeep.pk3 or /master/stormkeep.pk3
+ # and we can't run misc/tools/xonotic-map-compiler-autobuild as it uses commit hashes from xonotic-maps.pk3dir to generate filenames
+ # but the autobuild server can run it and provide us the resulting pk3:
+ - wget -nv -O data/stormkeep.pk3 https://beta.xonotic.org/pipeline-bin/stormkeep.pk3
+ # see also: misc/infrastructure/xonotic-release-build.cron
+ - wget -nv -O data/maps/stormkeep.mapinfo https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.mapinfo
+ - wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
+ - wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
+
- - EXPECT=57325fe74835910e451ba42d31de8f34
++ - EXPECT=0697ef57c3dca0ff122074b29495c5da
+ - HASH=$(${ENGINE} +exec serverbench.cfg
+ | tee /dev/stderr
+ | grep '^:'
+ | grep -v '^:gamestart:'
+ | grep -v '^:anticheat:'
+ | md5sum | awk '{ print $1 }')
+ - echo 'expected:' $EXPECT
+ - echo ' actual:' $HASH
+ - test "$HASH" == "$EXPECT"
+ - exit $?
+
+
+ # NOTE: The generated docs are incomplete - they don't contain code behind SVQC CSQC MENUQC GAMEQC ifdefs.
+ # With them added to PREDEFINED, it would take over half an hour to generate the docs and even then
+ # they might not be complete. Doxygen doesn't handle #elif and might not understand some QC definitions.
+ #doxygen: # rename to 'pages' when gitlab.com allows pages to exceed 100MiB
+ # before_script:
+ # - ln -s $PWD data/xonotic-data.pk3dir # is this needed?
+ # - apt-get update
+ # - apt-get -y install doxygen graphviz
+ # stage: deploy
+ # script:
+ # - cd qcsrc && doxygen
+ # - mv html ../public
+ # - mkdir -p ~/.ssh
+ # - for i in {0..0}; do eval $(printf "echo \$id_rsa_%02d\n" $i) >> ~/.ssh/id_rsa_base64; done
+ # - base64 --decode ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
+ # - chmod 600 ~/.ssh/id_rsa
+ # - echo -e "Host *\n\tStrictHostKeyChecking no\n\tLogLevel ERROR\n" >> ~/.ssh/config
+ # - git config --global user.name "Gitlab CI"
+ # - git config --global user.email "<>"
+ # - git clone --single-branch --depth 1 ${DEPLOY_HOST}:${DEPLOY_REPO} ~/deploy_
+ # - mkdir ~/deploy && mv ~/deploy_/.git ~/deploy && rm -r ~/deploy_
+ # - cp -r ../public/* ~/deploy
+ # - cd ~/deploy && git add -A . && git commit -m "Deploy ${CI_BUILD_REF}" && git push origin gh-pages
+ # artifacts:
+ # paths:
+ # - public
+ # only:
+ # - master
if (mode == 1)
label = "bckills"; // first case in the switch
+ #define SCO_LABEL(strlabel, label, padding, help) \
+ case label: \
+ if (!mode) \
+ return CTX(strlabel); \
+ LOG_HELP("^3", label, padding, "^7", help);
+
switch(label)
{
- case "bckills": if (!mode) return CTX(_("SCO^bckills")); else LOG_HELP(strcat("^3", "bckills", " ^7", _("Number of ball carrier kills")));
- case "bctime": if (!mode) return CTX(_("SCO^bctime")); else LOG_HELP(strcat("^3", "bctime", " ^7", _("Total amount of time holding the ball in Keepaway")));
- case "caps": if (!mode) return CTX(_("SCO^caps")); else LOG_HELP(strcat("^3", "caps", " ^7", _("How often a flag (CTF) or a key (KeyHunt) was captured")));
- case "captime": if (!mode) return CTX(_("SCO^captime")); else LOG_HELP(strcat("^3", "captime", " ^7", _("Time of fastest capture (CTF)")));
- case "deaths": if (!mode) return CTX(_("SCO^deaths")); else LOG_HELP(strcat("^3", "deaths", " ^7", _("Number of deaths")));
- case "destroyed": if (!mode) return CTX(_("SCO^destroyed")); else LOG_HELP(strcat("^3", "destroyed", " ^7", _("Number of keys destroyed by pushing them into void")));
- case "dmg": if (!mode) return CTX(_("SCO^damage")); else LOG_HELP(strcat("^3", "dmg", " ^7", _("The total damage done")));
- case "dmgtaken": if (!mode) return CTX(_("SCO^dmgtaken")); else LOG_HELP(strcat("^3", "dmgtaken", " ^7", _("The total damage taken")));
- case "drops": if (!mode) return CTX(_("SCO^drops")); else LOG_HELP(strcat("^3", "drops", " ^7", _("Number of flag drops")));
- case "elo": if (!mode) return CTX(_("SCO^elo")); else LOG_HELP(strcat("^3", "elo", " ^7", _("Player ELO")));
- case "fastest": if (!mode) return CTX(_("SCO^fastest")); else LOG_HELP(strcat("^3", "fastest", " ^7", _("Time of fastest lap (Race/CTS)")));
- case "faults": if (!mode) return CTX(_("SCO^faults")); else LOG_HELP(strcat("^3", "faults", " ^7", _("Number of faults committed")));
- case "fckills": if (!mode) return CTX(_("SCO^fckills")); else LOG_HELP(strcat("^3", "fckills", " ^7", _("Number of flag carrier kills")));
- case "fps": if (!mode) return CTX(_("SCO^fps")); else LOG_HELP(strcat("^3", "fps", " ^7", _("FPS")));
- case "frags": if (!mode) return CTX(_("SCO^frags")); else LOG_HELP(strcat("^3", "frags", " ^7", _("Number of kills minus suicides")));
- case "goals": if (!mode) return CTX(_("SCO^goals")); else LOG_HELP(strcat("^3", "goals", " ^7", _("Number of goals scored")));
- case "kckills": if (!mode) return CTX(_("SCO^kckills")); else LOG_HELP(strcat("^3", "kckills", " ^7", _("Number of keys carrier kills")));
- case "kd": if (!mode) return CTX(_("SCO^k/d")); else LOG_HELP(strcat("^3", "kd", " ^7", _("The kill-death ratio")));
- case "kdr": if (!mode) return CTX(_("SCO^kdr")); else LOG_HELP(strcat("^3", "kdr", " ^7", _("The kill-death ratio")));
- case "kdratio": if (!mode) return CTX(_("SCO^kdratio")); else LOG_HELP(strcat("^3", "kdratio", " ^7", _("The kill-death ratio")));
- case "kills": if (!mode) return CTX(_("SCO^kills")); else LOG_HELP(strcat("^3", "kills", " ^7", _("Number of kills")));
- case "laps": if (!mode) return CTX(_("SCO^laps")); else LOG_HELP(strcat("^3", "laps", " ^7", _("Number of laps finished (Race/CTS)")));
- case "lives": if (!mode) return CTX(_("SCO^lives")); else LOG_HELP(strcat("^3", "lives", " ^7", _("Number of lives (LMS)")));
- case "losses": if (!mode) return CTX(_("SCO^losses")); else LOG_HELP(strcat("^3", "losses", " ^7", _("Number of times a key was lost")));
- case "name": if (!mode) return CTX(_("SCO^name")); else LOG_HELP(strcat("^3", "name", " ^7", _("Player name")));
- case "nick": if (!mode) return CTX(_("SCO^nick")); else LOG_HELP(strcat("^3", "nick", " ^7", _("Player name")));
- case "objectives": if (!mode) return CTX(_("SCO^objectives")); else LOG_HELP(strcat("^3", "objectives", " ^7", _("Number of objectives destroyed")));
- case "pickups": if (!mode) return CTX(_("SCO^pickups")); else LOG_HELP(strcat("^3", "pickups", " ^7", _("How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up")));
- case "ping": if (!mode) return CTX(_("SCO^ping")); else LOG_HELP(strcat("^3", "ping", " ^7", _("Ping time")));
- case "pl": if (!mode) return CTX(_("SCO^pl")); else LOG_HELP(strcat("^3", "pl", " ^7", _("Packet loss")));
- case "pushes": if (!mode) return CTX(_("SCO^pushes")); else LOG_HELP(strcat("^3", "pushes", " ^7", _("Number of players pushed into void")));
- case "rank": if (!mode) return CTX(_("SCO^rank")); else LOG_HELP(strcat("^3", "rank", " ^7", _("Player rank")));
- case "returns": if (!mode) return CTX(_("SCO^returns")); else LOG_HELP(strcat("^3", "returns", " ^7", _("Number of flag returns")));
- case "revivals": if (!mode) return CTX(_("SCO^revivals")); else LOG_HELP(strcat("^3", "revivals", " ^7", _("Number of revivals")));
- case "rounds": if (!mode) return CTX(_("SCO^rounds won")); else LOG_HELP(strcat("^3", "rounds", " ^7", _("Number of rounds won")));
- case "score": if (!mode) return CTX(_("SCO^score")); else LOG_HELP(strcat("^3", "score", " ^7", _("Total score")));
- case "avgspeed": if (!mode) return CTX(_("SCO^average speed"));else LOG_HELP(strcat("^3", "avgspeed", " ^7", _("Average speed (CTS)")));
- case "topspeed": if (!mode) return CTX(_("SCO^top speed")); else LOG_HELP(strcat("^3", "topspeed", " ^7", _("Top speed (CTS)")));
- case "startspeed": if (!mode) return CTX(_("SCO^start speed")); else LOG_HELP(strcat("^3", "startspeed", " ^7", _("Start speed (CTS)")));
- case "strafe": if (!mode) return CTX(_("SCO^strafe")); else LOG_HELP(strcat("^3", "strafe", " ^7", _("Strafe efficiency (CTS)")));
- case "suicides": if (!mode) return CTX(_("SCO^suicides")); else LOG_HELP(strcat("^3", "suicides", " ^7", _("Number of suicides")));
- case "sum": if (!mode) return CTX(_("SCO^sum")); else LOG_HELP(strcat("^3", "sum", " ^7", _("Number of kills minus deaths")));
- case "takes": if (!mode) return CTX(_("SCO^takes")); else LOG_HELP(strcat("^3", "takes", " ^7", _("Number of domination points taken (Domination)")));
- case "teamkills": if (!mode) return CTX(_("SCO^teamkills")); else LOG_HELP(strcat("^3", "teamkills", " ^7", _("Number of teamkills")));
- case "ticks": if (!mode) return CTX(_("SCO^ticks")); else LOG_HELP(strcat("^3", "ticks", " ^7", _("Number of ticks (Domination)")));
- case "time": if (!mode) return CTX(_("SCO^time")); else LOG_HELP(strcat("^3", "time", " ^7", _("Total time raced (Race/CTS)")));
- default: return label;
+ SCO_LABEL(_("SCO^bckills"), "bckills", " ", _("Number of ball carrier kills"));
+ SCO_LABEL(_("SCO^bctime"), "bctime", " ", _("Total amount of time holding the ball in Keepaway"));
+ SCO_LABEL(_("SCO^caps"), "caps", " ", _("How often a flag (CTF) or a key (KeyHunt) was captured"));
+ SCO_LABEL(_("SCO^captime"), "captime", " ", _("Time of fastest capture (CTF)"));
+ SCO_LABEL(_("SCO^deaths"), "deaths", " ", _("Number of deaths"));
+ SCO_LABEL(_("SCO^destroyed"), "destroyed", " ", _("Number of keys destroyed by pushing them into void"));
+ SCO_LABEL(_("SCO^damage"), "dmg", " ", _("The total damage done"));
+ SCO_LABEL(_("SCO^dmgtaken"), "dmgtaken", " ", _("The total damage taken"));
+ SCO_LABEL(_("SCO^drops"), "drops", " ", _("Number of flag drops"));
+ SCO_LABEL(_("SCO^elo"), "elo", " ", _("Player ELO"));
+ SCO_LABEL(_("SCO^fastest"), "fastest", " ", _("Time of fastest lap (Race/CTS)"));
+ SCO_LABEL(_("SCO^faults"), "faults", " ", _("Number of faults committed"));
+ SCO_LABEL(_("SCO^fckills"), "fckills", " ", _("Number of flag carrier kills"));
+ SCO_LABEL(_("SCO^fps"), "fps", " ", _("FPS"));
+ SCO_LABEL(_("SCO^frags"), "frags", " ", _("Number of kills minus suicides"));
+ SCO_LABEL(_("SCO^goals"), "goals", " ", _("Number of goals scored"));
+ SCO_LABEL(_("SCO^hunts"), "hunts", " ", _("Number of hunts (Survival)"));
+ SCO_LABEL(_("SCO^kckills"), "kckills", " ", _("Number of keys carrier kills"));
+ SCO_LABEL(_("SCO^k/d"), "kd", " ", _("The kill-death ratio"));
+ SCO_LABEL(_("SCO^kdr"), "kdr", " ", _("The kill-death ratio"));
+ SCO_LABEL(_("SCO^kdratio"), "kdratio", " ", _("The kill-death ratio"));
+ SCO_LABEL(_("SCO^kills"), "kills", " ", _("Number of kills"));
+ SCO_LABEL(_("SCO^laps"), "laps", " ", _("Number of laps finished (Race/CTS)"));
+ SCO_LABEL(_("SCO^lives"), "lives", " ", _("Number of lives (LMS)"));
+ SCO_LABEL(_("SCO^losses"), "losses", " ", _("Number of times a key was lost"));
+ SCO_LABEL(_("SCO^name"), "name", " ", _("Player name"));
+ SCO_LABEL(_("SCO^nick"), "nick", " ", _("Player name"));
+ SCO_LABEL(_("SCO^objectives"), "objectives", " ", _("Number of objectives destroyed"));
+ SCO_LABEL(_("SCO^pickups"), "pickups", " ", _("How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up"));
+ SCO_LABEL(_("SCO^ping"), "ping", " ", _("Ping time"));
+ SCO_LABEL(_("SCO^pl"), "pl", " ", _("Packet loss"));
+ SCO_LABEL(_("SCO^pushes"), "pushes", " ", _("Number of players pushed into void"));
+ SCO_LABEL(_("SCO^rank"), "rank", " ", _("Player rank"));
+ SCO_LABEL(_("SCO^returns"), "returns", " ", _("Number of flag returns"));
+ SCO_LABEL(_("SCO^revivals"), "revivals", " ", _("Number of revivals"));
+ SCO_LABEL(_("SCO^rounds won"), "rounds", " ", _("Number of rounds won"));
+ SCO_LABEL(_("SCO^rounds played"), "rounds_pl", " ", _("Number of rounds played"));
+ SCO_LABEL(_("SCO^score"), "score", " ", _("Total score"));
++ SCO_LABEL(_("SCO^average speed"), "avgspeed", " ", _("Average speed (CTS)"));
++ SCO_LABEL(_("SCO^top speed"), "topspeed", " ", _("Top speed (CTS)"));
++ SCO_LABEL(_("SCO^start speed"), "startspeed", " ", _("Start speed (CTS)"));
++ SCO_LABEL(_("SCO^strafe"), "strafe", " ", _("Strafe efficiency (CTS)"));
+ SCO_LABEL(_("SCO^suicides"), "suicides", " ", _("Number of suicides"));
+ SCO_LABEL(_("SCO^sum"), "sum", " ", _("Number of kills minus deaths"));
+ SCO_LABEL(_("SCO^survivals"), "survivals", " ", _("Number of survivals"));
+ SCO_LABEL(_("SCO^takes"), "takes", " ", _("Number of domination points taken (Domination)"));
+ SCO_LABEL(_("SCO^teamkills"), "teamkills", " ", _("Number of teamkills"));
+ SCO_LABEL(_("SCO^ticks"), "ticks", " ", _("Number of ticks (Domination)"));
+ SCO_LABEL(_("SCO^time"), "time", " ", _("Total time raced (Race/CTS)"));
}
return label;
+ #undef SCO_LABEL
}
bool scoreboard_ui_disabling;
" +ctf/pickups +ctf/fckills +ctf/returns +ctf/caps +ons/takes +ons/caps" \
" +lms/lives +lms/rank" \
" +kh/kckills +kh/losses +kh/caps" \
-" ?+rc/laps ?+rc/time +rc,cts/fastest" \
+" ?+rc/laps ?+rc/time ?+cts/strafe ?+cts/startspeed ?+cts/avgspeed ?+cts/topspeed +rc,cts/fastest" \
" +as/objectives +nb/faults +nb/goals" \
- " +ka/pickups +ka/bckills +ka/bctime +ft/revivals" \
+ " +ka,tka/pickups +ka,tka/bckills +ka,tka/bctime +ft/revivals" \
" +dom/ticks +dom/takes" \
" -lms,rc,cts,inv,nb/score"
return ftos(fps);
}
+ case SP_ROUNDS_PL:
+ return ftos(pl.(scores(field)));
+
case SP_DMG: case SP_DMGTAKEN:
+ if (rounds_played)
+ return sprintf("%.2f k", pl.(scores(field)) / (1000 * rounds_played));
return sprintf("%.1f k", pl.(scores(field)) / 1000);
+ case SP_CTS_STRAFE:
+ {
+ float strafe_efficiency = pl.(scores(field)) / 1000;
+ if(strafe_efficiency < -1) return "";
+ sbt_field_rgb = '1 1 1' - (strafe_efficiency > 0 ? '1 0 1' : '0 1 1') * fabs(strafe_efficiency);
+ return sprintf("%.1f%%", strafe_efficiency * 100);
+ }
+
+ case SP_CTS_STARTSPEED:
+ case SP_CTS_AVGSPEED:
+ case SP_CTS_TOPSPEED:
+ {
+ float speed = pl.(scores(field)) * GetSpeedUnitFactor(autocvar_hud_speed_unit);
+ if(speed < 0) return "";
+ return sprintf("%d%s", speed, GetSpeedUnit(autocvar_hud_speed_unit));
+ }
+
default: case SP_SCORE:
tmp = pl.(scores(field));
f = scores_flags(field);