// cheap hack to respond to enemy shooting us void csai_UnitDamagedEvent(int damaged, int attacker, float damage, Float3 dir) { /* * if (!EnemyUnitDefByDeployedId.ContainsKey(attacker)) * { * EnemyUnitDefByDeployedId.Add(attacker, aicallback.GetUnitDef(attacker)); * } */ //if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) //{ Float3 enemypos = aicallback.GetUnitPos(attacker); if (enemypos != null && Float3Helper.GetSquaredDistance(enemypos, new Float3(0, 0, 0)) > 10 * 10) { logfile.WriteLine("unitdamaged, attacker " + attacker + " pos " + enemypos); if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) { EnemyStaticPosByDeployedId.Add(attacker, enemypos); } else { EnemyStaticPosByDeployedId[attacker] = enemypos; } if (NewStaticEnemyAddedEvent != null) { NewStaticEnemyAddedEvent(attacker, enemypos, null); } } else // else we guess... { if (FriendlyUnitPositionObserver.GetInstance().PosById.ContainsKey(damaged)) { Float3 ourunitpos = FriendlyUnitPositionObserver.GetInstance().PosById[damaged]; if (ourunitpos != null) { Float3 guessvectortotarget = dir * 300.0; logfile.WriteLine("vectortotarget guess: " + guessvectortotarget.ToString()); Float3 possiblepos = ourunitpos + guessvectortotarget; if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) { EnemyStaticPosByDeployedId.Add(attacker, possiblepos); } else { EnemyStaticPosByDeployedId[attacker] = possiblepos; } if (NewStaticEnemyAddedEvent != null) { NewStaticEnemyAddedEvent(attacker, possiblepos, null); } logfile.WriteLine("unitdamaged, attacker " + attacker + " our unit pos " + ourunitpos + " dir " + dir.ToString() + " guess: " + possiblepos.ToString()); } } } //} }
bool DoReclaim(int constructorid) { if (totalticks == 0) // check ticks first, beacuse metal shows as zero at start { return(false); } IUnitDef unitdef = UnitDefByUnitId[constructorid] as IUnitDef; Float3 mypos = aicallback.GetUnitPos(constructorid); MovementMaps movementmaps = MovementMaps.GetInstance(); int currentarea = movementmaps.GetArea(unitdef, mypos); //double nearestreclaimdistancesquared = 1000000; //Float3 nearestreclaimpos = null; double bestmetaldistanceratio = 0; int bestreclaimid = 0; int metalspace = (int)(aicallback.GetMetalStorage() - aicallback.GetMetal()); logfile.WriteLine("available space in metal storage: " + metalspace); int[] nearbyfeatures = aicallback.GetFeatures(mypos, maxreclaimradius); bool reclaimfound = false; foreach (int feature in nearbyfeatures) { IFeatureDef featuredef = aicallback.GetFeatureDef(feature); if (featuredef.metal > 0 && featuredef.metal <= metalspace) { Float3 thisfeaturepos = aicallback.GetFeaturePos(feature); double thisdistance = Math.Sqrt(Float3Helper.GetSquaredDistance(thisfeaturepos, mypos)); double thismetaldistanceratio = featuredef.metal / thisdistance; if (thismetaldistanceratio > bestmetaldistanceratio && movementmaps.GetArea(unitdef, thisfeaturepos) == currentarea) { logfile.WriteLine("Potential reclaim, distance = " + thisdistance + " metal = " + featuredef.metal + " ratio = " + thismetaldistanceratio); bestmetaldistanceratio = thismetaldistanceratio; bestreclaimid = feature; // nearestreclaimpo reclaimfound = true; } } } if (reclaimfound && (bestmetaldistanceratio > (1.0 / (100 * reclaimradiusperonehundredmetal)))) { Float3 reclaimpos = aicallback.GetFeaturePos(bestreclaimid); logfile.WriteLine("Reclaim found, pos " + reclaimpos.ToString()); if (csai.DebugOn) { aicallback.DrawUnit("ARMMEX", reclaimpos, 0.0f, 200, aicallback.GetMyAllyTeam(), true, true); } aicallback.GiveOrder(constructorid, new Command(Command.CMD_RECLAIM, new double[] { reclaimpos.x, reclaimpos.y, reclaimpos.z, 10 })); } else { logfile.WriteLine("No reclaim within parameters"); } return(reclaimfound); }
public void UnitCreated(int unit) { aicallback.SendTextMsg("Unit created: " + unit, 0); IUnitDef unitdef = aicallback.GetUnitDef(unit); aicallback.SendTextMsg("Unit created: " + unitdef.name, 0); IMoveData movedata = unitdef.movedata; if (movedata != null) { aicallback.SendTextMsg("Max Slope: " + movedata.maxSlope, 0); } if (unitdef.isCommander) { int numbuildoptions = unitdef.GetNumBuildOptions(); string buildoptionsstring = "Build options: "; for (int i = 0; i < numbuildoptions; i++) { buildoptionsstring += unitdef.GetBuildOption(i); } aicallback.SendTextMsg(buildoptionsstring, 0); Float3 commanderpos = aicallback.GetUnitPos(unit); aicallback.SendTextMsg("Commanderpos: " + commanderpos.ToString(), 0); int numunitdefs = aicallback.GetNumUnitDefs(); aicallback.SendTextMsg("Num unit defs: " + numunitdefs, 0); for (int i = 1; i <= numunitdefs; i++) { IUnitDef thisunitdef = aicallback.GetUnitDefByTypeId(i); if (thisunitdef.name == "ARMSOLAR") { aicallback.SendTextMsg("Found solar collector def: " + thisunitdef.id, 0); Float3 nearestbuildpos = aicallback.ClosestBuildSite(thisunitdef, commanderpos, 1400, 2); aicallback.SendTextMsg("Closest build site: " + nearestbuildpos.ToString(), 0); aicallback.DrawUnit("ARMSOLAR", nearestbuildpos, 0, 200, aicallback.GetMyAllyTeam(), true, true); aicallback.GiveOrder(unit, new Command(-thisunitdef.id, nearestbuildpos.ToDoubleArray())); } } } }
void ExploreWith(int unitid) { Float3 destination = new Float3(); if (PriorityTargets.Count > 0) { destination = PriorityTargets.Dequeue() as Float3; logfile.WriteLine("dequeued next destination: " + destination.ToString()); } else { destination.x = random.Next(0, aicallback.GetMapWidth() * MovementMaps.SQUARE_SIZE); destination.z = random.Next(0, aicallback.GetMapHeight() * MovementMaps.SQUARE_SIZE); destination.y = aicallback.GetElevation(destination.x, destination.y); logfile.WriteLine("mapwidth: " + aicallback.GetMapWidth() + " squaresize: " + MovementMaps.SQUARE_SIZE); logfile.WriteLine("ScoutController sending scout " + unitid + " to " + destination.ToString()); } aicallback.GiveOrder(unitid, new Command(Command.CMD_MOVE, destination.ToDoubleArray())); }
public void UnitAdded(int deployedid, IUnitDef unitdef) { if (!isMetalMap) { if (!Extractors.Contains(deployedid) && unitdefhelp.IsMex(unitdef)) { Float3 mexpos = aicallback.GetUnitPos(deployedid); logfile.WriteLine("Metal.UnitAdded, pos " + mexpos.ToString()); Extractors.Add(deployedid, mexpos); double squareextractorradius = ExtractorRadius * ExtractorRadius; foreach (MetalSpot metalspot in MetalSpots) { double thisdistancesquared = Float3Helper.GetSquaredDistance(metalspot.Pos, mexpos); // logfile.WriteLine( "squareextractorradius: " + squareextractorradius + " thisdistancesquared: " + thisdistancesquared ); if (thisdistancesquared <= squareextractorradius) { MetalSpotsUsed.Add(metalspot); logfile.WriteLine("Marking metal spot used: " + metalspot.Pos.ToString()); } } } } }
public void UnitRemoved(int deployedid) { if (!isMetalMap) { if (Extractors.Contains(deployedid)) { Float3 mexpos = Extractors[deployedid] as Float3; logfile.WriteLine("Metal.UnitRemoved, pos " + mexpos.ToString()); double squareextractorradius = ExtractorRadius * ExtractorRadius; foreach (MetalSpot metalspot in MetalSpots) { if (Float3Helper.GetSquaredDistance(metalspot.Pos, mexpos) < squareextractorradius) { if (MetalSpotsUsed.Contains(metalspot)) { logfile.WriteLine("Marking metal spot free: " + metalspot.Pos.ToString()); MetalSpotsUsed.Remove(metalspot); } } } Extractors.Remove(deployedid); } } }
Float3 BuildUnit(int constructorid, string targetunitname) { csai.DebugSay("workflow, building " + targetunitname); IUnitDef targetunitdef = BuildTable.GetInstance().UnitDefByName[targetunitname]; IUnitDef constructordef = UnitController.GetInstance().UnitDefByDeployedId[constructorid]; if (new UnitDefHelp(aicallback).IsMobile(constructordef)) { logfile.WriteLine("constructor is mobile"); Float3 constructorpos = aicallback.GetUnitPos(constructorid); Float3 buildsite = BuildPlanner.GetInstance().ClosestBuildSite(targetunitdef, constructorpos, 3000, 2); buildsite = aicallback.ClosestBuildSite(targetunitdef, buildsite, 1400, 0); logfile.WriteLine("constructor location: " + constructorpos.ToString() + " Buildsite: " + buildsite.ToString() + " target item: " + targetunitdef.humanName); if (!ActiveConstructors.Contains(constructorid)) { ActiveConstructors.Add(constructorid); } aicallback.DrawUnit(targetunitname.ToUpper(), buildsite, 0.0, 200, aicallback.GetMyAllyTeam(), true, true); GiveOrderWrapper.GetInstance().BuildUnit(constructorid, targetunitname, buildsite); return(buildsite); } else { Float3 factorypos = aicallback.GetUnitPos(constructorid); logfile.WriteLine("factory location: " + factorypos.ToString() + " target item: " + targetunitdef.humanName); if (!ActiveConstructors.Contains(constructorid)) { ActiveConstructors.Add(constructorid); } aicallback.DrawUnit(targetunitdef.name.ToUpper(), factorypos, 0.0, 200, aicallback.GetMyAllyTeam(), true, true); GiveOrderWrapper.GetInstance().BuildUnit(constructorid, targetunitname); return(factorypos); } }
void BuildAt(int constructorid, IUnitDef unitdef, Float3 buildsite) { IUnitDef placeholder; /* * if( unitdef.name.ToLower() == "armmex" ) // use smaller placeholder for mexes so fit closer to intended metalspot * { * placeholder = buildtable.UnitDefByName[ "ARMMOHO".ToLower() ] as IUnitDef; * } * else * { * placeholder = buildtable.UnitDefByName[ "CORGANT".ToLower() ] as IUnitDef; * } * buildsite = aicallback.ClosestBuildSite( placeholder, buildsite, 1400.0, 2 ); * buildsite = aicallback.ClosestBuildSite( unitdef, buildsite, 1400.0, 2 ); */ if (unitdef.name == "ARMMEX") { placeholder = buildtable.UnitDefByName["ARMMOHO".ToLower()] as IUnitDef; buildsite = aicallback.ClosestBuildSite(placeholder, buildsite, 1400.0, 2); buildsite = aicallback.ClosestBuildSite(unitdef, buildsite, 1400.0, 2); } else { buildsite = BuildPlanner.GetInstance().ClosestBuildSite(unitdef, buildsite, 3000); buildsite.y = aicallback.GetElevation(buildsite.x, buildsite.z); buildsite = aicallback.ClosestBuildSite(unitdef, buildsite, 1400, 2); } logfile.WriteLine("building " + unitdef.name + " at " + buildsite.ToString()); if (ShowNextBuildSite) { aicallback.DrawUnit(unitdef.name, buildsite, 0.0f, 500, aicallback.GetMyAllyTeam(), true, true); } aicallback.GiveOrder(constructorid, new Command(-unitdef.id, buildsite.ToDoubleArray())); }
void CommanderBuildAt(IUnitDef unitdef, Float3 buildsite) { logfile.WriteLine("Commander building " + unitdef.name + " at " + buildsite.ToString()); aicallback.DrawUnit(unitdef.name, buildsite, 0.0f, 500, aicallback.GetMyAllyTeam(), true, true); aicallback.GiveOrder(commanderid, new Command(-unitdef.id, buildsite.ToDoubleArray())); }
/* * void DoSomething() * { * logfile.WriteLine( "CommanderController.DoSomething()" ); * IUnitDef factorydef = buildtable.UnitDefByName[ "armvp" ] as IUnitDef; * IUnitDef radardef = buildtable.UnitDefByName[ "armrad" ] as IUnitDef; * * if( aicallback.GetEnergy() * 100 / aicallback.GetEnergyStorage() < 10 ) * { * CommanderBuildPower(); * } * else if( aicallback.GetMetal() * 100 / aicallback.GetMetalStorage() < 50 ) * { * CommanderBuildExtractor(); * } * else if( FactoryController.GetInstance().FactoryUnitDefByDeployedId.Count > 0 && * PowerController.GetInstance().CanBuild( radardef ) && * RadarController.GetInstance().NeedRadarAt( aicallback.GetUnitPos( commanderid ) ) ) * { * CommanderBuildRadar(); * } * else * { * if( MetalController.GetInstance().CanBuild( factorydef ) ) * { * if( PowerController.GetInstance().CanBuild( factorydef ) ) * { * CommanderBuildFactory(); * } * else * { * CommanderBuildPower(); * } * } * else * { * CommanderBuildExtractor(); * } * } * } */ public void VoiceCommandCommanderBuildAt(string chatstring, string[] splitchatstring, int player) { string unitname = splitchatstring[2]; IUnitDef unitdef = buildtable.UnitDefByName[unitname.ToLower()] as IUnitDef; if (unitdef == null) { aicallback.SendTextMsg("Unit " + unitname + " not found.", 0); return; } Float3 pos = new Float3(); pos.x = Convert.ToDouble(splitchatstring[3]); pos.z = Convert.ToDouble(splitchatstring[4]); pos.y = aicallback.GetElevation(pos.x, pos.z); aicallback.SendTextMsg("giving build order, id " + unitdef.humanName + " at " + pos.ToString(), 0); CommanderBuildAt(unitdef, pos); }
void CommanderBuildAt( IUnitDef unitdef, Float3 buildsite ) { logfile.WriteLine( "Commander building " + unitdef.name + " at " + buildsite.ToString() ); aicallback.DrawUnit(unitdef.name, buildsite, 0.0f, 500, aicallback.GetMyAllyTeam(), true, true); aicallback.GiveOrder( commanderid, new Command( - unitdef.id, buildsite.ToDoubleArray() ) ); }
/* void DoSomething() { logfile.WriteLine( "CommanderController.DoSomething()" ); IUnitDef factorydef = buildtable.UnitDefByName[ "armvp" ] as IUnitDef; IUnitDef radardef = buildtable.UnitDefByName[ "armrad" ] as IUnitDef; if( aicallback.GetEnergy() * 100 / aicallback.GetEnergyStorage() < 10 ) { CommanderBuildPower(); } else if( aicallback.GetMetal() * 100 / aicallback.GetMetalStorage() < 50 ) { CommanderBuildExtractor(); } else if( FactoryController.GetInstance().FactoryUnitDefByDeployedId.Count > 0 && PowerController.GetInstance().CanBuild( radardef ) && RadarController.GetInstance().NeedRadarAt( aicallback.GetUnitPos( commanderid ) ) ) { CommanderBuildRadar(); } else { if( MetalController.GetInstance().CanBuild( factorydef ) ) { if( PowerController.GetInstance().CanBuild( factorydef ) ) { CommanderBuildFactory(); } else { CommanderBuildPower(); } } else { CommanderBuildExtractor(); } } } */ public void VoiceCommandCommanderBuildAt( string chatstring, string[] splitchatstring, int player ) { string unitname = splitchatstring[2]; IUnitDef unitdef = buildtable.UnitDefByName[ unitname.ToLower() ] as IUnitDef; if( unitdef == null ) { aicallback.SendTextMsg( "Unit " + unitname + " not found.", 0 ); return; } Float3 pos = new Float3(); pos.x = Convert.ToDouble( splitchatstring[3] ); pos.z = Convert.ToDouble( splitchatstring[4] ); pos.y = aicallback.GetElevation( pos.x, pos.z ); aicallback.SendTextMsg( "giving build order, id " + unitdef.humanName + " at " + pos.ToString(), 0 ); CommanderBuildAt( unitdef, pos ); }
void BuildAt( int constructorid, IUnitDef unitdef, Float3 buildsite ) { IUnitDef placeholder; /* if( unitdef.name.ToLower() == "armmex" ) // use smaller placeholder for mexes so fit closer to intended metalspot { placeholder = buildtable.UnitDefByName[ "ARMMOHO".ToLower() ] as IUnitDef; } else { placeholder = buildtable.UnitDefByName[ "CORGANT".ToLower() ] as IUnitDef; } buildsite = aicallback.ClosestBuildSite( placeholder, buildsite, 1400.0, 2 ); buildsite = aicallback.ClosestBuildSite( unitdef, buildsite, 1400.0, 2 ); */ if( unitdef.name == "ARMMEX" ) { placeholder = buildtable.UnitDefByName[ "ARMMOHO".ToLower() ] as IUnitDef; buildsite = aicallback.ClosestBuildSite( placeholder, buildsite, 1400.0, 2 ); buildsite = aicallback.ClosestBuildSite( unitdef, buildsite, 1400.0, 2 ); } else { buildsite = BuildPlanner.GetInstance().ClosestBuildSite( unitdef, buildsite, 3000 ); buildsite.y = aicallback.GetElevation( buildsite.x, buildsite.z ); buildsite = aicallback.ClosestBuildSite( unitdef, buildsite, 1400, 2 ); } logfile.WriteLine( "building " + unitdef.name + " at " + buildsite.ToString() ); if( ShowNextBuildSite ) { aicallback.DrawUnit(unitdef.name, buildsite, 0.0f, 500, aicallback.GetMyAllyTeam(), true, true); } aicallback.GiveOrder( constructorid, new Command( - unitdef.id, buildsite.ToDoubleArray() ) ); }
public override string ToString() { if (pos != null) { return("BuildCommand " + UnitToReceiveOrder + " building " + BuildTable.GetInstance().UnitDefById[idtobuild].humanName + " at " + pos.ToString()); } else { return("BuildCommand " + UnitToReceiveOrder + " building " + BuildTable.GetInstance().UnitDefById[idtobuild].humanName); } }
// cheap hack to respond to enemy shooting us void csai_UnitDamagedEvent(int damaged, int attacker, float damage, Float3 dir) { /* if (!EnemyUnitDefByDeployedId.ContainsKey(attacker)) { EnemyUnitDefByDeployedId.Add(attacker, aicallback.GetUnitDef(attacker)); } */ //if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) //{ Float3 enemypos = aicallback.GetUnitPos(attacker); if (enemypos != null && Float3Helper.GetSquaredDistance(enemypos, new Float3(0, 0, 0)) > 10 * 10) { logfile.WriteLine("unitdamaged, attacker " + attacker + " pos " + enemypos); if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) { EnemyStaticPosByDeployedId.Add(attacker, enemypos); } else { EnemyStaticPosByDeployedId[attacker] = enemypos; } if (NewStaticEnemyAddedEvent != null) { NewStaticEnemyAddedEvent(attacker, enemypos, null); } } else // else we guess... { if (FriendlyUnitPositionObserver.GetInstance().PosById.ContainsKey(damaged)) { Float3 ourunitpos = FriendlyUnitPositionObserver.GetInstance().PosById[damaged]; if (ourunitpos != null) { Float3 guessvectortotarget = dir * 300.0; logfile.WriteLine("vectortotarget guess: " + guessvectortotarget.ToString()); Float3 possiblepos = ourunitpos + guessvectortotarget; if (!EnemyStaticPosByDeployedId.ContainsKey(attacker)) { EnemyStaticPosByDeployedId.Add(attacker, possiblepos); } else { EnemyStaticPosByDeployedId[attacker] = possiblepos; } if (NewStaticEnemyAddedEvent != null) { NewStaticEnemyAddedEvent(attacker, possiblepos, null); } logfile.WriteLine("unitdamaged, attacker " + attacker + " our unit pos " + ourunitpos + " dir " + dir.ToString() + " guess: " + possiblepos.ToString()); } } } //} }
public override string ToString() { return("MoveToCommand " + UnitToReceiveOrder + " moving to " + targetpos.ToString()); }
public override string ToString() { return("PositionTarget: " + targetpos.ToString()); }
void ExploreWith( int unitid ) { Float3 destination = new Float3(); // if( PriorityTargets.Count > 0 ) // { // destination = PriorityTargets.Dequeue() as Float3; // logfile.WriteLine( "dequeued next destination: " + destination.ToString() ); // } // else // { destination.x = random.Next(0, aicallback.GetMapWidth() * MovementMaps.SQUARE_SIZE ); destination.z = random.Next( 0, aicallback.GetMapHeight() * MovementMaps.SQUARE_SIZE ); destination.y = aicallback.GetElevation( destination.x, destination.y ); logfile.WriteLine( "mapwidth: " + aicallback.GetMapWidth() + " squaresize: " + MovementMaps.SQUARE_SIZE ); logfile.WriteLine( "ScoutController sending scout " + unitid + " to " + destination.ToString() ); // } //aicallback.GiveOrder( unitid, new Command( Command.CMD_MOVE, destination.ToDoubleArray() ) ); GiveOrderWrapper.GetInstance().MoveTo(unitid, destination); }
public override string ToString() { return("MetalSpot( Pos=" + Pos.ToString() + ", Amount=" + Amount + ", IsOccupied=" + IsOccupied); }
void UpdateLosForUnit(int unitid, IUnitDef unitdef) { int thisframecount = aicallback.GetCurrentFrame(); Float3 pos = friendlyunitpositionobserver.PosById[unitid] as Float3; int seenmapx = (int)(pos.x / 16); int seenmapy = (int)(pos.z / 16); // int radius = (int)( unitdef.losRadius / 8 / 2 ); int radius = (int)unitdef.losRadius; if (csai.DebugOn) { //aicallback.SendTextMsg( "Updating los for " + unitid + " " + unitdef.humanName + " los radius " + radius, 0 ); DrawingUtils.DrawCircle(pos, radius * 16); } logfile.WriteLine("Updating los for " + unitid + " " + unitdef.humanName + " los radius " + radius + " pos " + pos.ToString()); // go line by line, determine positive and negative extent of line, mark lostime for (int deltay = -radius; deltay <= radius; deltay++) { int xextent = (int)Math.Sqrt(radius * radius - deltay * deltay); for (int deltax = -xextent; deltax <= xextent; deltax++) { int thisx = seenmapx + deltax; int thisy = seenmapy + deltay; if (thisx >= 0 && thisx < mapwidth / 2 && thisy >= 0 && thisy < mapheight / 2) { LastSeenFrameCount[thisx, thisy] = thisframecount; } } // in progress } LastLosRefreshFrameCountByUnitId[unitid] = thisframecount; PosAtLastRefreshByUnitId[unitid] = pos; logfile.WriteLine("...done"); }
public override string ToString() { return("OwnershipOrder orderedunit: " + orderedunit.humanName + " pos " + pos.ToString() + " deployedid " + unitdeployedid); }