]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/util.qc
Disambiguate a parameter name in a few functions
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / util.qc
index cea6c03ff9dedf5658926b982f739ca02d7565ad..3fb2d7e1af3e712a27788d00004b11b5057ae9bb 100644 (file)
@@ -211,6 +211,22 @@ string draw_UseSkinFor(string pic)
                return strcat(draw_currentSkin, "/", pic);
 }
 
+void mut_set_active(int mut)
+{
+       if (mut >= 24)
+               active_mutators[1] |= BIT(mut - 24);
+       else
+               active_mutators[0] |= BIT(mut);
+}
+
+bool mut_is_active(int mut)
+{
+       if (mut >= 24)
+               return (active_mutators[1] & (BIT(mut - 24)));
+       else
+               return (active_mutators[0] & BIT(mut));
+}
+
 // if s == "" (MENUQC) builds the mutator list for the Mutators dialog based on local cvar values
 // otherwise (CSQC) translates the mutator list (s) that client has received from server
 // NOTE: this function merges MENUQC and CSQC code in order to avoid duplicating and separating strings
@@ -226,29 +242,35 @@ string build_mutator_list(string s)
        for (string arg = ""; i < n; i++)
        {
                if (i >= 0) arg = argv(i);
-               if(arg == "Dodging"                                     || (!n && cvar("g_dodging")))                                   s2 = cons_mid(s2, ", ", _("Dodging"));
-               if(arg == "InstaGib"                            || (!n && cvar("g_instagib")))                                  s2 = cons_mid(s2, ", ", _("InstaGib"));
-               if(arg == "New Toys"                            || (!n && cvar("g_new_toys")))                                  s2 = cons_mid(s2, ", ", _("New Toys"));
-               if(arg == "NIX"                                         || (!n && cvar("g_nix")))                                               s2 = cons_mid(s2, ", ", _("NIX"));
-               if(arg == "Rocket Flying"                       || (!n && cvar("g_rocket_flying")))                             s2 = cons_mid(s2, ", ", _("Rocket Flying"));
-               if(arg == "Invincible Projectiles"      || (!n && cvar("g_invincible_projectiles")))    s2 = cons_mid(s2, ", ", _("Invincible Projectiles"));
-               if(arg == "Low gravity"                         || (!n && cvar("sv_gravity") < stof(cvar_defstring("sv_gravity"))))     s2 = cons_mid(s2, ", ", _("Low gravity"));
-               if(arg == "Cloaked"                                     || (!n && cvar("g_cloaked")))                                   s2 = cons_mid(s2, ", ", _("Cloaked"));
-               if(arg == "Hook"                                        || (!n && cvar("g_grappling_hook")))                    s2 = cons_mid(s2, ", ", _("Hook"));
-               if(arg == "Midair"                                      || (!n && cvar("g_midair")))                                    s2 = cons_mid(s2, ", ", _("Midair"));
-               if(arg == "Melee only"                          || (!n && cvar("g_melee_only")))                                s2 = cons_mid(s2, ", ", _("Melee only"));
-               if(arg == "Vampire"                                     || (!n && cvar("g_vampire")))                                   s2 = cons_mid(s2, ", ", _("Vampire"));
-               if(arg == "Piñata"                                     || (!n && cvar("g_pinata")))                                    s2 = cons_mid(s2, ", ", _("Piñata"));
-               if(arg == "Weapons stay"                        || (!n && cvar("g_weapon_stay")))                               s2 = cons_mid(s2, ", ", _("Weapons stay"));
-               if(arg == "Blood loss"                          || (!n && cvar("g_bloodloss") > 0))                             s2 = cons_mid(s2, ", ", _("Blood loss"));
-               if(arg == "Jetpack"                                     || (!n && cvar("g_jetpack")))                                   s2 = cons_mid(s2, ", ", _("Jetpack"));
-               if(arg == "Buffs"                                       || (!n && cvar("g_buffs") > 0))                                 s2 = cons_mid(s2, ", ", _("Buffs"));
-               if(arg == "Overkill"                            || (!n && cvar("g_overkill")))                                  s2 = cons_mid(s2, ", ", _("Overkill"));
-               if(arg == "No powerups"                         || (!n && cvar("g_powerups") == 0))                             s2 = cons_mid(s2, ", ", _("No powerups"));
-               if(arg == "Powerups"                            || (!n && cvar("g_powerups") > 0))                              s2 = cons_mid(s2, ", ", _("Powerups"));
-               if(arg == "Touch explode"                       || (!n && cvar("g_touchexplode") > 0))                  s2 = cons_mid(s2, ", ", _("Touch explode"));
-               if(arg == "Wall jumping"                        || (!n && cvar("g_walljump")))                                  s2 = cons_mid(s2, ", ", _("Wall jumping"));
-               if(arg == "No start weapons"            || (!n && cvar_string("g_weaponarena") == "0" && cvar("g_balance_blaster_weaponstartoverride") == 0))   s2 = cons_mid(s2, ", ", _("No start weapons"));
+               // cond is the condition for showing the mutator enabled in the menu
+               #define X(name, translated_name, mut, cond) \
+                       if(arg == name || (!n && (cond))) { s2 = cons_mid(s2, ", ", translated_name); mut_set_active(mut); }
+               X("Dodging"                   , _("Dodging")                   , MUT_DODGING                   , cvar("g_dodging"))
+               X("InstaGib"                  , _("InstaGib")                  , MUT_INSTAGIB                  , cvar("g_instagib"))
+               X("New Toys"                  , _("New Toys")                  , MUT_NEW_TOYS                  , cvar("g_new_toys"))
+               X("NIX"                       , _("NIX")                       , MUT_NIX                       , cvar("g_nix"))
+               X("Rocket Flying"             , _("Rocket Flying")             , MUT_ROCKET_FLYING             , cvar("g_rocket_flying"))
+               X("Invincible Projectiles"    , _("Invincible Projectiles")    , MUT_INVINCIBLE_PROJECTILES    , cvar("g_invincible_projectiles"))
+               X("Low gravity"               , _("Low gravity")               , MUT_GRAVITY                   , cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
+               X("Cloaked"                   , _("Cloaked")                   , MUT_CLOAKED                   , cvar("g_cloaked"))
+               X("Hook"                      , _("Hook")                      , MUT_GRAPPLING_HOOK            , cvar("g_grappling_hook"))
+               X("Midair"                    , _("Midair")                    , MUT_MIDAIR                    , cvar("g_midair"))
+               X("Melee only Arena"          , _("Melee only Arena")          , MUT_MELEE_ONLY                , cvar("g_melee_only"))
+               X("Vampire"                   , _("Vampire")                   , MUT_VAMPIRE                   , cvar("g_vampire"))
+               X("Piñata"                    , _("Piñata")                    , MUT_PINATA                    , cvar("g_pinata"))
+               X("Weapons stay"              , _("Weapons stay")              , MUT_WEAPON_STAY               , cvar("g_weapon_stay"))
+               X("Blood loss"                , _("Blood loss")                , MUT_BLOODLOSS                 , cvar("g_bloodloss") > 0)
+               X("Jetpack"                   , _("Jetpack")                   , MUT_JETPACK                   , cvar("g_jetpack"))
+               X("Buffs"                     , _("Buffs")                     , MUT_BUFFS                     , cvar("g_buffs") > 0)
+               X("Overkill"                  , _("Overkill")                  , MUT_OVERKILL                  , cvar("g_overkill"))
+               X("No powerups"               , _("No powerups")               , MUT_NO_POWERUPS               , cvar("g_powerups") == 0)
+               X("Powerups"                  , _("Powerups")                  , MUT_POWERUPS                  , cvar("g_powerups") > 0)
+               X("Touch explode"             , _("Touch explode")             , MUT_TOUCHEXPLODE              , cvar("g_touchexplode") > 0)
+               X("Wall jumping"              , _("Wall jumping")              , MUT_WALLJUMP                  , cvar("g_walljump"))
+               X("No start weapons"          , _("No start weapons")          , MUT_NO_START_WEAPONS          , cvar_string("g_weaponarena") == "0" && cvar("g_balance_blaster_weaponstartoverride") == 0)
+               X("Nades"                     , _("Nades")                     , MUT_NADES                     , cvar("g_nades"))
+               X("Offhand blaster"           , _("Offhand blaster")           , MUT_OFFHAND_BLASTER           , cvar("g_offhand_blaster"))
+               #undef X
        }
        return s2;
 }
