阿吉熊 发表于 2024-3-23 16:44:29

关于AI的投降机制

这决定版AI的投降相关的语句在哪个文件里面?找了一大圈,这种应该是有备注的吧?见有人做过,但是就是找不到,能否请大神指点一下

こはね 发表于 2024-3-23 17:56:56

搜索aiAttemptResign試試看?
[(void)] aiAttemptResign(): asks the player if its ok to resign

阿吉熊 发表于 2024-3-28 11:35:31

こはね 发表于 2024-3-23 17:56
搜索aiAttemptResign試試看?
[(void)] aiAttemptResign(): asks the player if its ok to resign...
大概在这里
然后我还有点不会这AI的命令

阿吉熊 发表于 2024-3-28 11:38:30

阿吉熊 发表于 2024-3-28 11:35
大概在这里
然后我还有点不会这AI的命令

这cvoktoresign是什么鬼东西,也没有定义,也没有赋值

こはね 发表于 2024-3-28 13:00:36

相关代码在AI\core\AIcode.xs;大概你也能看得懂

//==============================================================================
// ShouldIResign
//==============================================================================
rule ShouldIResign
minInterval 7
inactive
{
   // Don't resign during treaty since that looks dumb.
   // Don't resign too soon.
   // Don't resign if we have over 30 active pop slots.
   if ((aiTreatyActive() == true) || (kbGetPop() >= 30) || (xsGetTime() < 10 * 60 * 1000))
   {
      return;
   }


   bool humanAlly = false; // Set true if we have a surviving human ally.
   // Look for human allies.
   for (i = 1; <= cNumberPlayers)
   {
      if ((kbIsPlayerAlly(i) == true) && (kbHasPlayerLost(i) == false) && (kbIsPlayerHuman(i) == true))
      {
         humanAlly = true;    // Don't return just yet, let's see if we should chat.
      }
   }


   // Resign if the known enemy pop is > 10x mine.
   int enemyPopTotal = 0;
   int enemyCount = 0;
   int myPopTotal = 0;


   for (i = 1; < cNumberPlayers)
   {
      if (kbHasPlayerLost(i) == false)
      {
         if (i == cMyID)
         {
            myPopTotal += kbUnitCount(i, cUnitTypeUnit, cUnitStateAlive);
         }
         if (kbIsPlayerEnemy(i) == true)
         {
            enemyPopTotal += kbUnitCount(i, cUnitTypeUnit, cUnitStateAlive);
            enemyCount++;
         }
      }
   }


   if (enemyCount < 1)
   {
      enemyCount = 1; // Avoid div by 0.
   }


   float enemyRatio = (enemyPopTotal / enemyCount) / myPopTotal;


   // My pop is 1/3 the average known pop of enemies so I'm going to whine to my human ally.
   if ((enemyRatio > 3) && (humanAlly == true))
   {
      sendStatement(cPlayerRelationAllyExcludingSelf, cAICommPromptToAllyImReadyToQuit);
         xsEnableRule("resignRetry");
         xsDisableSelf();
      return; // Never resign if we still have a human ally.
      }
   
   // My pop is 1/4 the average known pop of enemies.
   // I have no TC.
   // I have no human ally that I want to stay in the game for so try to resign.
   if ((enemyRatio > 4) && (kbUnitCount(cMyID, cUnitTypeAgeUpBuilding, cUnitStateAlive) < 1) && (humanAlly == false))
   {
      debugCore("Attempting to resign since I'm heavily outnumbered and have no Town Center left");
         aiAttemptResign(cAICommPromptToEnemyMayIResign);
         xsDisableSelf();
   }
}

页: [1]
查看完整版本: 关于AI的投降机制