]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/bot.qc
Merge branch 'master' into terencehill/bot_waypoints
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / bot.qc
index fb6f1e046d9da192218b8d78da18474b87de4b67..1905b7c2728e4a389669b373873c1cb9a482438f 100644 (file)
@@ -46,6 +46,7 @@ entity bot_spawn()
        entity bot = spawnclient();
        if (bot)
        {
+               setItemGroupCount();
                currentbots = currentbots + 1;
                bot_setnameandstuff(bot);
                ClientConnect(bot);
@@ -63,9 +64,8 @@ void bot_think(entity this)
        if(autocvar_bot_god)
                this.flags |= FL_GODMODE;
 
-       this.bot_nextthink = this.bot_nextthink + autocvar_bot_ai_thinkinterval * pow(0.5, this.bot_aiskill);
-       if(this.bot_nextthink < time)
-               this.bot_nextthink = time + autocvar_bot_ai_thinkinterval * pow(0.5, this.bot_aiskill);
+       this.bot_nextthink = max(time, this.bot_nextthink) + max(0.01, autocvar_bot_ai_thinkinterval * (0.5 ** this.bot_aiskill) * min(14 / (skill + 14), 1));
+
        //if (this.bot_painintensity > 0)
        //      this.bot_painintensity = this.bot_painintensity - (skill + 1) * 40 * frametime;
 
@@ -208,7 +208,13 @@ void bot_setnameandstuff(entity this)
 
        prio = 6;
 
-       #define READSKILL(f,w,r) if(argv(prio) != "") this.f = stof(argv(prio)) * (w); else this.f = (!autocvar_g_campaign) * (2 * random() - 1) * (r) * (w); ++prio
+       #define READSKILL(f, w, r) MACRO_BEGIN { \
+               if(argv(prio) != "") \
+                       this.f = stof(argv(prio)) * w; \
+               else \
+                       this.f = (!autocvar_g_campaign) * (2 * random() - 1) * r * w; \
+               prio++; \
+       } MACRO_END
        //print(bot_name, ": ping=", argv(9), "\n");
 
        READSKILL(havocbot_keyboardskill, 0.5, 0.5); // keyboard skill
@@ -368,14 +374,13 @@ void bot_relinkplayerlist()
                        if(prevbot)
                                prevbot.nextbot = it;
                        else
-                       {
                                bot_list = it;
-                               bot_list.nextbot = NULL;
-                       }
                        prevbot = it;
                        ++currentbots;
                }
        });
+       if(prevbot)
+               prevbot.nextbot = NULL;
        LOG_TRACE("relink: ", ftos(currentbots), " bots seen.");
        bot_strategytoken = bot_list;
        bot_strategytoken_taken = true;
@@ -528,18 +533,18 @@ void autoskill(float factor)
                        bestbot = max(bestbot, it.totalfrags - it.totalfrags_lastcheck);
        ));
 
-       LOG_TRACE("autoskill: best player got ", ftos(bestplayer), ", ");
-       LOG_TRACE("best bot got ", ftos(bestbot), "; ");
+       LOG_DEBUG("autoskill: best player got ", ftos(bestplayer), ", ");
+       LOG_DEBUG("best bot got ", ftos(bestbot), "; ");
        if(bestbot < 0 || bestplayer < 0)
        {
-               LOG_TRACE("not doing anything");
+               LOG_DEBUG("not doing anything");
                // don't return, let it reset all counters below
        }
        else if(bestbot <= bestplayer * factor - 2)
        {
                if(autocvar_skill < 17)
                {
-                       LOG_TRACE("2 frags difference, increasing skill");
+                       LOG_DEBUG("2 frags difference, increasing skill");
                        cvar_set("skill", ftos(autocvar_skill + 1));
                        bprint("^2SKILL UP!^7 Now at level ", ftos(autocvar_skill), "\n");
                }
@@ -548,14 +553,14 @@ void autoskill(float factor)
        {
                if(autocvar_skill > 0)
                {
-                       LOG_TRACE("2 frags difference, decreasing skill");
+                       LOG_DEBUG("2 frags difference, decreasing skill");
                        cvar_set("skill", ftos(autocvar_skill - 1));
                        bprint("^1SKILL DOWN!^7 Now at level ", ftos(autocvar_skill), "\n");
                }
        }
        else
        {
-               LOG_TRACE("not doing anything");
+               LOG_DEBUG("not doing anything");
                return;
                // don't reset counters, wait for them to accumulate
        }
@@ -566,9 +571,8 @@ void autoskill(float factor)
 void bot_calculate_stepheightvec()
 {
        stepheightvec = autocvar_sv_stepheight * '0 0 1';
-       jumpstepheightvec = stepheightvec +
-               ((autocvar_sv_jumpvelocity * autocvar_sv_jumpvelocity) / (2 * autocvar_sv_gravity)) * '0 0 0.85';
-               // 0.75 factor is for safety to make the jumps easy
+       jumpheight_vec = (autocvar_sv_jumpvelocity ** 2) / (2 * autocvar_sv_gravity) * '0 0 1';
+       jumpstepheightvec = stepheightvec + jumpheight_vec * 0.85; // reduce it a bit to make the jumps easy
 }
 
 float bot_fixcount()
@@ -668,7 +672,7 @@ void bot_clear(entity this)
 
 void bot_serverframe()
 {
-       if (gameover)
+       if (game_stopped)
                return;
 
        if (time < 2)
@@ -723,7 +727,7 @@ void bot_serverframe()
                botframe_spawnedwaypoints = true;
                waypoint_loadall();
                if(!waypoint_load_links())
-                       waypoint_schedulerelinkall();
+                       waypoint_schedulerelinkall(); // link all the autogenerated waypoints (teleporters)
        }
 
        if (bot_list)