@@ -362,7 +384,7 @@ string ScoreString(int pFlags, float pValue)
        else if(pFlags & SFL_RANK)
                valstr = (pValue < 256 ? count_ordinal(pValue) : _("N/A"));
        else if(pFlags & SFL_TIME)
-               valstr = TIME_ENCODED_TOSTRING(pValue);
+               valstr = TIME_ENCODED_TOSTRING(pValue, true);
        else
                valstr = ftos(pValue);
 
@@ -848,14 +870,14 @@ float textLengthUpToWidth(string theText, float maxWidth, vector theSize, textLe
        return left;
 }
 
-float textLengthUpToLength(string theText, float maxWidth, textLengthUpToLength_lenFunction_t w)
+float textLengthUpToLength(string theText, int maxLength, textLengthUpToLength_lenFunction_t w)
 {
        // STOP.
        // The following function is SLOW.
        // For your safety and for the protection of those around you...
        // DO NOT CALL THIS AT HOME.
        // No really, don't.
-       if(w(theText) <= maxWidth)
+       if(w(theText) <= maxLength)
                return strlen(theText); // yeah!
 
        bool colors = (w("^7") == 0);
@@ -874,7 +896,7 @@ float textLengthUpToLength(string theText, float maxWidth, textLengthUpToLength_
                        ofs = (!res.x) ? 0 : res.x - res.y;
                }
 
-               if(w(substring(theText, 0, middle + ofs)) <= maxWidth)
+               if(w(substring(theText, 0, middle + ofs)) <= maxLength)
                        left = middle + ofs;
                else
                        right = middle;
@@ -919,17 +941,17 @@ string find_last_color_code(string s)
        return "";
 }
 
