// FMCAS // public void FMCAS(CSBPod MyFriend, CSBPod MyFoeG, CSBPod MyFoeH) { // etape 1 : calculer la difference entre mon vecteur vitesse et celui des autres pods // // etape 2 : pour les pods pour lequels la difference de vecteur vitesse est importante, si un impact est probable, on utilise le SHIELD // // if (CSBCompute.DistAB(p_PosMySpeed, MyFriend.p_PosMySpeed) > C_DeltaSpeedShieldTrigger && CSBCompute.DistAB(p_NextPosEstimated, MyFriend.p_NextPosEstimated) < C_DeltaDistShieldTrigger) // { p_UseShieldCommand = true; } if (CSBCompute.DistAB(p_PosMySpeed, MyFoeG.p_PosMySpeed) > C_DeltaSpeedShieldTrigger && CSBCompute.DistAB(p_NextPosEstimated, MyFoeG.p_NextPosEstimated) < C_DeltaDistShieldTrigger) { p_UseShieldCommand = true; } if (CSBCompute.DistAB(p_PosMySpeed, MyFoeH.p_PosMySpeed) > C_DeltaSpeedShieldTrigger && CSBCompute.DistAB(p_NextPosEstimated, MyFoeH.p_NextPosEstimated) < C_DeltaDistShieldTrigger) { p_UseShieldCommand = true; } }
public void Update(string rawinputs, CSBTrack Track) { string[] inputs = rawinputs.Split(' '); if (p_PosPod.X == -1 && p_PosPod.Y == -1) { p_PrevPosMe.Update(int.Parse(inputs[0]), int.Parse(inputs[1])); } else { p_PrevPosMe.Update(p_PosPod); } p_PosPod.Update(int.Parse(inputs[0]), int.Parse(inputs[1])); p_PosMySpeed.Update(int.Parse(inputs[2]), int.Parse(inputs[3])); p_DegAngleOrgHead = int.Parse(inputs[4]); p_PosEastAngleOrigin.Y = p_PosPod.Y; // Next 3 CP from Track p_nextTRACKCPID = int.Parse(inputs[5]); Next3CPRoute.Update(Track.CPTable[p_nextTRACKCPID].Position, Track.CPTable[(p_nextTRACKCPID + 1) % Track.CPNumber].Position, Track.CPTable[(p_nextTRACKCPID + 2) % Track.CPNumber].Position); // Speed p_NextPosEstimated.X = p_PosPod.X + p_PosMySpeed.X; p_NextPosEstimated.Y = p_PosPod.Y + p_PosMySpeed.Y; p_DistMySpeed = CSBCompute.DistAB(p_PosPod, p_NextPosEstimated); // Angles p_RadAngleOrgTrack = CSBCompute.AngleOrienteVecteur(p_PosEastAngleOrigin, p_PosMySpeed, p_PosPod); p_RadAngleOrgNextCP = CSBCompute.AngleOrientePos(p_PosEastAngleOrigin, Next3CPRoute.NextCP1, p_PosPod); if (FirstExecCycle) { p_DegAngleOrgHead = (int)(p_RadAngleOrgNextCP / Math.PI * 180); FirstExecCycle = false; } p_DegAngleHeadNextCP = ((p_RadAngleOrgNextCP / Math.PI * 180) - p_DegAngleOrgHead); // Drift Angles p_DegAngleTrackNextCP = ((p_RadAngleOrgNextCP - p_RadAngleOrgTrack) / Math.PI * 180 + 360) % 360; if (p_DegAngleTrackNextCP > 180) { p_DegAngleTrackNextCP -= 360; } // Distances p_PrevDistNextCheckPoint = p_DistNextCheckpoint; p_DistNextCheckpoint = CSBCompute.DistAB(p_PosPod, Next3CPRoute.NextCP1); p_DistMissingNxtCP = CSBCompute.ClosestFromNxtCP(p_PrevPosMe, p_PosPod, Next3CPRoute.NextCP1, p_DistNextCheckpoint); }
// AFCS // public String AFCSMOVE() { if ((p_DistNextCheckpoint - 600) < (4 * p_DistMySpeed) && p_DistMissingNxtCP < 555) { p_PosForMyNextMove = Next3CPRoute.NextCP2; Console.Error.WriteLine("going to CP N+1"); // probleme ; dans les faits, ça devrait impacter tout le reste de la méthode } else { p_PosForMyNextMove = Next3CPRoute.NextCP1; Console.Error.WriteLine("going to CP N"); } // selon le relevement du prochain WP, on régule les gaz : if (Math.Abs(p_DegAngleHeadNextCP) < 70) { p_ThrustForMyNextMove = 100; } else if (Math.Abs(p_DegAngleHeadNextCP) < 80) { p_ThrustForMyNextMove = 50; } else { p_ThrustForMyNextMove = 0; } // selon la vitesse et la dérive, on corrige le cap : if (p_DistMissingNxtCP > 555 && p_DistNextCheckpoint < 6666) { if ((p_DistNextCheckpoint - 600) < (4 * p_DistMySpeed)) { Console.Error.WriteLine("Big Drift Correction"); p_DistTrajCorrection = 1111; } else { Console.Error.WriteLine("Small Drift Correction"); p_DistTrajCorrection = 500; } if (p_DegAngleTrackNextCP > 0) { p_PosForMyNextMove = CSBCompute.TranslateCoordinates(p_PosForMyNextMove, (p_RadAngleOrgNextCP + Math.PI / 2), p_DistTrajCorrection); } else { p_PosForMyNextMove = CSBCompute.TranslateCoordinates(p_PosForMyNextMove, (p_RadAngleOrgNextCP - Math.PI / 2), p_DistTrajCorrection); } } // selon la proximité avec le prochain WP, on réduit les gaz : if ((p_DistNextCheckpoint - 600) < (3 * p_DistMySpeed)) { p_ThrustForMyNextMove = p_ThrustForMyNextMove / 5; Console.Error.WriteLine("Reduce Gaz ; close to next CP"); } // selon les conditions, on décide si on va utiliser le boost ou pas : if (p_BoostUsed == false && Math.Abs(p_DegAngleHeadNextCP) < 20 && Math.Abs(p_DistMissingNxtCP) < 555 && p_DistNextCheckpoint > 5555 && p_DistMySpeed > 111) { p_UseBoostCommand = true; } // LET'S MOVE if (p_UseShieldCommand) { p_UseShieldCommand = false; return(p_PosForMyNextMove.X + " " + p_PosForMyNextMove.Y + " SHIELD boom"); } else if (p_UseBoostCommand) { p_BoostUsed = true; p_UseBoostCommand = false; return(p_PosForMyNextMove.X + " " + p_PosForMyNextMove.Y + " BOOST gooooo"); } else { return(p_PosForMyNextMove.X + " " + p_PosForMyNextMove.Y + " " + p_ThrustForMyNextMove); } }