Guest User

Untitled

a guest
Oct 31st, 2021
700
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.20 KB | None | 0 0
  1. public static class OverflowJumpCalculator
  2. {
  3.     public static List<TriangleDataModel> flatFloorTris;
  4.     public static List<int> possibleAngles;
  5.  
  6.     public static void Test()
  7.     {
  8.         double startX = -2838;
  9.         double startY = 1610.8349609375;
  10.         double startZ = -42.8171844482422;
  11.         List<double> initialHSpeeds = new List<double>()
  12.         {
  13.             -427922.90625, -641883.5, -962824.375, -1444235.625, -2166352.75, -3249528.25,
  14.         };
  15.         double goalX = 2806.789063;
  16.         double goalY = 1033;
  17.         double goalZ = -130.9819946;
  18.  
  19.         flatFloorTris = TriangleUtilities.GetLevelTriangles()
  20.             .FindAll(tri => tri.IsFloor() && tri.NormY == 1 && tri.SurfaceType != 0x0A);
  21.         possibleAngles = Enumerable.Range(0, 4096).ToList().ConvertAll(i => 16 * i);
  22.  
  23.         List<double> moreHSpeeds = initialHSpeeds.ConvertAll(
  24.             hSpeed => GetSuccessiveHSpeeds(hSpeed)).SelectMany(list => list).ToList();
  25.         initialHSpeeds.AddRange(moreHSpeeds);
  26.         initialHSpeeds = ControlUtilities.Randomize(initialHSpeeds);
  27.  
  28.         Queue<MarioPuState> queue = new Queue<MarioPuState>();
  29.         initialHSpeeds.ForEach(hSpeed => queue.Enqueue(
  30.             new MarioPuState(startX, startY, startZ, hSpeed, 0, null, 0)));
  31.  
  32.         Config.Print("START");
  33.         int lastIndex = -1;
  34.         while (queue.Count > 0)
  35.         {
  36.             MarioPuState dequeue = queue.Dequeue();
  37.             if (dequeue.Index > lastIndex)
  38.             {
  39.                 lastIndex = dequeue.Index;
  40.                 Config.Print("Now on index " + lastIndex);
  41.             }
  42.  
  43.             List<int> anglesToUse;
  44.             if (dequeue.Index < 2)
  45.             {
  46.                 anglesToUse = possibleAngles;
  47.             }
  48.             else
  49.             {
  50.                 int angle = MoreMath.NormalizeAngleTruncated(MoreMath.AngleTo_AngleUnits(goalX, goalZ, dequeue.X, dequeue.Z));
  51.                 anglesToUse = new List<int>() { angle - 16, angle, angle + 16 };
  52.             }
  53.  
  54.             foreach (int angle in anglesToUse)
  55.             {
  56.                 MarioPuState state = TestOverflowJump(dequeue, angle);
  57.                 if (state == null) continue;
  58.  
  59.                 double dist = MoreMath.GetDistanceBetween(state.X, state.Z, goalX, goalZ);
  60.                 if (state.Index >= 2 && dist > Math.Abs(state.HSpeed)) continue;
  61.                 if (dist < 1000 && state.Y == goalY)
  62.                 {
  63.                     Config.Print(dist);
  64.                     Config.Print(state.GetLineage());
  65.                 }
  66.  
  67.                 if (state.Index >= 3) continue;
  68.                 List<MarioPuState> nextStates = GetSuccessiveStates(state);
  69.                 nextStates.Insert(0, state);
  70.                 nextStates = ControlUtilities.Randomize(nextStates);
  71.                 nextStates.ForEach(s => queue.Enqueue(s));
  72.             }
  73.         }
  74.         Config.Print("END");
  75.     }
  76.  
  77.     public static MarioPuState TestOverflowJump(MarioPuState state, int angle)
  78.     {
  79.         double hSpeed = state.HSpeed * 0.8;
  80.         double hDist = hSpeed / 4;
  81.         double vSpeed = 42 + state.HSpeed / 4;
  82.         double vDist = vSpeed / 4;
  83.  
  84.         (double x, double z) = MoreMath.AddVectorToPoint(hDist, angle, state.X, state.Z);
  85.         double y = state.Y + vDist;
  86.  
  87.         double modX = MoreMath.MaybeNegativeModulus(x, 65536);
  88.         double modY = MoreMath.MaybeNegativeModulus(y, 65536);
  89.         double modZ = MoreMath.MaybeNegativeModulus(z, 65536);
  90.  
  91.         if (modX < -8192 || modX > 8192) return null;
  92.         if (modZ < -8192 || modZ > 8192) return null;
  93.         if (modY < -8192) return null;
  94.  
  95.         double? bestFloorY = null;
  96.         foreach (TriangleDataModel tri in flatFloorTris)
  97.         {
  98.             if (tri.IsPointInsideAndAboveTriangle(modX, modY, modZ))
  99.             {
  100.                 double floorY = tri.GetHeightOnTriangle(modX, modZ);
  101.                 if (bestFloorY == null || floorY > bestFloorY)
  102.                 {
  103.                     bestFloorY = floorY;
  104.                 }
  105.             }
  106.         }
  107.  
  108.         if (bestFloorY.HasValue && bestFloorY.Value > state.Y - 3000)
  109.         {
  110.             return new MarioPuState(x, bestFloorY.Value, z, hSpeed, angle, state, state.Index + 1);
  111.         }
  112.         return null;
  113.     }
  114.  
  115.     public class MarioPuState
  116.     {
  117.         public readonly double X;
  118.         public readonly double Y;
  119.         public readonly double Z;
  120.         public readonly double HSpeed;
  121.         public readonly double Angle;
  122.         public readonly MarioPuState Predecessor;
  123.         public readonly int Index;
  124.  
  125.         public MarioPuState(double x, double y, double z, double hSpeed, double angle, MarioPuState predecessor, int index)
  126.         {
  127.             X = x;
  128.             Y = y;
  129.             Z = z;
  130.             HSpeed = hSpeed;
  131.             Angle = angle;
  132.             Predecessor = predecessor;
  133.             Index = index;
  134.         }
  135.  
  136.         public string GetLineage()
  137.         {
  138.             double deltaY = Predecessor == null ? 0 : Y - Predecessor.Y;
  139.             string past = Predecessor == null ? "" : Predecessor.GetLineage();
  140.             string current = ToString() + " " + deltaY + "\r\n";
  141.             return past + current;
  142.         }
  143.  
  144.         public override string ToString()
  145.         {
  146.             return string.Format(
  147.                 "X={0} Y={1} Z={2} HSpeed={3} Angle={4}",
  148.                 X, Y, Z, HSpeed, Angle);
  149.         }
  150.     }
  151.  
  152.     public static List<double> GetSuccessiveHSpeeds(double hSpeed)
  153.     {
  154.         List<double> output = new List<double>();
  155.         for (int numJumps = 1; numJumps <= 3; numJumps++)
  156.         {
  157.             for (int numDusts = 0; numDusts <= numJumps * 3 + 3; numDusts++)
  158.             {
  159.                 double value = hSpeed * Math.Pow(0.8, numJumps) * Math.Pow(0.98, numDusts);
  160.                 if (value > -200_000) continue;
  161.                 output.Add(value);
  162.             }
  163.         }
  164.         return output;
  165.     }
  166.  
  167.     public static List<MarioPuState> GetSuccessiveStates(MarioPuState state)
  168.     {
  169.         List<double> hSpeeds = GetSuccessiveHSpeeds(state.HSpeed);
  170.         return hSpeeds.ConvertAll(
  171.             hSpeed => new MarioPuState(state.X, state.Y, state.Z, hSpeed, state.Angle, state, state.Index));
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment