Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- final class RFHumpRoute
- {
- // Either TrackNumber
- public int TrackNumber = -1;
- public int MarkerId;
- // Or Junction Left Right
- public int JnId = -1;
- public RFHumpRoute Left;
- public RFHumpRoute Right;
- };
- final class RFHumpRouter
- {
- public RFHumpController Controller;
- int ops = 0;
- final void IncOps()
- {
- if (++ops >= 10000) {
- ops = 0;
- Router.GetCurrentThreadGameObject().Sleep(0.01f);
- }
- }
- final int GetJunctionDirectionToObject(Junction jnc, MapObject origin)
- {
- int i, ret;
- for(i = 0; i < 4; i++){
- GSTrackSearch gs;
- switch (i) {
- default:
- case 0: ret = Junction.DIRECTION_BACKWARD; break;
- case 1: ret = Junction.DIRECTION_LEFT; break;
- case 2: ret = Junction.DIRECTION_RIGHT; break;
- case 2: ret = Junction.DIRECTION_FORWARD; break;
- }
- gs = jnc.BeginTrackSearch(ret);
- MapObject found;
- while((found = gs.SearchNext()) and !found.isclass(Junction) and found != origin) {
- Trackside trackside = cast <Trackside> found;
- if(gs.GetDistance() >= 5000.0 and trackside)
- gs = trackside.BeginTrackSearch(gs.GetFacingRelativeToSearchDirection());
- IncOps();
- }
- if(found == origin)
- return ret;
- }
- return Junction.DIRECTION_NONE;
- }
- RFHumpRoute Scan(GSTrackSearch it, MapObject origin)
- {
- MapObject found;
- while (found = it.SearchNext()) {
- Trackside marker;
- Junction junc;
- if (marker = cast <Trackside> found) {
- Soup props = marker.GetProperties();
- if (props.GetNamedTagAsInt("rfhumpmarker", 0) == 1) {
- int trackNum = props.GetNamedTagAsInt("rfhumpmarker.track-number", -1);
- RFHumpRoute ret = new RFHumpRoute();
- ret.TrackNumber = trackNum;
- ret.MarkerId = marker.GetId();
- return ret;
- }
- }
- else if (junc = cast <Junction> found) {
- int dir = GetJunctionDirectionToObject(junc, origin);
- switch (dir) {
- case Junction.DIRECTION_BACKWARD: {
- RFHumpRoute ret = new RFHumpRoute();
- ret.JnId = junc.GetId();
- ret.Left = Scan(junc.BeginTrackSearch(Junction.DIRECTION_LEFT), junc);
- ret.Right = Scan(junc.BeginTrackSearch(Junction.DIRECTION_RIGHT), junc);
- return ret;
- }
- case Junction.DIRECTION_LEFT:
- case Junction.DIRECTION_RIGHT:
- case Junction.DIRECTION_FORWARD:
- return Scan(junc.BeginTrackSearch(Junction.DIRECTION_BACKWARD), junc);
- default:
- case Junction.DIRECTION_NONE: return null;
- }
- }
- IncOps();
- }
- return null;
- }
- public void Run()
- {
- RFHumpRoute root = Scan(Controller.BeginTrackSearch(true), Controller);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement