Advertisement
agmike

LTrackSearch

Aug 22nd, 2014
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.64 KB | None | 0 0
  1.  
  2. include "lutil.gs"
  3.  
  4.  
  5. class LTrackSearchCursor
  6. {
  7.     public bool EndOfTrack() { return true; }
  8.     public object GetObject() { return null; }
  9.     public bool GetFacing() { return false; }
  10.     public float GetDistance() { return 0.0f; }
  11. };
  12.  
  13.  
  14. class LTrackSearchObserver
  15. {
  16.     public GSTrackSearch Begin() { return cast <GSTrackSearch> null; }
  17.     public bool Next(LTrackSearchCursor cursor) { return false; }
  18.     public void End(LTrackSearchCursor cursor) {}
  19. };
  20.  
  21.  
  22. final class LTrackSearchEngine isclass LTrackSearchCursor
  23. {
  24.     public float MaxSearchDistance = 5000.0f;
  25.     public float SearchRestartDistance = 5000.0f;
  26.    
  27.     public int SleepIterations = 10000;
  28.    
  29.     public LTrackSearchObserver Observer;
  30.     public GameObject Thread;
  31.    
  32.     public GSTrackSearch Search;
  33.  
  34.     public bool Run();
  35.    
  36.     public float TotalDistance = 0.0f;
  37.  
  38.    
  39.     // ****************************************************
  40.     //
  41.     //    I M P L E M E N T A T I O N
  42.     //
  43.     // ****************************************************
  44.  
  45.     int ops = 0;
  46.     bool eot = true;
  47.  
  48.     final void IncOps()
  49.     {
  50.         if (++ops >= SleepIterations) {
  51.             if (Thread)
  52.                 Thread.Sleep(0.0001f);
  53.             ops = 0;
  54.         }
  55.     }
  56.  
  57.     public bool Run()
  58.     {
  59.         if (!Observer or !(Search = Observer.Begin()))
  60.             return false;
  61.         float totalDistance = 0.0f;
  62.         eot = false;
  63.         bool hasNext;
  64.         while (hasNext = Search.SearchNextObject()) {
  65.             float distance = TotalDistance + Search.GetDistance();
  66.             if (distance > MaxSearchDistance)
  67.                 break;
  68.             if (!Observer.Next(me))
  69.                 break;
  70.             if(distance >= SearchRestartDistance) {
  71.                 Trackside obj = cast <Trackside> Search.GetObject();
  72.                 if (obj) {
  73.                     TotalDistance = distance;
  74.                     Search = obj.BeginTrackSearch(Search.GetFacingRelativeToSearchDirection());
  75.                 }
  76.             }
  77.             IncOps();
  78.         }
  79.         eot = !hasNext;
  80.         Observer.End(me);
  81.         return hasNext;
  82.     }
  83.    
  84.     public object GetObject()
  85.     {
  86.         if (Search)
  87.             return Search.GetObject();
  88.         return null;
  89.     }
  90.    
  91.     public bool GetFacing()
  92.     {
  93.         if (Search)
  94.             return Search.GetFacingRelativeToSearchDirection();
  95.         return false;
  96.     }
  97.    
  98.     public float GetDistance()
  99.     {
  100.         if (Search)
  101.             return Search.GetDistance() + TotalDistance;
  102.         return 0.0f;
  103.     }
  104.    
  105.     public bool EndOfTrack() { return eot; }
  106. };
  107.  
  108.  
  109. final static class LTrackSearch
  110. {
  111.     public bool Begin(LTrackSearchObserver observer, float maxDist, float restartDist, int sleepIters)
  112.     {
  113.         LTrackSearchEngine engine = new LTrackSearchEngine();
  114.         if (maxDist > 0.0f)
  115.             engine.MaxSearchDistance = maxDist;
  116.         if (restartDist > 0.0f)
  117.             engine.SearchRestartDistance = restartDist;
  118.         if (sleepIters > 0)
  119.             engine.SleepIterations = sleepIters;
  120.         engine.Observer = observer;
  121.         engine.Thread = Router.GetCurrentThreadGameObject();
  122.         return engine.Run();
  123.     }
  124.    
  125.     public bool Begin(LTrackSearchObserver observer, float maxDist, float restartDist)
  126.     {
  127.         LTrackSearchEngine engine = new LTrackSearchEngine();
  128.         if (maxDist > 0.0f)
  129.             engine.MaxSearchDistance = maxDist;
  130.         if (restartDist > 0.0f)
  131.             engine.SearchRestartDistance = restartDist;
  132.         engine.Observer = observer;
  133.         engine.Thread = null;
  134.         return engine.Run();
  135.     }
  136. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement