Advertisement
agmike

RFHumpController: Routing

Aug 19th, 2014
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.34 KB | None | 0 0
  1. final class RFHumpRoute
  2. {
  3.     // Either TrackNumber
  4.     public int TrackNumber = -1;
  5.     public int MarkerId;
  6.     // Or Junction Left Right
  7.     public int JnId = -1;
  8.     public RFHumpRoute Left;
  9.     public RFHumpRoute Right;
  10. };
  11.  
  12.  
  13. final class RFHumpRouter
  14. {
  15.     public RFHumpController Controller;
  16.     int ops = 0;
  17.  
  18.     final void IncOps()
  19.     {
  20.         if (++ops >= 10000) {
  21.             ops = 0;
  22.             Router.GetCurrentThreadGameObject().Sleep(0.01f);
  23.         }
  24.     }
  25.  
  26.     final int GetJunctionDirectionToObject(Junction jnc, MapObject origin)
  27.     {
  28.         int i, ret;
  29.         for(i = 0; i < 4; i++){
  30.             GSTrackSearch gs;
  31.             switch (i) {
  32.                 default:
  33.                 case 0: ret = Junction.DIRECTION_BACKWARD; break;
  34.                 case 1: ret = Junction.DIRECTION_LEFT; break;
  35.                 case 2: ret = Junction.DIRECTION_RIGHT; break;
  36.                 case 2: ret = Junction.DIRECTION_FORWARD; break;
  37.             }
  38.             gs = jnc.BeginTrackSearch(ret);
  39.             MapObject found;
  40.             while((found = gs.SearchNext()) and !found.isclass(Junction) and found != origin) {
  41.                 Trackside trackside = cast <Trackside> found;
  42.                 if(gs.GetDistance() >= 5000.0 and trackside)
  43.                     gs = trackside.BeginTrackSearch(gs.GetFacingRelativeToSearchDirection());
  44.                 IncOps();
  45.             }
  46.             if(found == origin)
  47.                 return ret;
  48.         }
  49.         return Junction.DIRECTION_NONE;
  50.     }
  51.  
  52.     RFHumpRoute Scan(GSTrackSearch it, MapObject origin)
  53.     {
  54.         MapObject found;
  55.         while (found = it.SearchNext()) {
  56.             Trackside marker;
  57.             Junction junc;
  58.             if (marker = cast <Trackside> found) {
  59.                 Soup props = marker.GetProperties();
  60.                 if (props.GetNamedTagAsInt("rfhumpmarker", 0) == 1) {
  61.                     int trackNum = props.GetNamedTagAsInt("rfhumpmarker.track-number", -1);
  62.                     RFHumpRoute ret = new RFHumpRoute();
  63.                     ret.TrackNumber = trackNum;
  64.                     ret.MarkerId = marker.GetId();
  65.                     return ret;
  66.                 }
  67.             }
  68.             else if (junc = cast <Junction> found) {
  69.                 int dir = GetJunctionDirectionToObject(junc, origin);
  70.                 switch (dir) {
  71.                     case Junction.DIRECTION_BACKWARD: {
  72.                         RFHumpRoute ret = new RFHumpRoute();
  73.                         ret.JnId = junc.GetId();
  74.                         ret.Left = Scan(junc.BeginTrackSearch(Junction.DIRECTION_LEFT), junc);
  75.                         ret.Right = Scan(junc.BeginTrackSearch(Junction.DIRECTION_RIGHT), junc);
  76.                         return ret;
  77.                     }
  78.                    
  79.                     case Junction.DIRECTION_LEFT:
  80.                     case Junction.DIRECTION_RIGHT:
  81.                     case Junction.DIRECTION_FORWARD:
  82.                         return Scan(junc.BeginTrackSearch(Junction.DIRECTION_BACKWARD), junc);
  83.  
  84.                     default:
  85.                     case Junction.DIRECTION_NONE: return null;
  86.                 }
  87.             }
  88.             IncOps();
  89.         }
  90.         return null;
  91.     }
  92.    
  93.  
  94.     public void Run()
  95.     {
  96.         RFHumpRoute root = Scan(Controller.BeginTrackSearch(true), Controller);
  97.     }
  98. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement