]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add Gametypes to the guide
authorotta8634 <k9wolf@pm.me>
Mon, 6 Jan 2025 16:51:34 +0000 (00:51 +0800)
committerotta8634 <k9wolf@pm.me>
Mon, 6 Jan 2025 16:51:34 +0000 (00:51 +0800)
Descriptions were based on https://gitlab.com/xonotic/xonotic/-/wikis/home, although some gamemodes don't have a description there.
Added back .gametype_description (now called .m_description) so that the shorter gamemode descriptions can still be used.
Added .m_name to the gamemode class, copied with the initial value of .message, so that the COLORED_NAME macros can be used. Ideally .message wouldn't be necessary since it's not very descriptive, I just didn't bother going through all instances of .message being used to make sure nothing would break.

42 files changed:
qcsrc/common/gamemodes/gamemode/assault/assault.qc
qcsrc/common/gamemodes/gamemode/assault/assault.qh
qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qc
qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qh
qcsrc/common/gamemodes/gamemode/ctf/ctf.qc
qcsrc/common/gamemodes/gamemode/ctf/ctf.qh
qcsrc/common/gamemodes/gamemode/cts/cts.qc
qcsrc/common/gamemodes/gamemode/cts/cts.qh
qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qc
qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qh
qcsrc/common/gamemodes/gamemode/domination/domination.qc
qcsrc/common/gamemodes/gamemode/domination/domination.qh
qcsrc/common/gamemodes/gamemode/duel/duel.qc
qcsrc/common/gamemodes/gamemode/duel/duel.qh
qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qc
qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qh
qcsrc/common/gamemodes/gamemode/invasion/invasion.qc
qcsrc/common/gamemodes/gamemode/invasion/invasion.qh
qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc
qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh
qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc
qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh
qcsrc/common/gamemodes/gamemode/lms/lms.qc
qcsrc/common/gamemodes/gamemode/lms/lms.qh
qcsrc/common/gamemodes/gamemode/mayhem/mayhem.qc
qcsrc/common/gamemodes/gamemode/mayhem/mayhem.qh
qcsrc/common/gamemodes/gamemode/nexball/nexball.qc
qcsrc/common/gamemodes/gamemode/nexball/nexball.qh
qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc
qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qh
qcsrc/common/gamemodes/gamemode/race/race.qc
qcsrc/common/gamemodes/gamemode/race/race.qh
qcsrc/common/gamemodes/gamemode/survival/survival.qc
qcsrc/common/gamemodes/gamemode/survival/survival.qh
qcsrc/common/gamemodes/gamemode/tdm/tdm.qc
qcsrc/common/gamemodes/gamemode/tdm/tdm.qh
qcsrc/common/gamemodes/gamemode/tka/tka.qc
qcsrc/common/gamemodes/gamemode/tka/tka.qh
qcsrc/common/gamemodes/gamemode/tmayhem/tmayhem.qc
qcsrc/common/gamemodes/gamemode/tmayhem/tmayhem.qh
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh

index c3e582a0f3be5516627627881aa90fb66196572a..dcbc05673b8764be7ee35468fef857b1bbbb5c40 100644 (file)
@@ -1 +1,15 @@
 #include "assault.qh"
+
+#ifdef MENUQC
+METHOD(Assault, describe, string(Assault this))
+{
+    TC(Assault, this);
+    return sprintf(_("%s is a team-based gamemode involving an attacking and a defending team\n\n"
+        "The attacking deam destroys objects placed on the map, which opens up new doors or pathways to more objects, until a main object (the enemy power core) is reached. "
+        "The attacking team wins the round if they manage to destroy the power core before time runs out, and then teams switch roles in the next round\n\n"
+        "The defending team has to defend the objects, winning the round if they successfully prevent the attacking team from destroying the power core\n\n"
+        "A team will win the match overall once they win at least one round where they attacked and one round where they defended, meaning there can be ties\n\n"
+        "Objects have waypoints which show their health and position, and they're destroyed by shooting them with any weapon"),
+    COLORED_NAME(this));
+}
+#endif
index 3a78a520fed7868a3a6ddf7489308e63c526499c..c07002d8f3594585b17a4301cddb3da5934970de 100644 (file)
@@ -5,7 +5,7 @@
 CLASS(Assault, Gametype)
     INIT(Assault)
     {
-        this.gametype_init(this, _("Assault"),"as","g_assault",GAMETYPE_FLAG_TEAMPLAY,"","timelimit=20");
+        this.gametype_init(this, _("Assault"),"as","g_assault",GAMETYPE_FLAG_TEAMPLAY,"","timelimit=20",_("Destroy obstacles to find and destroy the enemy power core before time runs out"));
     }
     METHOD(Assault, m_generate_mapinfo, void(Gametype this, string v))
     {
@@ -21,11 +21,6 @@ CLASS(Assault, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
     }
-    METHOD(Assault, describe, string(Assault this))
-    {
-        TC(Assault, this);
-        return _("Destroy obstacles to find and destroy the enemy power core before time runs out");
-    }
     ATTRIB(Assault, m_legacydefaults, string, "20 0");
 ENDCLASS(Assault)
 REGISTER_GAMETYPE(ASSAULT, NEW(Assault));
index 079d4b6e58d1e95eef724a17e6ebe12f03c51dda..f85384be651b0423994172e08dfcddc6a893493b 100644 (file)
@@ -1 +1,15 @@
 #include "clanarena.qh"
+
+#ifdef MENUQC
+METHOD(ClanArena, describe, string(ClanArena this))
+{
+    TC(ClanArena, this);
+    return sprintf(_("%s is a common round-based gamemode played with teams, where players spawn with all weapons available, have maximum health and armor, but only have one life per round. "
+        "There are no pickups available on the map in %s, making the gameplay fast-paced and focused on combat\n\n"
+        "Rounds start with a ten second grace period where weapons cannot be fired, so it's a good opportunity to group up with your team\n\n"
+        "The match ends once a team reaches a certain number of won rounds, or has a considerable lead over the other team\n\n"
+        "Since players only have one life per round, it's important to group up with fellow teammates and pay attention to any callouts from them. "
+        "Team coordination is key!"),
+    COLORED_NAME(this), COLORED_NAME(this));
+}
+#endif
index 1476e3692bd2a0a5458744fd8bccc291df7a6be4..b3a8635a14a396f3e55d5093a1809c627cc7e529 100644 (file)
@@ -9,7 +9,7 @@ void HUD_Mod_CA_Export(int fh);
 CLASS(ClanArena, Gametype)
     INIT(ClanArena)
     {
-        this.gametype_init(this, _("Clan Arena"),"ca","g_ca",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6");
+        this.gametype_init(this, _("Clan Arena"),"ca","g_ca",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill all enemy teammates to win the round"));
     }
     METHOD(ClanArena, m_parse_mapinfo, bool(string k, string v))
     {
@@ -39,11 +39,6 @@ CLASS(ClanArena, Gametype)
         TC(Gametype, this);
         returns(menu, _("Round limit:"),     5,  100,  5, "fraglimit_override",        "g_ca_teams_override",          _("The amount of rounds won needed before the match will end"));
     }
-    METHOD(ClanArena, describe, string(ClanArena this))
-    {
-        TC(ClanArena, this);
-        return _("Kill all enemy teammates to win the round");
-    }
 #ifdef CSQC
     ATTRIB(ClanArena, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
     ATTRIB(ClanArena, m_modicons_export, void(int fh), HUD_Mod_CA_Export);
index a6157c5886e128e591e4a1c5de649543fd1e537f..c8f078e21e3e3de68d8754d6b8a2f475475224a3 100644 (file)
@@ -1 +1,18 @@
 #include "ctf.qh"
+
+#ifdef MENUQC
+METHOD(CaptureTheFlag, describe, string(CaptureTheFlag this))
+{
+    TC(CaptureTheFlag, this);
+    return sprintf(_("%s is a common team-based gamemode where the object is to steal an enemy team's flag and bring it back to your own to capture it. "
+        "A flag can only be captured if your own flag is also home in its base, so it's important to collect your flag after it's dropped\n\n"
+        "The game is won once a team reaches a certain number of \"caps\" (captures), or has a considerable lead over the other team\n\n"
+        "If a flag is dropped into the void or a death trap it will be immediately returned to its base, or otherwise it will sit idle for a while before automatically returning itself. "
+        "If all flags are held by an enemy, after some time period a \"stalemate\" will initiate and all flag carriers (\"fc\"s) will be exposed on the radar and with waypoints\n\n"
+        "Some %s maps have more than two bases on it, but generally this is a 2-team gamemode\n\n"
+        "This gamemode rewards crafty movement, since the more difficult it is for enemies to attack you, the more likely you are to escape from their base with their flag. "
+        "Importantly, it also rewards base defense since if your enemies can't take your flag, they can never capture. "
+        "Lastly, good team communication is important, especially to let them know if you see the enemy flag carrier"),
+    COLORED_NAME(this), COLORED_NAME(this));
+}
+#endif
index 1d0f0a1f31a5f5a4482cc368fc699375afd7eff1..c5d15fec947da960da4feca23bd1cb04d5009062 100644 (file)
@@ -9,7 +9,7 @@ void HUD_Mod_CTF_Reset();
 CLASS(CaptureTheFlag, Gametype)
     INIT(CaptureTheFlag)
     {
-        this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=20 caplimit=10 leadlimit=6");
+        this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=20 caplimit=10 leadlimit=6",_("Find and bring the enemy flag to your base to capture it, defend your base from the other team"));
     }
     METHOD(CaptureTheFlag, m_generate_mapinfo, void(Gametype this, string v))
     {
@@ -29,11 +29,6 @@ CLASS(CaptureTheFlag, Gametype)
         TC(Gametype, this);
         returns(menu, _("Capture limit:"),   1,   20,  1, "capturelimit_override",     string_null,                    _("The amount of captures needed before the match will end"));
     }
-    METHOD(CaptureTheFlag, describe, string(CaptureTheFlag this))
-    {
-        TC(CaptureTheFlag, this);
-        return _("Find and bring the enemy flag to your base to capture it, defend your base from the other team");
-    }
 #ifdef CSQC
     ATTRIB(CaptureTheFlag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CTF);
     ATTRIB(CaptureTheFlag, m_modicons_reset, void(), HUD_Mod_CTF_Reset);
index cfc0c6f441216c90442d93d015fdaf86431e3dea..838f058d124b7c7d438860b6c88894a27fc77884 100644 (file)
@@ -1 +1,16 @@
 #include "cts.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/race/race.qh>
+
+METHOD(RaceCTS, describe, string(RaceCTS this))
+{
+    TC(RaceCTS, this);
+    return sprintf(_("%s is a unique gamemode, focusing on racing against other players on the map, rather than fighting them with weapons. "
+        "Players run through the map from start to finish as fast as possible and try to beat the times set by others\n\n"
+        "%s is similar to %s, except you don't run in laps, and instead run from the start line to the finish line, then start over again\n\n"
+        "Although this gamemode is quite different from the rest, it is played quite frequently since it's a great way to master movement skills and there are heaps of community-made maps available. "
+        "Also, it only requires one player to play"),
+    COLORED_NAME(this), COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_RACE));
+}
+#endif
index 52e42b927cb962cdb0f7aae573dfe3e547cdc249..075488fe6a2b9850cace6625b6a88f922cff0d12 100644 (file)
@@ -8,7 +8,7 @@
 CLASS(RaceCTS, Gametype)
     INIT(RaceCTS)
     {
-        this.gametype_init(this, _("Race CTS"),"cts","g_cts",0,"cloaked","timelimit=20");
+        this.gametype_init(this, _("Race CTS"),"cts","g_cts",0,"cloaked","timelimit=20",_("Race to the finish line for fastest time"));
     }
     METHOD(RaceCTS, m_generate_mapinfo, void(Gametype this, string v))
     {
@@ -27,11 +27,6 @@ CLASS(RaceCTS, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
     }
-    METHOD(RaceCTS, describe, string(RaceCTS this))
-    {
-        TC(RaceCTS, this);
-        return _("Race for fastest time.");
-    }
 #ifdef CSQC
     ATTRIB(RaceCTS, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
 #endif
index fd1e1e10e784c57326e1e06ce70c57e61dde3821..a79bb0a1eff172ab98559c7415be231ba3891bb7 100644 (file)
@@ -1 +1,16 @@
 #include "deathmatch.qh"
+
+#ifdef MENUQC
+#include <common/items/item/health.qh>
+#include <common/items/item/armor.qh>
+
+METHOD(Deathmatch, describe, string(Deathmatch this))
+{
+    TC(Deathmatch, this);
+    return sprintf(_("%s is a simple free-for-all fight to the death, where everyone plays against everyone else, and the winner is the one with the most points. "
+        "When fragged, you respawn with only the starter weapons, so any you collected up will have to be re-picked up\n\n"
+        "Scoring is quite simple, fragging an opponent adds one to your score, and fragging yourself subtracts one\n\n"
+        "Maps often have powerups and items like %s and %s, which are usually highly contested since sometimes they have the power to make or break a game, so making good use of them is important"),
+    COLORED_NAME(this), COLORED_NAME(ITEM_HealthMega), COLORED_NAME(ITEM_ArmorMega));
+}
+#endif
index 9c2a597efac6233e0a56aca90d9173977e2f99ca..ca55a3b872beb806c170d81e7ce2adf807390407 100644 (file)
@@ -5,17 +5,12 @@
 CLASS(Deathmatch, Gametype)
     INIT(Deathmatch)
     {
-        this.gametype_init(this, _("Deathmatch"),"dm","g_dm",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PREFERRED,"","timelimit=15 pointlimit=30 leadlimit=0");
+        this.gametype_init(this, _("Deathmatch"),"dm","g_dm",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PREFERRED,"","timelimit=15 pointlimit=30 leadlimit=0",_("Score as many frags as you can"));
     }
     METHOD(Deathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
     {
         return true;
     }
-    METHOD(Deathmatch, describe, string(Deathmatch this))
-    {
-        TC(Deathmatch, this);
-        return _("Score as many frags as you can");
-    }
     ATTRIB(Deathmatch, m_legacydefaults, string, "30 20 0");
 ENDCLASS(Deathmatch)
 REGISTER_GAMETYPE(DEATHMATCH, NEW(Deathmatch));
index 3e5bebafbd8af95570741aadbc550e9639bff798..ef21634e28f30912516c073e05ebb7eed005a7ba 100644 (file)
@@ -1 +1,14 @@
 #include "domination.qh"
+
+#ifdef MENUQC
+METHOD(Domination, describe, string(Domination this))
+{
+    TC(Domination, this);
+    return sprintf(_("%s is a gamemode where teams compete to dominate the map by capturing and keeping control points\n\n"
+        "Control points are displayed on the radar to make finding them easy, and they are captured by simply walking through them. "
+        "However, an enemy can just as easily steal a control point owned by your team by doing the same. "
+        "Control points start neutral (owned by no teams)\n\n"
+        "Scoring is a combination of frags and score automatically generated by any control points held by your team, every few seconds"),
+    COLORED_NAME(this));
+}
+#endif
index 38db5358bb5598fd6d610367cc29ac258bc5d300..3117c2980e43c172da10d9de8d02fb15007183f5 100644 (file)
@@ -9,7 +9,7 @@ void HUD_Mod_Dom_Export(int fh);
 CLASS(Domination, Gametype)
     INIT(Domination)
     {
-        this.gametype_init(this, _("Domination"),"dom","g_domination",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0");
+        this.gametype_init(this, _("Domination"),"dom","g_domination",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0",_("Capture and defend all the control points to win"));
     }
     METHOD(Domination, m_parse_mapinfo, bool(string k, string v))
     {
@@ -34,11 +34,6 @@ CLASS(Domination, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),    50,  500, 10, "g_domination_point_limit",  "g_domination_teams_override",  _("The amount of points needed before the match will end"));
     }
-    METHOD(Domination, describe, string(Domination this))
-    {
-        TC(Domination, this);
-        return _("Capture and defend all the control points to win");
-    }
 #ifdef CSQC
     ATTRIB(Domination, m_modicons, void(vector pos, vector mySize), HUD_Mod_Dom);
     ATTRIB(Domination, m_modicons_export, void(int fh), HUD_Mod_Dom_Export);
index 6cba48c2f3a9a2389513a1418535a04735d95469..349d6eda7b6803ca3bb7eab971b081d877edd40c 100644 (file)
@@ -1 +1,18 @@
 #include "duel.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
+#include <common/items/item/health.qh>
+#include <common/items/item/armor.qh>
+
+METHOD(Duel, describe, string(Duel this))
+{
+    TC(Duel, this);
+    return sprintf(_("%s is a 1-vs-1 arena battle to decide the winner, essentially a 2-player version of %s, making it one of the most competitive gamemodes\n\n"
+        "Since players on their own, important items like the %s and %s are heavily contested, "
+        "and are often \"timed\" by observing the in-game timer when it is picked up to determine when it'll next spawn. "
+        "The player with the best item control is often the winner\n\n"
+        "Once you kill your opponent, they will spawn with few weapons and limited health, so it is a good opportunity to search the map for them to pick up an easy frag and continue your streak"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_DEATHMATCH), COLORED_NAME(ITEM_HealthMega), COLORED_NAME(ITEM_ArmorMega));
+}
+#endif
index cb1942ce4083486b03e19a30cb145a1fa722d848..316b6c341ec1584466495724d2569c8fd39b0871 100644 (file)
@@ -6,7 +6,7 @@
 CLASS(Duel, Gametype)
     INIT(Duel)
     {
-        this.gametype_init(this, _("Duel"),"duel","g_duel",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_1V1,"","timelimit=10 pointlimit=0 leadlimit=0");
+        this.gametype_init(this, _("Duel"),"duel","g_duel",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_1V1,"","timelimit=10 pointlimit=0 leadlimit=0",_("Fight in a one versus one arena battle to decide the winner"));
     }
     METHOD(Duel, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
     {
@@ -23,11 +23,6 @@ CLASS(Duel, Gametype)
         }
         return false;
     }
-    METHOD(Duel, describe, string(Duel this))
-    {
-        TC(Duel, this);
-        return _("Fight in a one versus one arena battle to decide the winner");
-    }
 ENDCLASS(Duel)
 REGISTER_GAMETYPE(DUEL, NEW(Duel));
 #define g_duel IS_GAMETYPE(DUEL)
index 9bb8304eb2f2f4c68f8bb31c489898d740f60b28..9b54d65695337efa21a7710cf4a1f0cec7844f1f 100644 (file)
@@ -1 +1,16 @@
 #include "freezetag.qh"
+
+#ifdef MENUQC
+METHOD(FreezeTag, describe, string(FreezeTag this))
+{
+    TC(FreezeTag, this);
+    return sprintf(_("%s is a round-based teamplay gamemode where killed players are frozen and need to be unfrozen to re-enter the round. "
+        "The round ends when all players from all opposing teams are frozen, scoring the remaining team a point\n\n"
+        "Frozen players slowly unfreeze over time, but they unfreeze much faster when \"revived\" by a teammate standing in close proximity. "
+        "Additionally, damaging frozen players on the other team helps unfreeze them, so it is best to try to avoid doing that\n\n"
+        "Like in many other round-based gamemodes, rounds start with a ten second grace period where weapons cannot be fired, meaning it's a good opportunity to grab as many pickups as you can\n\n"
+        "Sneakily reviving a teammate will bring them back into the match to help outnumber your opponents, but it should be done with caution since often enemies pay close attention to frozen players to make sure they aren't being revived. "
+        "For this reason it's important to have good team communication especially while frozen, so you can let your teammates know where the enemies are"),
+    COLORED_NAME(this));
+}
+#endif
index a58073c55d30fafe55e0724d1c2841f899805661..f1723757a6024d1d0a92ed5dfbd16f26995dcd60 100644 (file)
@@ -12,7 +12,7 @@ void HUD_Mod_FreezeTag_Export(int fh);
 CLASS(FreezeTag, Gametype)
     INIT(FreezeTag)
     {
-        this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6");
+        this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win"));
     }
     METHOD(FreezeTag, m_parse_mapinfo, bool(string k, string v))
     {
@@ -42,11 +42,6 @@ CLASS(FreezeTag, Gametype)
         TC(Gametype, this);
         returns(menu, _("Round limit:"),     5,  100,  5, "fraglimit_override",        "g_freezetag_teams_override",   _("The amount of rounds won needed before the match will end"));
     }
-    METHOD(FreezeTag, describe, string(FreezeTag this))
-    {
-        TC(FreezeTag, this);
-        return _("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win");
-    }
 #ifdef CSQC
     ATTRIB(FreezeTag, m_modicons, void(vector pos, vector mySize), HUD_Mod_FreezeTag);
     ATTRIB(FreezeTag, m_modicons_export, void(int fh), HUD_Mod_FreezeTag_Export);
index 6462b92bf628eec3c286a6f3491baf3d0a5e303f..c000db4ae2074240a1d76efa589a9d219635009a 100644 (file)
@@ -1 +1,13 @@
 #include "invasion.qh"
+
+#ifdef MENUQC
+METHOD(Invasion, describe, string(Invasion this))
+{
+    TC(Invasion, this);
+    return sprintf(_("%s is a unique gamemode played in rounds where a herd of monsters spawn all around the map and players must try to kill as many as possible. "
+        "Since players can't damage each other, they instead fight to steal monster frags from each other. "
+        "The player who frags the most monsters overall wins the match\n\n"
+        "A round ends when either all monsters are fragged, or after a time limit"),
+    COLORED_NAME(this));
+}
+#endif
index 70644a1fa806577a106909a523e81250eda201cc..71f6b7d143486643813969527f5c231359c971a8 100644 (file)
@@ -5,7 +5,7 @@
 CLASS(Invasion, Gametype)
     INIT(Invasion)
     {
-        this.gametype_init(this, _("Invasion"),"inv","g_invasion",GAMETYPE_FLAG_USEPOINTS,"","pointlimit=50 type=0");
+        this.gametype_init(this, _("Invasion"),"inv","g_invasion",GAMETYPE_FLAG_USEPOINTS,"","pointlimit=50 type=0",_("Survive against waves of monsters"));
     }
     METHOD(Invasion, m_parse_mapinfo, bool(string k, string v))
     {
@@ -26,10 +26,5 @@ CLASS(Invasion, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
     }
-    METHOD(Invasion, describe, string(Invasion this))
-    {
-        TC(Invasion, this);
-        return _("Survive against waves of monsters");
-    }
 ENDCLASS(Invasion)
 REGISTER_GAMETYPE(INVASION, NEW(Invasion));
index fe03dc9a9de8a16230f351dcdc25a7ca11927a7d..bd89e5def65ba33d39e4756328fa5b33bb13278f 100644 (file)
@@ -1 +1,18 @@
 #include "keepaway.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/ctf/ctf.qh>
+
+METHOD(Keepaway, describe, string(Keepaway this))
+{
+    TC(Keepaway, this);
+    return sprintf(_("%s is a free-for-all match where a ball spawns randomly on the map and the goal is to hold the ball for as long as possible\n\n"
+        "Your score increases when you frag someone while you're holding a ball and when you frag the ball carrier. "
+        "The first player to reach the score limit will win the match\n\n"
+        "When the ball carrier is fragged, the ball will drop to the ground and anyone is able to pick it up. "
+        "If nobody picks it up after some time it will get bored and teleport itself elsewhere. "
+        "Unlike the flag in %s, the ball in %s can't be thrown\n\n"
+        "%s rewards good fragging but also good movement, since the better you can evade attacks, the longer you can keep the ball"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_CTF), COLORED_NAME(this), COLORED_NAME(this));
+}
+#endif
index dc668ae0a5faac883181493279447112efa81af8..3aac451d1c0b2804f1109135483ab57085139684 100644 (file)
@@ -8,17 +8,12 @@ void HUD_Mod_Keepaway(vector pos, vector mySize);
 CLASS(Keepaway, Gametype)
     INIT(Keepaway)
     {
-        this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=30");
+        this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=30",_("Hold the ball to get points for kills"));
     }
     METHOD(Keepaway, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
     {
         return true;
     }
-    METHOD(Keepaway, describe, string(Keepaway this))
-    {
-        TC(Keepaway, this);
-        return _("Hold the ball to get points for kills");
-    }
 #ifdef CSQC
     ATTRIB(Keepaway, m_modicons, void(vector pos, vector mySize), HUD_Mod_Keepaway);
 #endif
index 724a0e6d4f16163fc7d022d541c40b8c241a0ee0..4cb1870844853c09ebd51411dc82dafae1ebce11 100644 (file)
@@ -1 +1,16 @@
 #include "keyhunt.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/ctf/ctf.qh>
+
+METHOD(KeyHunt, describe, string(KeyHunt this))
+{
+    TC(KeyHunt, this);
+    return sprintf(_("%s is a round-based gamemode played with a few teams, where each team starts with 1 key and all keys must be collected to win the round. "
+        "The team member who is given the key at the start of the round is randomly selected after a ten second period, and the location of all keys will be visible in the radar after a few seconds\n\n"
+        "Scoring in %s is quite complicated, involving a mix of gathering all keys, points for collecting a key, killing an enemy key carrier, and killing other enemies. "
+        "If a key is destroyed by being dropped into the void or a death trap, points are allocated accordingly\n\n"
+        "Like in %s the key can be dropped, so you can pass it to your teammates if you're running low on health"),
+    COLORED_NAME(this), COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_CTF));
+}
+#endif
index df269d8ed43f9bc10199ee5cd171c4c82a1dbc99..cc9cecdaf2a19aaabf2281fcad12b4b7e104d22b 100644 (file)
@@ -8,7 +8,7 @@ void HUD_Mod_KH(vector pos, vector mySize);
 CLASS(KeyHunt, Gametype)
     INIT(KeyHunt)
     {
-        this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0");
+        this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0",_("Gather all the keys to win the round"));
     }
     METHOD(KeyHunt, m_parse_mapinfo, bool(string k, string v))
     {
@@ -38,11 +38,6 @@ CLASS(KeyHunt, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit",     "g_keyhunt_teams_override",     _("The amount of points needed before the match will end"));
     }
-    METHOD(KeyHunt, describe, string(KeyHunt this))
-    {
-        TC(KeyHunt, this);
-        return _("Gather all the keys to win the round");
-    }
 #ifdef CSQC
     ATTRIB(KeyHunt, m_modicons, void(vector pos, vector mySize), HUD_Mod_KH);
 #endif
index 92fb7df9e61fa37f294d911200bd699dd8e4d85d..b1c00e1728c56d7c55a42f03c62166305c5dbda9 100644 (file)
@@ -1 +1,15 @@
 #include "lms.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/clanarena/clanarena.qh>
+
+METHOD(LastManStanding, describe, string(LastManStanding this))
+{
+    TC(LastManStanding, this);
+    return sprintf(_("%s is a free-for-all gamemode where all players start with a certain number of lives, and are eliminated from the match once they lose all lives. "
+        "Players spawn in with all available weapons, maximum health, maximum armor, and health and armor do not regenerate, similar to gamemodes like %s. "
+        "Similarly, item pickups don't spawn on the map\n\n"
+        "Hiding is sometimes a viable strategy since if you can't be found you can't lose lives, but often you become a vulnerable target once discovered"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_CA));
+}
+#endif
index 42293bab0b97e268954ddd481d765709c734939c..b90f6c6eb1db67dee498426eda422ce4680d14b9 100644 (file)
@@ -8,7 +8,7 @@ void HUD_Mod_LMS(vector myPos, vector mySize);
 CLASS(LastManStanding, Gametype)
     INIT(LastManStanding)
     {
-        this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_HIDELIMITS,"","timelimit=20 lives=5 leadlimit=0");
+        this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_HIDELIMITS,"","timelimit=20 lives=5 leadlimit=0",_("Survive and kill until the enemies have no lives left"));
     }
     METHOD(LastManStanding, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
     {
@@ -19,11 +19,6 @@ CLASS(LastManStanding, Gametype)
         TC(Gametype, this);
         returns(menu, _("Lives:"),           3,   50,  1, "g_lms_lives_override",      string_null,                    string_null);
     }
-    METHOD(LastManStanding, describe, string(LastManStanding this))
-    {
-        TC(LastManStanding, this);
-        return _("Survive and kill until the enemies have no lives left");
-    }
     ATTRIB(LastManStanding, m_legacydefaults, string, "9 20 0");
 #ifdef CSQC
     ATTRIB(LastManStanding, m_modicons, void(vector myPos, vector mySize), HUD_Mod_LMS);
index 6af7428884eb433312d8e452b3253df21d6917d5..98e5af9709ae48a696b94aa65fccc45422dacdd4 100644 (file)
@@ -1 +1,15 @@
 #include "mayhem.qh"
+
+#ifdef MENUQC
+METHOD(mayhem, describe, string(mayhem this))
+{
+       TC(mayhem, this);
+       return sprintf(_("%s is a fast-paced free-for-all deathmatch where players spawn in with all available weapons and maximum health and armor. "
+               "There are no pickups enabled on maps, but buffs are still available\n\n"
+               "It shines in its unique handling of scoring, accouting for both frags but also damage dealt. "
+               "This means that if you almost frag a player you will still be rewarded with points, but dealing the final blow is always better if possible. "
+               "Points are deducted when you walk into damage triggers, but not when you do movement tricks like blaster jumping since self damage is disabled\n\n"
+               "Since damage is always rewarded in %s, the more you shoot the better, turning this gamemode into chaotic fun at times"),
+       COLORED_NAME(this), COLORED_NAME(this));
+}
+#endif
index 688892d9e8f9465d79d7f75f0626b416dfcf5f76..a25882080a0427d107483e0cff92da95f58bdd18 100644 (file)
@@ -7,7 +7,7 @@
 CLASS(mayhem, Gametype)
        INIT(mayhem)
        {
-               this.gametype_init(this, _("Mayhem"),"mayhem","g_mayhem",GAMETYPE_FLAG_USEPOINTS,"","timelimit=15 pointlimit=1000 leadlimit=0");
+               this.gametype_init(this, _("Mayhem"),"mayhem","g_mayhem",GAMETYPE_FLAG_USEPOINTS,"","timelimit=15 pointlimit=1000 leadlimit=0",_("Compete for the most damage dealt and frags in this chaotic mayhem"));
        }
        METHOD(mayhem, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
        {
@@ -30,11 +30,6 @@ CLASS(mayhem, Gametype)
                TC(Gametype, this);
                returns(menu, _("Point limit:"),     200,  2000,  100, "g_mayhem_point_limit",         string_null,         _("How much score is needed before the match will end"));
        }
-       METHOD(mayhem, describe, string(mayhem this))
-       {
-               TC(mayhem, this);
-               return _("Compete for the most damage dealt and frags in this chaotic mayhem!");
-       }
        ATTRIB(mayhem, m_legacydefaults, string, "1000 20 0");
 ENDCLASS(mayhem)
 REGISTER_GAMETYPE(MAYHEM, NEW(mayhem));
index 4b49dba3ed8b829b7cf6298477c0bc267e0f0789..2ea7269c59c7ad982feec8a8487e8f3aea2ac582 100644 (file)
@@ -1 +1,14 @@
 #include "nexball.qh"
+
+#ifdef MENUQC
+#include "weapon.qh"
+
+METHOD(NexBall, describe, string(NexBall this))
+{
+    TC(NexBall, this);
+    return sprintf(_("%s is a fun ball sport game where 2 teams compete to score the most goals\n\n"
+        "%s is usually played as either soccer where players walk into the ball to kick it around, or basketball where players have a %s so can pass the ball and intercept passes\n\n"
+        "Keep in mind players can score own goals, so don't embarrass yourself in front of your team!"),
+    COLORED_NAME(this), COLORED_NAME(this), COLORED_NAME(WEP_NEXBALL));
+}
+#endif
index 81a5fc686140c4251f907cb24be6b823d60f5b64..845fb2ec11161888a04e7d13d63a5ec44dbae3c0 100644 (file)
@@ -8,7 +8,7 @@ void HUD_Mod_NexBall(vector pos, vector mySize);
 CLASS(NexBall, Gametype)
     INIT(NexBall)
     {
-        this.gametype_init(this, _("Nexball"),"nb","g_nexball",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_WEAPONARENA,"","timelimit=20 pointlimit=5 leadlimit=0");
+        this.gametype_init(this, _("Nexball"),"nb","g_nexball",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_WEAPONARENA,"","timelimit=20 pointlimit=5 leadlimit=0",_("Shoot and kick the ball into the enemies goal, keep your goal clean"));
     }
     METHOD(NexBall, m_generate_mapinfo, void(Gametype this, string v))
     {
@@ -24,11 +24,6 @@ CLASS(NexBall, Gametype)
         TC(Gametype, this);
         returns(menu, _("Goal limit:"),      1,   50,  1, "g_nexball_goallimit",       string_null,                    _("The amount of goals needed before the match will end"));
     }
-    METHOD(NexBall, describe, string(NexBall this))
-    {
-        TC(NexBall, this);
-        return _("Shoot and kick the ball into the enemies goal, keep your goal clean");
-    }
 #ifdef CSQC
     ATTRIB(NexBall, m_modicons, void(vector pos, vector mySize), HUD_Mod_NexBall);
 #endif
index 18c2cbf1f72c536e557cbc44a70b5c0a669ec76d..a284bf345790e5520729ca950f671262b9b35333 100644 (file)
@@ -65,4 +65,21 @@ MUTATOR_HOOKFUNCTION(cl_ons, CustomizeEventchase)
        return false;
 }
 
-#endif
+#endif // CSQC
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/assault/assault.qh>
+#include <common/gamemodes/gamemode/domination/domination.qh>
+
+METHOD(Onslaught, describe, string(Onslaught this))
+{
+       TC(Onslaught, this);
+       return sprintf(_("%s is a team-based gamemode similar to %s where the final goal is to destroy the enemy team core generator. "
+               "In order to destroy the generator, control points on the map (similar to those in %s) must first be captured\n\n"
+               "Since your team can only capture a control point if it is connected to another control point currently owned by your team, you have to systematically work through the map to reach the enemy generator\n\n"
+               "A control point is captured by walking into it then waiting for it to finish constructing. "
+               "Control points of the opposing team are destroyed by attacking the \"info bot\" that hovers above them, converting the control point to neutral once it is destroyed\n\n"
+               "When in overtime, the enemy's generator will start to decay, at a faster rate the more control points your team has"),
+       COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_ASSAULT));
+}
+
+#endif // MENUQC
index a48d4f876296c8a1ce9bfbcae637877d3548a766..fc3938b9240521c192c94c9ac90a9756e9d56705 100644 (file)
@@ -5,7 +5,7 @@
 CLASS(Onslaught, Gametype)
     INIT(Onslaught)
     {
-        this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",GAMETYPE_FLAG_TEAMPLAY,"","pointlimit=1 timelimit=20");
+        this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",GAMETYPE_FLAG_TEAMPLAY,"","pointlimit=1 timelimit=20",_("Capture control points to reach and destroy the enemy generator"));
     }
     METHOD(Onslaught, m_generate_mapinfo, void(Gametype this, string v))
     {
@@ -17,11 +17,6 @@ CLASS(Onslaught, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
     }
-    METHOD(Onslaught, describe, string(Onslaught this))
-    {
-        TC(Onslaught, this);
-        return _("Capture control points to reach and destroy the enemy generator");
-    }
     ATTRIB(Onslaught, m_legacydefaults, string, "20 0");
 ENDCLASS(Onslaught)
 REGISTER_GAMETYPE(ONSLAUGHT, NEW(Onslaught));
index f41a747c5c29086f579f624997b5ace2bb67306e..99c1ab88fb64c5a8f1ade6de6f1158fa99ccc0cc 100644 (file)
@@ -1 +1,14 @@
 #include "race.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/cts/cts.qh>
+
+METHOD(Race, describe, string(Race this))
+{
+    TC(Race, this);
+    return sprintf(_("%s is a gamemode similar to %s except the start and finish line of the track are identical, so you run laps repeatedly through the track\n\n"
+        "Consequently the aim is to keep running constantly to complete as many laps as possible for the shot at the fastest time, rather than resetting runs like in %s to set the individual best time. "
+        "Since you continue straight onto the next lap, having a speedy finish to a lap means that your next lap will start off with high speed, giving you a good shot at beating your personal best"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_CTS), COLORED_NAME(MAPINFO_TYPE_CTS));
+}
+#endif
index 26120f4c6a288937f4dd42a44dbf5a076112b3db..ddc11089c12116cfc1d142affbdd964aedc49fd3 100644 (file)
@@ -8,7 +8,7 @@ void HUD_Mod_Race(vector pos, vector mySize);
 CLASS(Race, Gametype)
     INIT(Race)
     {
-        this.gametype_init(this, _("Race"),"rc","g_race",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0");
+        this.gametype_init(this, _("Race"),"rc","g_race",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0",_("Race against other players to the finish line"));
     }
     METHOD(Race, m_parse_mapinfo, bool(string k, string v))
     {
@@ -37,11 +37,6 @@ CLASS(Race, Gametype)
         TC(Gametype, this);
         returns(menu, _("Laps:"),            1,   25,  1, "g_race_laps_limit",         string_null,                    string_null);
     }
-    METHOD(Race, describe, string(Race this))
-    {
-        TC(Race, this);
-        return _("Race against other players to the finish line");
-    }
 #ifdef CSQC
     ATTRIB(Race, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
 #endif
index 26191ad9c893855b4954ff0da60eec1915d98dd3..41eac7b888337507cfb112308028f9a70d282f6d 100644 (file)
@@ -3,3 +3,17 @@
 #ifdef GAMEQC
 REGISTER_NET_LINKED(ENT_CLIENT_SURVIVALSTATUSES)
 #endif
+#ifdef MENUQC
+METHOD(Survival, describe, string(Survival this))
+{
+    TC(Survival, this);
+    return sprintf(_("%s is a hunter-survivor gamemode involving two teams where the goal of the hunters is to frag all survivors, and the goal of the survivors is to frag all hunters or survive until time runs out. "
+        "The trick lies in the fact that players only know which team they belong to, and not the team membership of any other players\n\n"
+        "Since the goal of both teams is essentially to eliminate all members of the opposite team, it can be tricky for survivors to figure out their fellow teammates\n\n"
+        "Teams are randomly selected as the round begins, with the hunter team being a bit smaller, "
+        "and then the round starts with a brief warmup grace period in which items can be collected but weapons can't be fired\n\n"
+        "Players are rewarded a point for each member of the opposing team they frag, only if they survive the round, and points are deducted for each teammate fragged. "
+        "Extra points are also to survivors who survive until the round timer expires"),
+    COLORED_NAME(this));
+}
+#endif
index ccb38f4d71e9a382a1b898ec8a1fd285eb51ed7d..fb7534074f667e3fd90b3e6b7ee3067aa3574f5a 100644 (file)
@@ -9,7 +9,7 @@ void HUD_Mod_Survival(vector pos, vector mySize);
 CLASS(Survival, Gametype)
     INIT(Survival)
     {
-        this.gametype_init(this, _("Survival"), "surv", "g_survival", GAMETYPE_FLAG_USEPOINTS, "", "timelimit=20 pointlimit=12");
+        this.gametype_init(this, _("Survival"), "surv", "g_survival", GAMETYPE_FLAG_USEPOINTS, "", "timelimit=20 pointlimit=12",_("Identify and eliminate all the hunters before all your allies are gone"));
     }
     METHOD(Survival, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
     {
@@ -25,11 +25,6 @@ CLASS(Survival, Gametype)
         }
         return false;
     }
-    METHOD(Survival, describe, string(Survival this))
-    {
-        TC(Survival, this);
-        return _("Identify and eliminate all the hunters before all your allies are gone");
-    }
 #ifdef CSQC
     ATTRIB(Survival, m_modicons, void(vector pos, vector mySize), HUD_Mod_Survival);
 #endif
index ca84d01d5ea5c09720dfe44e2e2def30d3be0519..aeceb2b6d0e92e84357e124b4a690a73bfdfd468 100644 (file)
@@ -1 +1,14 @@
 #include "tdm.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
+
+METHOD(TeamDeathmatch, describe, string(TeamDeathmatch this))
+{
+    TC(TeamDeathmatch, this);
+    return sprintf(_("%s is the team version of %s, played with 2 teams\n\n"
+        "Scoring is quite simple, adding a point for every frag, and subtracting a point for fragging yourself or a teammate\n\n"
+        "Careful team coordination and map control is often a key to winning a match, and sometimes players will share weapons with their teammates"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_DEATHMATCH));
+}
+#endif
index 31edf1a54a8b8f0d28b7349d4ebe14eb9d66f92f..ab7a16427c5a954d9b76dd0a9b5f3e0107da213f 100644 (file)
@@ -6,7 +6,7 @@
 CLASS(TeamDeathmatch, Gametype)
     INIT(TeamDeathmatch)
     {
-        this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0");
+        this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Help your team score the most frags against the enemy team"));
     }
     METHOD(TeamDeathmatch, m_parse_mapinfo, bool(string k, string v))
     {
@@ -46,11 +46,6 @@ CLASS(TeamDeathmatch, Gametype)
         TC(Gametype, this);
         returns(menu, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit",         "g_tdm_teams_override",         _("The amount of points needed before the match will end"));
     }
-    METHOD(TeamDeathmatch, describe, string(TeamDeathmatch this))
-    {
-        TC(TeamDeathmatch, this);
-        return _("Help your team score the most frags against the enemy team");
-    }
     ATTRIB(TeamDeathmatch, m_legacydefaults, string, "50 20 2 0");
 ENDCLASS(TeamDeathmatch)
 REGISTER_GAMETYPE(TEAM_DEATHMATCH, NEW(TeamDeathmatch));
index e0e6033c0820495f4a3d9abd2a078e38fcb7788e..3b2d7b60b0c56c699bcb7c05e9db8a13b75e4871 100644 (file)
@@ -1 +1,13 @@
 #include "tka.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/keepaway/keepaway.qh>
+
+METHOD(TeamKeepaway, describe, string(TeamKeepaway this))
+{
+    TC(TeamKeepaway, this);
+    return sprintf(_("%s is the team version of %s, where teams compete to maintain superior control over the ball\n\n"
+        "Scoring is similar to in %s, except that points are awarded for frags for all members of the team of the player holding the ball"),
+    COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_KEEPAWAY), COLORED_NAME(MAPINFO_TYPE_KEEPAWAY));
+}
+#endif
index 087af298d86cccb5bb4545b3b102bb84ef8b3b87..af9d60db3af7dc3aa908b97d715a4dcb161a2d09 100644 (file)
@@ -10,7 +10,7 @@
 CLASS(TeamKeepaway, Gametype)
     INIT(TeamKeepaway)
     {
-        this.gametype_init(this, _("Team Keepaway"),"tka","g_tka",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0");
+        this.gametype_init(this, _("Team Keepaway"),"tka","g_tka",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Keep the ball in your team's possession to get points for kills"));
     }
     METHOD(TeamKeepaway, m_parse_mapinfo, bool(string k, string v))
     {
@@ -51,11 +51,6 @@ CLASS(TeamKeepaway, Gametype)
     {
         cvar_set("g_tka_teams", sa);
     }
-    METHOD(TeamKeepaway, describe, string(TeamKeepaway this))
-    {
-        TC(TeamKeepaway, this);
-        return _("Keep the ball in your team's possession to get points for kills");
-    }
 #ifdef CSQC
     ATTRIB(TeamKeepaway, m_modicons, void(vector pos, vector mySize), HUD_Mod_TeamKeepaway);
 #endif
index b05860a8c7dee51c9173260632208a7fea7afc64..bedc8cf24a05a3b0ca446beaf387433f63c773a5 100644 (file)
@@ -1 +1,16 @@
 #include "tmayhem.qh"
+
+#ifdef MENUQC
+#include <common/gamemodes/gamemode/clanarena/clanarena.qh>
+#include <common/gamemodes/gamemode/mayhem/mayhem.qh>
+
+METHOD(tmayhem, describe, string(tmayhem this))
+{
+       TC(tmayhem, this);
+       return sprintf(_("%s is a constant action team-based gamemode based on %s, using the same scoring system. "
+               "It has a lot of similarities to %s, with one of the main differences being that %s is a round-based gamemode, and of course the scoring system differences\n\n"
+               "Since it doesn't have rounds, the chaos is nonstop. "
+               "As a consequence of the chaotic nature, team communication is less important in this gamemode than other team-based gamemodes\n\n"),
+       COLORED_NAME(this), COLORED_NAME(MAPINFO_TYPE_MAYHEM), COLORED_NAME(MAPINFO_TYPE_CA), COLORED_NAME(MAPINFO_TYPE_CA));
+}
+#endif
index 9d5a5c6619aef583446cc44c4d2b9879479140b8..5e335b6f3c9b4cde9474acbc8f79dddc205bdec0 100644 (file)
@@ -7,7 +7,7 @@
 CLASS(tmayhem, Gametype)
        INIT(tmayhem)
        {
-               this.gametype_init(this, _("Team Mayhem"),"tmayhem","g_tmayhem",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=1500 teams=2 leadlimit=0");
+               this.gametype_init(this, _("Team Mayhem"),"tmayhem","g_tmayhem",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=1500 teams=2 leadlimit=0",_("Compete with your team for the most damage dealt and frags in this chaotic mayhem"));
        }
        METHOD(tmayhem, m_parse_mapinfo, bool(string k, string v))
        {
@@ -45,11 +45,6 @@ CLASS(tmayhem, Gametype)
                TC(Gametype, this);
                returns(menu, _("Point limit:"),     200,  3000,  100, "g_tmayhem_point_limit",         "g_tmayhem_teams_override",         _("How much score is needed before the match will end"));
        }
-       METHOD(tmayhem, describe, string(tmayhem this))
-       {
-               TC(tmayhem, this);
-               return _("Compete with your team for the most damage dealt and frags in this chaotic mayhem!");
-       }
        ATTRIB(tmayhem, m_legacydefaults, string, "1500 20 2 0");
 ENDCLASS(tmayhem)
 REGISTER_GAMETYPE(TEAM_MAYHEM, NEW(tmayhem));
index 938554326df0fd6c86306efed30fb5aa5cbdec06..db4296196b85facd4b6a2b33cb8ed3b498798f61 100644 (file)
@@ -650,7 +650,7 @@ Gametype MapInfo_Type_FromString(string gtype, bool dowarn, bool is_q3compat)
 
 string MapInfo_Type_Description(Gametype t)
 {
-       return t ? t.describe(t) : "";
+       return t ? t.m_description : "";
 }
 
 string MapInfo_Type_ToString(Gametype t)
index 94172da1d2a9e723acde80a8fd33bc0e8051a7fa..1cedeaf1d264e967c432ab83967281de65ea5fbd 100644 (file)
@@ -40,6 +40,9 @@ CLASS(Gametype, Object)
     ATTRIB(Gametype, mdl, string);
     /** human readable name */
     ATTRIB(Gametype, message, string);
+    ATTRIB(Gametype, m_name, string);
+    /** color */
+    ATTRIB(Gametype, m_color, vector, '1 1 1');
     /** does this gametype support teamplay? */
     ATTRIB(Gametype, team, bool, false);
     /** does this gametype use a point limit? */
@@ -52,6 +55,8 @@ CLASS(Gametype, Object)
     ATTRIB(Gametype, m_1v1, bool, false);
     /** game type defaults */
     ATTRIB(Gametype, model2, string);
+    /** game type description */
+    ATTRIB(Gametype, m_description, string);
     /** game type priority in random selections */
     ATTRIB(Gametype, m_priority, int, 0);
 #ifdef CSQC
@@ -90,14 +95,16 @@ CLASS(Gametype, Object)
         returns(menu, _("Frag limit:"),      5,  100,  5, "fraglimit_override",        string_null,                    _("The amount of frags needed before the match will end"));
     }
 
-    /* game type description
-     * previously stored in a .string gametype_description ATTRIB
+#ifdef MENUQC
+    /* game type guide description
+     * this description is used in the guide, the description stored in .m_description is shorter and used for things like the mapvoting dialog
         */
     METHOD(Gametype, describe, string(Gametype this))
     {
         TC(Gametype, this);
                return SUPER(Object).describe(this);
     }
+#endif
 
     METHOD(Gametype, display, void(Gametype this, void(string name, string icon) returns))
     {
@@ -105,14 +112,16 @@ CLASS(Gametype, Object)
         returns(this.message, strcat("gametype_", this.mdl));
     }
 
-    METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, int gflags, string mutators, string defaults))
+    METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, int gflags, string mutators, string defaults, string gdescription))
     {
         this.netname = g_name;
         this.mdl = sname;
         this.message = hname;
+        this.m_name = hname;
         this.team = (gflags & GAMETYPE_FLAG_TEAMPLAY);
         this.m_mutators = cons(sname, mutators);
         this.model2 = defaults;
+        this.m_description = gdescription;
         this.frags = (gflags & GAMETYPE_FLAG_USEPOINTS);
         this.m_priority = ((gflags & GAMETYPE_FLAG_PREFERRED) ? 2 : ((gflags & GAMETYPE_FLAG_PRIORITY) ? 1 : 0));
         this.m_hidelimits = (gflags & GAMETYPE_FLAG_HIDELIMITS);