]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
A few minor optimizations:
authorterencehill <piuntn@gmail.com>
Tue, 23 Jul 2024 23:32:57 +0000 (01:32 +0200)
committerterencehill <piuntn@gmail.com>
Tue, 23 Jul 2024 23:32:57 +0000 (01:32 +0200)
* Optimize swapwords and consequently shufflewords (which is called by g_maplist_shuffle) a little bit
* Avoid setting filename when not needed in Map_Check (called many times when the map vote starts)
* Save a few normalize calls in findtrajectorywithleading (called when bots use weapons like mortar and electro that fire projectiles with gravity)

findtrajectorywithleading patch probably causes a hash change due to extremely small aim direction changes (always < 0.0005) that at some point change the course of the bot match

.gitlab-ci.yml
qcsrc/lib/string.qh
qcsrc/server/bot/default/aim.qc
qcsrc/server/intermission.qc

index 590ab8175fc863df7ad0a4372948200658472958..81bb63ba4e28e5bf3c5c9c9faa8e72c9f76c70fe 100644 (file)
@@ -36,7 +36,7 @@ test_compilation_units:
 test_sv_game:
   stage: test
   script:
-    - export EXPECT=0406faebe1f4903266061f43557d0b1b
+    - export EXPECT=14b3e3e34253d4b41325080e77317d58
     - qcsrc/tools/sv_game-hashtest.sh
     - exit $?
 
index 743f4310bac53d214f7f808372fcd369a4971d8b..f3fbc6bc229138108113bb4a9a6cb6198a3aea57 100644 (file)
@@ -297,10 +297,9 @@ string substring_range(string s, float b, float e)
 ERASEABLE
 string swapwords(string str, float i, float j)
 {
-       float n;
        string s1, s2, s3, s4, s5;
        float si, ei, sj, ej, s0, en;
-       n = tokenizebyseparator(str, " ");  // must match g_maplist processing in ShuffleMaplist and "shuffle"
+       int n = tokenizebyseparator(str, " ");  // must match g_maplist processing in ShuffleMaplist and "shuffle"
        si = argv_start_index(i);
        sj = argv_start_index(j);
        ei = argv_end_index(i);
@@ -308,9 +307,9 @@ string swapwords(string str, float i, float j)
        s0 = argv_start_index(0);
        en = argv_end_index(n - 1);
        s1 = substring_range(str, s0, si);
-       s2 = substring_range(str, si, ei);
+       s2 = argv(i);
        s3 = substring_range(str, ei, sj);
-       s4 = substring_range(str, sj, ej);
+       s4 = argv(j);
        s5 = substring_range(str, ej, en);
        return strcat(s1, s4, s3, s2, s5);
 }
index c058c06f55c5a5df7f8b167d8766fa9adc27092c..40a61fb4082395972e146ebf77540c3ae02fdec6 100644 (file)
@@ -33,7 +33,8 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
        tracebox(o, targ.mins, targ.maxs, v, false, targ);
        v = trace_endpos;
        end = v + (targ.mins + targ.maxs) * 0.5;
-       if ((vlen(end - org) / shotspeed + 0.2) > maxtime)
+       float shotdistance = max(0.001, vlen(end - org));
+       if ((shotdistance / shotspeed + 0.2) > maxtime)
        {
                // out of range
                targ.solid = savesolid;
@@ -51,11 +52,13 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
        setorigin(tracetossfaketarget, v);
 
        c = 0;
-       dir = normalize(end - org);
+       dir = (end - org) / shotdistance; // same as dir = normalize(end - org); but cheaper
+       vector test_dir = dir;
+       vector test_dir_normalized = dir;
        while (c < 10) // 10 traces
        {
                setorigin(tracetossent, org); // reset
-               tracetossent.velocity = findtrajectory_velocity = normalize(dir) * shotspeed + shotspeedupward * '0 0 1';
+               tracetossent.velocity = findtrajectory_velocity = test_dir_normalized * shotspeed + shotspeedupward * '0 0 1';
                tracetoss(tracetossent, ignore); // love builtin functions...
                if (trace_ent == tracetossfaketarget) // done
                {
@@ -71,7 +74,8 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
 
                        return true;
                }
-               dir.z = dir.z + 0.1; // aim up a little more
+               test_dir.z += 0.1; // aim up a little more
+               test_dir_normalized = normalize(test_dir);
                c = c + 1;
        }
        targ.solid = savesolid;
@@ -85,7 +89,7 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
        setorigin(tracetossfaketarget, v);
 
        // leave a valid one even if it won't reach
-       findtrajectory_velocity = normalize(end - org) * shotspeed + shotspeedupward * '0 0 1';
+       findtrajectory_velocity = dir * shotspeed + shotspeedupward * '0 0 1';
        return false;
 }
 
index 713a72052aaeb7de6ea8cbfdac107e518343c652..9749a95d2470b75912928a600162974a55b7afa0 100644 (file)
@@ -116,15 +116,12 @@ bool Map_IsRecent(string m)
 
 bool Map_Check(int position, float pass)
 {
-       string filename;
-       string map_next;
-       map_next = argv(position);
+       string map_next = argv(position);
        if(pass <= 1)
        {
                if(Map_IsRecent(map_next))
                        return false;
        }
-       filename = Map_Filename(position);
        if(MapInfo_CheckMap(map_next))
        {
                if(pass == 2)
@@ -137,7 +134,10 @@ bool Map_Check(int position, float pass)
                return false;
        }
        else
+       {
+               string filename = Map_Filename(position);
                LOG_DEBUG( "Couldn't select '", filename, "'..." );
+       }
 
        return false;
 }