]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Juhu/scoreboard-strafe Juhu/scoreboard-strafe
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Thu, 22 Jun 2023 01:47:43 +0000 (03:47 +0200)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Thu, 22 Jun 2023 01:47:43 +0000 (03:47 +0200)
Fixed merge conflict caused by new SCO_LABEL macro

1  2 
.gitlab-ci.yml
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/common/scores.qh

diff --cc .gitlab-ci.yml
index 6f5c8c2d5bb6a40f15d3c19c26b6b64e4a88c976,5637179f1953643a4cbb29999eaa708d710038b1..5af7d56d147d1570d3be94d65115d859ea1e3522
- 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
index d22dc5f0994933da77e86643f97b5f4fdbc5b014,35227ffab524c63bb077dfb624b4005f19ed4032..f3b1091bde9a1721dff195148af74fbdf09ca94c
@@@ -116,57 -123,62 +123,66 @@@ string Label_getInfo(string label, int 
        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;
@@@ -732,9 -752,9 +756,9 @@@ void Cmd_Scoreboard_Help(
  " +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"
  
@@@ -1071,26 -1139,14 +1143,31 @@@ string Scoreboard_GetField(entity pl, P
                        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);
Simple merge