-string getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw)
+string getWrappedLine(float maxWidth, vector theFontSize, textLengthUpToWidth_widthFunction_t tw)
 {
        string s = getWrappedLine_remaining;
 
-       if(w <= 0)
+       if(maxWidth <= 0)
        {
                getWrappedLine_remaining = string_null;
                return s; // the line has no size ANYWAY, nothing would be displayed.
        }
 
-       int take_until = textLengthUpToWidth(s, w, theFontSize, tw);
+       int take_until = textLengthUpToWidth(s, maxWidth, theFontSize, tw);
        if(take_until > 0 && take_until < strlen(s))
        {
                int last_word = take_until - 1;
@@ -957,17 +979,17 @@ string getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunc
        }
 }
 
-string getWrappedLineLen(float w, textLengthUpToLength_lenFunction_t tw)
+string getWrappedLineLen(int maxLength, textLengthUpToLength_lenFunction_t tw)
 {
        string s = getWrappedLine_remaining;
 
-       if(w <= 0)
+       if(maxLength <= 0)
        {
                getWrappedLine_remaining = string_null;
                return s; // the line has no size ANYWAY, nothing would be displayed.
        }
 
-       int take_until = textLengthUpToLength(s, w, tw);
+       int take_until = textLengthUpToLength(s, maxLength, tw);
        if(take_until > 0 && take_until < strlen(s))
        {
                int last_word = take_until - 1;
@@ -1938,14 +1960,13 @@ void unfollow_sameorigin(entity e)
 .float aiment_deadflag;
 void SetMovetypeFollow(entity ent, entity e)
 {
-       // FIXME this may not be warpzone aware
        set_movetype(ent, MOVETYPE_FOLLOW); // make the hole follow
        ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
        ent.aiment = e; // make the hole follow bmodel
        ent.punchangle = e.angles; // the original angles of bmodel
        ent.view_ofs = ent.origin - e.origin; // relative origin
        ent.v_angle = ent.angles - e.angles; // relative angles
-       ent.aiment_classname = strzone(e.classname);
+       ent.aiment_classname = e.classname;
        ent.aiment_deadflag = e.deadflag;
 
        if(IS_PLAYER(ent.aiment))
@@ -1961,8 +1982,7 @@ void UnsetMovetypeFollow(entity ent)
 {
        set_movetype(ent, MOVETYPE_FLY);
        PROJECTILE_MAKETRIGGER(ent);
-       if (ent.aiment_classname)
-               strunzone(ent.classname);
+       ent.aiment_classname = string_null;
        // FIXME: engine bug?
        // resetting aiment the engine will set orb's origin close to world's origin
        //ent.aiment = NULL;