|
|
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
|
|