Exemple #1
0
        // 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;
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        // 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);
            }
        }