IA per conquistare un forte

Funziona solo su unità militari

« Older   Newer »
 
  Share  
.
  1.     +3   +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Allora ragazzi ecco una prima IA per conquistare un forte,sicuramente c'è da migliorare perchè è solo una prima prova per me.

    Ecco il codice,comunque sono necessari ovviamente 2 parametri:

    -Il nome del gruppo attaccante
    -Il nome del forte da conquistare

    Che li dovete mettere nelle prime righe del codice,basta solo scrivere il nome del forte e del gruppo:

    Versione 1.0
    CODICE
    int i;
    ObjList guerrieri,catapulte;
    int RAGGIO_CATAPULTE = 1000;
    str gruppo,forte;

    SpawnGroupInHolder("Nome gruppo difensori",forte); da mettere se si vuole mettere un gruppo di difensori all'interno del forte

    gruppo = "Nome gruppo"; // Scrivere il nome gruppo attaccante
    forte = "Nome forte da conquistare"; // Scrivere il nome del forte da conquistare

    while(true)
    {

    guerrieri = Group(gruppo).GetObjList();


    for(i=0;i<guerrieri.count;i+=1)
     {
      Unit u;

      u = guerrieri[i];

      // Se è troppo lontano
      if(u.posRH.Dist(GetNamedObj(forte).obj.AsBuilding.pos) > GetNamedObj(forte).obj.AsBuilding.sight)
       {
        bool bNemici;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();

        if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && bNemici && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("attack",GetNamedObj(forte).obj.pos);
        else if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("capture",GetNamedObj(forte).obj.AsBuilding);
        else if(u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("move",GetNamedObj(forte).obj.pos);
       }
      else // Se è vicino al forte
       {
        bool bNemici,bNemiciInternoAlForte;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();
        bNemiciInternoAlForte = GetNamedObj(forte).obj.AsBuilding.settlement.Units().count > 0;

        if(bNemici) // Se ci sono dei nemici vicini al forte
         {
          if(u.AsUnit.command != "engage" && u.AsUnit.command != "attack" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
           u.SetCommand("attack",GetNamedObj(forte).obj.pos);

          if(u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid() && !bNemiciInternoAlForte)
           u.SetCommand("attack",GetNamedObj(forte).obj.pos);
         }
        else if(bNemiciInternoAlForte) // Se ci sono dei nemici interno al forte
         {
           int j;
           ObjList cat;
           bool bCatapulteDisponibili,bControllo=false;
           Catapult catapulta;

           bCatapulteDisponibili = !Intersect(ObjsInCircle(u.AsUnit.pos,RAGGIO_CATAPULTE,"Catapult"),FriendlyObjs(u.player,"Catapult")).IsEmpty();

           //pr(bCatapulteDisponibili);
           // Controlla se ci sono catapulte disponibili ovvero se i guerrieri al suo interno sono meno di 10
           if(bCatapulteDisponibili)
             {
              cat = Intersect(ObjsInCircle(u.pos,RAGGIO_CATAPULTE,"Catapult"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
           
              for(j=0;j<cat.count;j+=1)
               if(cat[j].AsCatapult.settlement.Units.count < 10)
                 {
                  bControllo=true;
                  catapulta = cat[j].AsCatapult;
                 }
               bCatapulteDisponibili = bControllo;
              }
               //pr(bCatapulteDisponibili);
               if(bCatapulteDisponibili && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                 u.SetCommand("build_catapult",catapulta);
               else if(!bCatapulteDisponibili) // C'è già una catapulta costruisci una nuova
                {
                 // Costruisci la catapulta trovando per prima cosa il punto
                 int tentativi=0; // Per evitare un loop troppo lungo
                 point p;
               
                 p = Point(-1000,-1000);
               
                 while(!IsPassable(p) && tentativi < 100)
                  if(u.IsValid() && u.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                    {
                     int k;
                     ObjList catapulteVicine;
                     p = GetNamedObj(forte).obj.pos + Point(rand(800)-rand(800),rand(800)-rand(800));
                     // Controlla che il punto p non sia troppo vicino alle altre catapulte

                     catapulteVicine = ClassPlayerObjs("Catapult",u.player).GetObjList();

                    // pr(catapulteVicine.count);

                 
                     for(k=0;k<catapulteVicine.count;k+=1)
                      if(catapulteVicine[k].AsCatapult.DistTo(p) < 50 || (p.Dist(GetNamedObj(forte).obj.AsBuilding.pos) < GetNamedObj(forte).obj.AsBuilding.radius+300))
                       p = Point(-1000,-1000);

                     tentativi+=1;
                    }
                   else // Se l'unità non può lascia perdere
                     break;

                 if(IsPassable(p) && u.IsValid() && u.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                  u.SetCommand("build_catapult",PlaceCatapult(p.x,p.y,u.player,u.race));

               }      
         }
        else // Se non c'è nessuno al forte e vicino al forte allora cattura
         {
           if(u.command != "capture")
             {
              //pr(u.GetHolderSett().GetCentralBuilding().AsCatapult.IsValid());
              u.SetCommand("capture",GetNamedObj(forte).obj);
             }
         }
       }
     }
    Sleep(1000);



    }


    Versione 1.1
    CODICE
    int i;
    ObjList guerrieri,catapulte;
    int RAGGIO_CATAPULTE = 1000;
    str gruppo,forte;

    SpawnGroupInHolder("X",forte);
    gruppo = "A"; // Gruppo attaccante
    forte = "Forte"; // Forte bersaglio

    while(true)
    {

    guerrieri = Group(gruppo).GetObjList();

    //GetNamedObj(forte).obj.AsBuilding.settlement.SetLoyalty(100);

    for(i=0;i<guerrieri.count;i+=1)
     {
      Unit u;

      u = guerrieri[i];

      // Se è troppo lontano
      if(u.posRH.Dist(GetNamedObj(forte).obj.AsBuilding.pos) > GetNamedObj(forte).obj.AsBuilding.sight)
       {
        bool bNemici;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();

        if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && bNemici && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("attack",GetNamedObj(forte).obj.pos);
        else if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("capture",GetNamedObj(forte).obj.AsBuilding);
        else if(u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
         u.SetCommand("move",GetNamedObj(forte).obj.pos);
       }
      else // Se è vicino al forte
       {
        bool bNemici,bNemiciInternoAlForte;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();
        bNemiciInternoAlForte = GetNamedObj(forte).obj.AsBuilding.settlement.Units().count > 0;

        if(bNemici) // Se ci sono dei nemici vicini al forte
         {
          if(u.AsUnit.command != "engage" && u.AsUnit.command != "attack" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
           u.SetCommand("attack",GetNamedObj(forte).obj.pos);

          if(u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid() && !bNemiciInternoAlForte)
           u.SetCommand("attack",GetNamedObj(forte).obj.pos);
         }
        else if(bNemiciInternoAlForte) // Se ci sono dei nemici interno al forte
         {
           int j;
           ObjList cat;
           bool bCatapulteDisponibili,bControllo=false;
           Catapult catapulta;

           bCatapulteDisponibili = !Intersect(ObjsInCircle(u.AsUnit.pos,RAGGIO_CATAPULTE,"Catapult"),FriendlyObjs(u.player,"Catapult")).IsEmpty();

           //pr(bCatapulteDisponibili);
           // Controlla se ci sono catapulte disponibili ovvero se i guerrieri al suo interno sono meno di 10
           if(bCatapulteDisponibili)
             {
              int distanza_minima = 1000000;
              cat = Intersect(ObjsInCircle(u.pos,RAGGIO_CATAPULTE,"Catapult"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
           
              for(j=0;j<cat.count;j+=1)
               if(cat[j].AsCatapult.settlement.Units.count < 10)
                 {
                  bControllo=true;

                  if(u.DistTo(cat[j].pos) < distanza_minima)
                   {
                    catapulta = cat[j].AsCatapult;
                    distanza_minima = u.DistTo(cat[j].pos);
                   }
                 }
               bCatapulteDisponibili = bControllo;
              }
               //pr(bCatapulteDisponibili);
               if(bCatapulteDisponibili && u.AsUnit.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                 u.SetCommand("build_catapult",catapulta);
               else if(!bCatapulteDisponibili) // C'è già una catapulta costruisci una nuova
                {
                 // Costruisci la catapulta trovando per prima cosa il punto
                 int tentativi=0; // Per evitare un loop troppo lungo
                 point p;
               
                 p = Point(-1000,-1000);
               
                 while(!IsPassable(p) && tentativi < 100)
                  if(u.IsValid() && u.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                    {
                     int k;
                     ObjList catapulteVicine;
                     p = GetNamedObj(forte).obj.pos + Point(rand(700)-rand(700),rand(700)-rand(700));
                     // Controlla che il punto p non sia troppo vicino alle altre catapulte

                     catapulteVicine = ClassPlayerObjs("Catapult",u.player).GetObjList();

                    // pr(catapulteVicine.count);
                       
                     for(k=0;k<catapulteVicine.count;k+=1)
                      if(catapulteVicine[k].AsCatapult.DistTo(p) < 50)
                       p = Point(-1000,-1000);

                     if(p.Dist(GetNamedObj(forte).obj.AsBuilding.pos) < GetNamedObj(forte).obj.AsBuilding.radius+300 || u.DistTo(p) > 500)
                       p = Point(-1000,-1000);

                     tentativi+=1;
                    }
                   else // Se l'unità non può lascia perdere
                     break;

                 if(IsPassable(p) && u.IsValid() && u.command != "build_catapult" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                    u.SetCommand("build_catapult",PlaceCatapult(p.x,p.y,u.player,u.race));
               }      
         }
        else // Se non c'è nessuno al forte e vicino al forte allora cattura
         {
           if(u.command != "capture")
             {
              //pr(u.GetHolderSett().GetCentralBuilding().AsCatapult.IsValid());
              u.SetCommand("capture",GetNamedObj(forte).obj);
             }
         }
       }
     // Controlla se non ci sono catapulte ferme
      {
       int i;
       ObjList cat;

       cat = Intersect(ClassPlayerObjs("Catapult",u.player),ObjsInCircle(GetNamedObj(forte).obj.AsBuilding.pos,GetNamedObj(forte).obj.AsBuilding.radius+500,"Catapult")).GetObjList();

       for(i=0;i<cat.count;i+=1)
        {
         if(cat[i].AsCatapult.IsBuilt() && cat[i].AsCatapult.command != "attack_ground")
          cat[i].AsCatapult.SetCommand("attack_ground",GetNamedObj(forte).obj.AsBuilding().pos);

         if(cat.count >= 2)
          if(!Intersect(ObjsInSight(cat[i],"Military"),EnemyObjs(u.player,"Military")).IsEmpty())
           cat[i].AsCatapult.SetCommand("disband");// Smonta la catapulta
        }
      }
    }
    Sleep(1000);
    }


    Versione 1.2
    CODICE
    int i;
    int seno,coseno,angolo;
    ObjList guerrieri,catapulte;
    int RAGGIO_CATAPULTE = 1000;
    str gruppo,forte;

    gruppo = "A"; // Gruppo attaccante
    forte = "Forte"; // Forte bersaglio

    for(i=0;i<10;i+=1)
    SpawnGroupInHolder("X","Forte");

    while(true)
    {
    int contatore=0;
    guerrieri = Group(gruppo).GetObjList();

    //GetNamedObj(forte).obj.AsBuilding.settlement.SetLoyalty(100);

    for(i=0;i<guerrieri.count;i+=1)
     {
      Unit u;
      point punto_arrivo;

      u = guerrieri[i];

      seno = u.pos.y-GetNamedObj(forte).obj.AsBuilding.pos.y;
      coseno = u.pos.x-GetNamedObj(forte).obj.AsBuilding.pos.x;

      angolo = abs(GetAngleByDir(Point(coseno,seno))-360);

      punto_arrivo = Point(800+rand(200),800+rand(200));

      if(u.pos.x > punto_arrivo.x && u.pos.y > punto_arrivo.y)
        punto_arrivo = Point(punto_arrivo.x,punto_arrivo.y);
      else if(u.pos.x < punto_arrivo.x && u.pos.y > punto_arrivo.y)
        punto_arrivo = Point(-punto_arrivo.x,punto_arrivo.y);
      else if(u.pos.x > punto_arrivo.x && u.pos.y < punto_arrivo.y)
        punto_arrivo = Point(punto_arrivo.x,-punto_arrivo.y);
      else
        punto_arrivo = Point(-punto_arrivo.x,-punto_arrivo.y);

      punto_arrivo.Rot(angolo);
      punto_arrivo = punto_arrivo + GetNamedObj(forte).obj.AsBuilding.pos;

      // Se è troppo lontano
      if(u.posRH.Dist(GetNamedObj(forte).obj.AsBuilding.pos) > 1500)
       {
        bool bNemici;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();

        if(u.command == "idle")
         if(bNemici)
          u.SetCommand("attack",punto_arrivo);
         else if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && GetNamedObj(forte).obj.AsBuilding.settlement.Units.count == 0)
          u.SetCommand("capture",GetNamedObj(forte).obj.AsBuilding);
         else
           u.SetCommand("attack",punto_arrivo);

       }
      else // Se è vicino al forte
       {
        bool bNemici,bNemiciInternoAlForte;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();
        bNemiciInternoAlForte = GetNamedObj(forte).obj.AsBuilding.settlement.Units().count > 0;

        if(bNemici) // Se ci sono dei nemici vicini al forte
         {
          int n_catapulte;
          int k;
          ObjList cat;

          cat = Intersect(ObjsInSight(GetNamedObj(forte).obj.AsBuilding,"Military"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
          n_catapulte = cat.count;

          for(k=0;k<cat.count;k+=1)
           if(cat[k].AsCatapult.command == "disband" || cat[k].AsCatapult.command == "idle" || !cat[k].AsCatapult.IsBuilt() || cat[k].AsCatapult.settlement.Units.count < 5)
            n_catapulte-=1;

         
          if(u.AsUnit.command != "engage" && u.AsUnit.command != "attack" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
           u.SetCommand("attack",punto_arrivo);

          if(u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid() && !bNemiciInternoAlForte && n_catapulte > 2)
           u.SetCommand("attack",punto_arrivo);
         }
        else if(bNemiciInternoAlForte) // Se ci sono dei nemici interno al forte
         {
           int j;
           ObjList cat;
           bool bCatapulteDisponibili,bControllo=false;
           Catapult catapulta;

           bCatapulteDisponibili = !Intersect(ObjsInCircle(u.AsUnit.pos,RAGGIO_CATAPULTE,"Catapult"),FriendlyObjs(u.player,"Catapult")).IsEmpty();

           //pr(bCatapulteDisponibili);
           // Controlla se ci sono catapulte disponibili ovvero se i guerrieri al suo interno sono meno di 10
           if(bCatapulteDisponibili)
             {
              int distanza_minima = 1000000;
              cat = Intersect(ObjsInCircle(u.pos,RAGGIO_CATAPULTE,"Catapult"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
           
              for(j=0;j<cat.count;j+=1)
               if(cat[j].AsCatapult.settlement.Units.count < 10)
                 {
                  bControllo=true;

                  if(u.DistTo(cat[j].pos) < distanza_minima)
                   {
                    catapulta = cat[j].AsCatapult;
                    distanza_minima = u.DistTo(cat[j].pos);
                   }
                 }
               bCatapulteDisponibili = bControllo;
              }
               //pr(bCatapulteDisponibili);
               if(contatore < 5 && bCatapulteDisponibili && u.AsUnit.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                 {
                  contatore+=1;
                  u.SetCommand("build_catapult",catapulta);
                 }
               else if(u.command == "idle" && u.DistTo(GetNamedObj(forte).obj.pos) < 1000)
                 u.SetCommand("move",punto_arrivo);
               else if(!bCatapulteDisponibili) // C'è già una catapulta costruisci una nuova
                {
                 // Costruisci la catapulta trovando per prima cosa il punto
                 int tentativi=0; // Per evitare un loop troppo lungo
                 point p;
               
                 p = Point(-1000,-1000);
               
                 while(!IsPassable(p) && tentativi < 5)
                  if(u.IsValid() && u.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                    {
                     int k;
                     ObjList catapulteVicine;
                     p = GetNamedObj(forte).obj.pos + Point(rand(900)-rand(900),rand(900)-rand(900));
                     // Controlla che il punto p non sia troppo vicino alle altre catapulte

                     catapulteVicine = ClassPlayerObjs("Catapult",u.player).GetObjList();

                    // pr(catapulteVicine.count);
                       
                     for(k=0;k<catapulteVicine.count;k+=1)
                      if(catapulteVicine[k].AsCatapult.DistTo(p) < 50)
                       p = Point(-1000,-1000);

                     if(p.Dist(GetNamedObj(forte).obj.AsBuilding.pos) < GetNamedObj(forte).obj.AsBuilding.radius+500 || u.DistTo(p) > 600 || p.Dist(GetNamedObj(forte).obj.AsBuilding.pos) > 1200)
                       p = Point(-1000,-1000);

                     tentativi+=1;
                    }
                   else // Se l'unità non può lascia perdere
                     break;

                 if(contatore < 5 && IsPassable(p) && u.IsValid() && u.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                   {
                    contatore+=1;
                    u.SetCommand("build_catapult",PlaceCatapult(p.x,p.y,u.player,u.race));
                   }
               }      
         }
        else // Se non c'è nessuno al forte e vicino al forte allora cattura
         {
           if(u.command != "capture")
             {
              //pr(u.GetHolderSett().GetCentralBuilding().AsCatapult.IsValid());
              u.SetCommand("capture",GetNamedObj(forte).obj);
             }
         }
       }
      // IA Catapulte
         { // Analizza tutte le catapulte
           int i,n_catapulte_disband=0; // Catapulte non pronte oppure che si stanno smontando
           ObjList cat;

           cat = Intersect(ClassPlayerObjs("Catapult",u.player),ObjsInCircle(GetNamedObj(forte).obj.AsBuilding.pos,1500,"Catapult")).GetObjList();

          for(i=0;i<cat.count;i+=1)
           if(cat[i].AsCatapult.command == "disband" || cat[i].AsCatapult.command == "idle")
             n_catapulte_disband+=1;

          for(i=0;i<cat.count;i+=1)
           {
            if(cat[i].AsCatapult.IsBuilt() && cat[i].AsCatapult.command != "attack_ground")          
             cat[i].SetCommand("attack_ground",GetNamedObj(forte).obj.pos + Point(rand(GetNamedObj(forte).obj.AsBuilding.radius)-rand(GetNamedObj(forte).obj.AsBuilding.radius),rand(GetNamedObj(forte).obj.AsBuilding.radius)-rand(GetNamedObj(forte).obj.AsBuilding.radius)));

            if(cat.count-n_catapulte_disband >= 2)
             if(!Intersect(ObjsInSight(cat[i],"Military"),EnemyObjs(u.player,"Military")).IsEmpty() || !u.IsEnemy(GetNamedObj(forte).obj))
              {
               cat[i].AsCatapult.SetCommand("disband");// Smonta la catapulta
               n_catapulte_disband+=1;
              }
           }
         }
    }
    Sleep(1000);
    }


    Versione 1.3
    CODICE
    int i;
    int seno,coseno,angolo;
    ObjList guerrieri,catapulte;
    int RAGGIO_CATAPULTE = 1000,DISTANZA_MIN=900,DISTANZA_MAX=1100,RAGGIO=200;
    str gruppo,forte;


    gruppo = "A"; // Gruppo attaccante
    forte = "Forte"; // Forte bersaglio

    for(i=0;i<10;i+=1)
    SpawnGroupInHolder("X","Forte");

    while(true)
    {
    int contatore=0;
    guerrieri = Group(gruppo).GetObjList();

    //GetNamedObj(forte).obj.AsBuilding.settlement.SetLoyalty(100);

    for(i=0;i<guerrieri.count;i+=1)
     {
      Unit u;
      point punto_arrivo;

      u = guerrieri[i];

      seno = u.pos.y-GetNamedObj(forte).obj.AsBuilding.pos.y;
      coseno = u.pos.x-GetNamedObj(forte).obj.AsBuilding.pos.x;

      angolo = abs(GetAngleByDir(Point(coseno,seno))-360);

      punto_arrivo = Point(DISTANZA_MIN+rand(RAGGIO),DISTANZA_MIN+rand(RAGGIO));

      if(u.pos.x > punto_arrivo.x && u.pos.y > punto_arrivo.y)
        punto_arrivo = Point(punto_arrivo.x,punto_arrivo.y);
      else if(u.pos.x < punto_arrivo.x && u.pos.y > punto_arrivo.y)
        punto_arrivo = Point(-punto_arrivo.x,punto_arrivo.y);
      else if(u.pos.x > punto_arrivo.x && u.pos.y < punto_arrivo.y)
        punto_arrivo = Point(punto_arrivo.x,-punto_arrivo.y);
      else
        punto_arrivo = Point(-punto_arrivo.x,-punto_arrivo.y);

      punto_arrivo.Rot(angolo);
      punto_arrivo = punto_arrivo + GetNamedObj(forte).obj.AsBuilding.pos;

      // Se è troppo lontano
      if(u.posRH.Dist(GetNamedObj(forte).obj.AsBuilding.pos) > DISTANZA_MAX+GetNamedObj(forte).obj.AsBuilding.radius)
       {
        bool bNemici;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();

        if(u.command == "idle")
         if(bNemici)
          u.SetCommand("attack",punto_arrivo);
         else if(GetNamedObj(forte).obj.AsBuilding.IsEnemy(u) && GetNamedObj(forte).obj.AsBuilding.settlement.Units.count == 0)
          u.SetCommand("capture",GetNamedObj(forte).obj.AsBuilding);
         else
          u.SetCommand("attack",punto_arrivo);

       }
      else // Se è vicino al forte
       {
        bool bNemici,bNemiciInternoAlForte;

        bNemici = !Intersect(ObjsInSight(u,"Military"),EnemyObjs(u.player,"Military")).IsEmpty();
        bNemiciInternoAlForte = GetNamedObj(forte).obj.AsBuilding.settlement.Units().count > guerrieri.count/3;

        if(bNemici) // Se ci sono dei nemici vicini al forte
         {
          int n_catapulte;
          int k;
          ObjList cat;

          cat = Intersect(ObjsInSight(GetNamedObj(forte).obj.AsBuilding,"Military"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
          n_catapulte = cat.count;

          for(k=0;k<cat.count;k+=1)
           if(cat[k].AsCatapult.command == "disband" || cat[k].AsCatapult.command == "idle" || !cat[k].AsCatapult.IsBuilt() || cat[k].AsCatapult.settlement.Units.count < 5)
            if(cat[k].AsCatapult.race != 5 && cat[k].AsCatapult.race != 7)
             n_catapulte-=1;

         
       //   if(u.AsUnit.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
       //    u.SetCommand("attack",punto_arrivo);

          if(u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid() && !bNemiciInternoAlForte && n_catapulte > 2)
           u.SetCommand("attack",punto_arrivo);
         }
        else if(bNemiciInternoAlForte) // Se ci sono dei nemici interno al forte
         {
           int j;
           ObjList cat;
           bool bCatapulteDisponibili,bControllo=false;
           Catapult catapulta;

           bCatapulteDisponibili = !Intersect(ObjsInCircle(u.AsUnit.pos,RAGGIO_CATAPULTE,"Catapult"),FriendlyObjs(u.player,"Catapult")).IsEmpty();

           //pr(bCatapulteDisponibili);
           // Controlla se ci sono catapulte disponibili ovvero se i guerrieri al suo interno sono meno di 10
           if(bCatapulteDisponibili)
             {
              int distanza_minima = 1000000;
              cat = Intersect(ObjsInCircle(u.pos,RAGGIO_CATAPULTE,"Catapult"),ClassPlayerObjs("Catapult",u.player)).GetObjList();
           
              for(j=0;j<cat.count;j+=1)
               if(cat[j].AsCatapult.settlement.Units.count < 10)
                 {
                  bControllo=true;

                  if(u.DistTo(cat[j].pos) < distanza_minima)
                   {
                    catapulta = cat[j].AsCatapult;
                    distanza_minima = u.DistTo(cat[j].pos);
                   }
                 }
               bCatapulteDisponibili = bControllo;
              }
               //pr(bCatapulteDisponibili);
               if(contatore < 5 && bCatapulteDisponibili && u.AsUnit.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                 {
                  contatore+=1;
                  if(catapulta.AsCatapult.race != 5 && catapulta.AsCatapult.race != 7)
                   u.SetCommand("build_catapult",catapulta);
                  else if(!catapulta.AsCatapult.IsBuilt() && catapulta.settlement.Units.count < 5 && cat.count < 2)
                   u.SetCommand("build_catapult",catapulta);
                 }
               else if(u.command == "idle" && u.DistTo(GetNamedObj(forte).obj.AsBuilding.pos) < DISTANZA_MIN)
                 u.SetCommand("move",punto_arrivo);
               else if(!bCatapulteDisponibili) // C'è già una catapulta costruisci una nuova
                {
                 // Costruisci la catapulta trovando per prima cosa il punto
                 int tentativi=0; // Per evitare un loop troppo lungo
                 point p;
               
                 p = Point(-1000,-1000);
               
                 while(!IsPassable(p) && tentativi < 5)
                  if(u.IsValid() && u.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                    {
                     int k;
                     ObjList catapulteVicine;
                     point raggio;

                     raggio = Point(800+rand(200),0);

                     raggio.Rot(rand(360));

                     p = GetNamedObj(forte).obj.pos + raggio;
                     // Controlla che il punto p non sia troppo vicino alle altre catapulte

                     catapulteVicine = ClassPlayerObjs("Catapult",u.player).GetObjList();

                    // pr(catapulteVicine.count);
                       
                     for(k=0;k<catapulteVicine.count;k+=1)
                      if(catapulteVicine[k].AsCatapult.DistTo(p) < 50)
                       p = Point(-1000,-1000);

                     if(p.Dist(GetNamedObj(forte).obj.AsBuilding.pos) < DISTANZA_MIN || u.DistTo(p) > 500)
                       p = Point(-1000,-1000);

                     tentativi+=1;
                    }
                   else // Se l'unità non può lascia perdere
                     break;

                 if(contatore < 5 && IsPassable(p) && u.IsValid() && u.command == "idle" && !u.GetHolderSett.GetCentralBuilding.AsCatapult.IsValid())
                   {
                    contatore+=1;
                    u.SetCommand("build_catapult",PlaceCatapult(p.x,p.y,u.player,u.race));
                   }
               }      
         }
        else // Se non c'è nessuno al forte e vicino al forte allora cattura
         {
           if(u.command != "capture")
             {
              //pr(u.GetHolderSett().GetCentralBuilding().AsCatapult.IsValid());
              u.SetCommand("capture",GetNamedObj(forte).obj);
             }
         }
       }
      // IA Catapulte
         { // Analizza tutte le catapulte
           int i,n_catapulte_disband=0; // Catapulte non pronte oppure che si stanno smontando
           ObjList cat;

           cat = Intersect(ClassPlayerObjs("Catapult",u.player),ObjsInCircle(GetNamedObj(forte).obj.AsBuilding.pos,1500,"Catapult")).GetObjList();

          for(i=0;i<cat.count;i+=1)
           if(cat[i].AsCatapult.command == "disband" || cat[i].AsCatapult.command == "idle")
             n_catapulte_disband+=1;

           for(i=0;i<cat.count;i+=1)
            {
              if(cat[i].AsCatapult.race != 5 && cat[i].AsCatapult.race != 7)
               if(cat[i].AsCatapult.IsBuilt() && cat[i].AsCatapult.command != "attack_ground")          
                cat[i].SetCommand("attack_ground",GetNamedObj(forte).obj.pos + Point(rand(GetNamedObj(forte).obj.AsBuilding.radius)-rand(GetNamedObj(forte).obj.AsBuilding.radius),rand(GetNamedObj(forte).obj.AsBuilding.radius)-rand(GetNamedObj(forte).obj.AsBuilding.radius)));

              if(cat[i].AsCatapult.race != 5 && cat[i].AsCatapult.race != 7)
               if(cat.count-n_catapulte_disband >= 2)
                if(!Intersect(ObjsInSight(cat[i],"Military"),EnemyObjs(u.player,"Military")).IsEmpty() || !u.IsEnemy(GetNamedObj(forte).obj))
                 {
                  cat[i].AsCatapult.SetCommand("disband");// Smonta la catapulta
                  n_catapulte_disband+=1;
                 }

               if(cat[i].AsCatapult.race == 5 || cat[i].AsCatapult.race == 7)
                if(cat[i].AsCatapult.IsBuilt() && cat[i].AsCatapult.settlement.Units.count > 0)
                cat[i].AsCatapult.settlement.Units.SetCommand("move",cat[i].pos + Point(rand(50),rand(50)));

               if(cat[i].AsCatapult.race == 5 || cat[i].AsCatapult.race == 7)
                if(cat[i].AsCatapult.IsBuilt() && cat[i].AsCatapult.settlement.Units.count == 0 && cat[i].AsCatapult.command == "idle")
                 cat[i].AsCatapult.SetCommand("attack",GetNamedObj(forte).obj);
            }
             
         }
    }
    Sleep(1000);
    }


    Edited by supreme19 - 16/3/2017, 23:57
     
    .
  2.     +1   -1
     
    .
    Avatar

    Lottatore

    Group
    Princeps
    Posts
    535
    Reputation
    +31
    Location
    Bologna

    Status
    Offline
    Questa IA è fatta per un'avventura personalizzata, oppure è un miglioramento dell'aia generale (la quale spesso si incarta nella conquista di forti)?
     
    .
  3.     +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    No,si tratta di una IA generale
     
    .
  4.     +1   -1
     
    .
    Avatar

    Lottatore

    Group
    Princeps
    Posts
    535
    Reputation
    +31
    Location
    Bologna

    Status
    Offline
    Chiedere come poterla usare in sostituzione all'originale sarebbe una domanda banale? (Nel caso mi metterò poi a cercare io 😉)
     
    .
  5.     +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Si può,ma questo equivale a una mod
     
    .
  6.     +1   -1
     
    .
    Avatar

    Apprendista
    "

    Group
    Member
    Posts
    226
    Reputation
    +4

    Status
    Offline
    interessante, una IA più aggressiva di quelle esistenti esiste?
     
    .
  7.     +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Beh ovvio xD la IA della fx da quello che ho letto nel loro codice in pratica prima di attaccare il forte nemico devono riunire almeno i 2/3 del gruppo attaccante,quindi é poco efficiente se il gruppo é sparso in giro per la mappa.
     
    .
  8.     +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    Bel lavoro, Supreme! :D
     
    .
  9.     +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Nuova versione inserita
     
    .
  10.     +1   +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Nuova versione inserita!

    La versione 1.2 è molto vicina a quella definitiva
     
    .
  11.     +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Versione 1.3 aggiunta.

    Questa versione si può definire definitiva,adesso nelle prossime versioni modificheranno solo alcuni particolari se è necessario.
     
    .
  12.     +1   -1
     
    .
    Avatar

    Lottatore

    Group
    Princeps
    Posts
    535
    Reputation
    +31
    Location
    Bologna

    Status
    Offline
    Ho visto che nella cartella DATA di Imperium i sono i vari script che gestiscono fra le altre cose l'IA.
    A me interesse giocare contro un pc più agguerrito e meno stupido, sarebbe un ottimo allenamento e questa tua versione mi sembra ottima per il proposito.
    Sorge però la mia ignoranza in modding in Imperium.

    CITAZIONE (supreme19 @ 21/2/2017, 02:45) 
    Si può,ma questo equivale a una mod

    Ok che sia una mod, ma come faccio per farla usare al pc quando sono offline?
    Devo fare copia incolla di questo script dentro uno dei file in DATA di Imperium?
    Se sì quale?

    Spero che la domanda non sia troppo ovvia, ho provato a cercare sul forum (molto velocemente, scusate ma non so bene cosa cercare)...
     
    .
  13.     +1   -1
     
    .
    Avatar

    Guerriero

    Group
    Nobili
    Posts
    1,883
    Reputation
    +70
    Location
    Casapulla

    Status
    Offline
    Quanto accidenti è lungo sto codice?! O_O Pensavo bastassero un paio di frasi in script! :ohgod:
     
    .
  14.     +1   +1   -1
     
    .
    Avatar

    Signore
    """""""

    Group
    Member
    Posts
    102,483
    Reputation
    +88

    Status
    Anonymous
    Si devi copiare il codice sul file siege della cartella runaihelper e far corrispondere i 2 parametri a quello del file.

    Farò una versione dopo,la 1.4 per ottimizzare una cosa scoperta di recente,ma anche la 1.3 dovrebbe andare bene.
     
    .
  15.     +1   -1
     
    .
    Avatar

    Lottatore

    Group
    Princeps
    Posts
    535
    Reputation
    +31
    Location
    Bologna

    Status
    Offline
    Ho sostituito TUTTO il contenuto di siege con le tue righe di script, però onestamente non capisco quali siano i due parametri da modificare e in che senso debbano corrispondere :smile3:
     
    .
21 replies since 20/2/2017, 23:14   414 views
  Share  
.