Esempio n. 1
0
    public override void OnEndDrag(PointerEventData eventData)
    {
        Vector2Int    final_tilemap_position = GameManager.get_selected_tile(eventData.position);
        Station_Track st           = TrackManager.get_station_from_location(final_tilemap_position, CityManager.Activated_City_Component);
        string        vehicle_type = clicked_item.tag;

        Destroy(clicked_item);
        if (GameManager.is_tutorial_mode)
        {
            bool is_wrong_place;
            if (vehicle_type == "train")
            {
                is_wrong_place = GameManager.tutorial_manager.is_click_in_wrong_place(final_tilemap_position, 4);
            }
            else
            {
                is_wrong_place = GameManager.tutorial_manager.is_click_in_wrong_place(final_tilemap_position);
            }
            if (is_wrong_place)
            {
                return;
            }
        }
        if (st == null)
        {
            return; // not a valid station
        }
        if (vehicle_type == "home" || vehicle_type == "work" || vehicle_type == "vacation" || vehicle_type == "food")
        {
            if (st.train == null || !st.train.GetComponent <Train>().is_wait_for_turntable || !st.train.GetComponent <Train>().is_boxcar_within_max_limit())
            {
                return; // no train at this station
            }
            VehicleManager.instance.add_boxcar_to_train(st.train.GetComponent <Train>(), vehicle_type);
        }
        else if (vehicle_type.Contains("train"))
        {
            RouteManager.Orientation train_orientation = TrackManager.flip_straight_orientation(st.station.orientation);

            VehicleManager.instance.create_vehicle_at_home_base(train_orientation, st);
        }
        else
        {
            throw new Exception("nto a valid vehicle type");
        }
        VehicleManager.update_vehicle_count(vehicle_type, -1); // "home", "food", "work", "vacation"
        update_inventory();
        if (VehicleManager.get_vehicle_count(vehicle_type) == 0)
        {
            RawImage raw_image = clicked_go.GetComponent <RawImage>();
            raw_image.texture = empty_inventory_bubble;
        }
    }
Esempio n. 2
0
 public void Start()
 {
     board_desire_timeout = 120;
     trip_desire_timeout  = 300;
     in_tile                = true;
     arrived_at_room        = true;
     is_egghead_thinking    = true;
     location               = "station";                     // person is spawned at station
     enter_home_orientation = RouteManager.Orientation.None; // initialized on enter home sequence
     final_dest_tile_pos    = new Vector3Int(-1, -1, 0);
     board_start_time       = Time.time;
     StartCoroutine(does_person_give_up());
 }
Esempio n. 3
0
    public bool hide_exit_route(RouteManager.Orientation orientation, City city, Tilemap exit_tilemap)
    {
        Vector3Int city_loc = city.get_location();
        Vector3Int loc;

        if (orientation == RouteManager.Orientation.North)
        {
            loc = new Vector3Int(city_loc.x, city_loc.y + 1, city_loc.z);
        }
        else if (orientation == RouteManager.Orientation.East)
        {
            loc = new Vector3Int(city_loc.x + 1, city_loc.y, city_loc.z);
        }
        else if (orientation == RouteManager.Orientation.West)
        {
            loc = new Vector3Int(city_loc.x - 1, city_loc.y, city_loc.z);
        }
        else if (orientation == RouteManager.Orientation.South)
        {
            loc = new Vector3Int(city_loc.x, city_loc.y - 1, city_loc.z);
        }
        else
        {
            throw new Exception("not a valid orientation");
        }
        Tilemap track_tilemap = TrackManager.instance.top_tilemap;
        Tile    tile_type     = (Tile)track_tilemap.GetTile(loc);

        if (tile_type == null) // todo: an additional check that exit track orientation is correct
        {
            exit_tilemap.GetComponent <TilemapRenderer>().enabled = false;
            return(true);
        }
        else
        {
            if ((orientation == RouteManager.Orientation.South && (tile_type.name == "vert" || tile_type.name == "WN" || tile_type.name == "NE")) ||
                (orientation == RouteManager.Orientation.North && (tile_type.name == "vert" || tile_type.name == "WS" || tile_type.name == "ES")) ||
                (orientation == RouteManager.Orientation.East && (tile_type.name == "hor" || tile_type.name == "WN" || tile_type.name == "WS")) ||
                (orientation == RouteManager.Orientation.West && (tile_type.name == "hor" || tile_type.name == "NE" || tile_type.name == "ES")))
            {
                exit_tilemap.GetComponent <TilemapRenderer>().enabled = true;
                return(false);
            }
            else
            {
                exit_tilemap.GetComponent <TilemapRenderer>().enabled = false;
                return(true);
            }
        }
    }
Esempio n. 4
0
 protected Vector2 transform_curve(Vector2 bezier_position, RouteManager.Orientation orientation, RouteManager.Orientation final_orientation)
 {
     // transform the coord of bezier curve so it matches shape of appropriate track
     if (orientation == RouteManager.Orientation.North && final_orientation == RouteManager.Orientation.East)
     {
         return(bezier_position);
     }
     else if ((orientation == RouteManager.Orientation.South && final_orientation == RouteManager.Orientation.East) ||
              final_orientation == RouteManager.Orientation.ne_SteepCurve || final_orientation == RouteManager.Orientation.ne_LessSteepCurve)
     {
         bezier_position[1] = -bezier_position[1];
     }
     else if ((orientation == RouteManager.Orientation.North && final_orientation == RouteManager.Orientation.West) ||
              final_orientation == RouteManager.Orientation.sw_SteepCurve || final_orientation == RouteManager.Orientation.sw_LessSteepCurve)
     {
         bezier_position[0] = -bezier_position[0];
     }
     else if ((orientation == RouteManager.Orientation.South && final_orientation == RouteManager.Orientation.West) ||
              final_orientation == RouteManager.Orientation.nw_SteepCurve || final_orientation == RouteManager.Orientation.nw_LessSteepCurve)
     {
         bezier_position[0] = -bezier_position[0];
         bezier_position[1] = -bezier_position[1];
     }
     else if (orientation == RouteManager.Orientation.East && final_orientation == RouteManager.Orientation.South)
     { // rotate curve 90 degrees counter clockwise
         float temp_x = bezier_position[0];
         bezier_position[0] = bezier_position[1];
         bezier_position[1] = -temp_x;
     }
     else if (orientation == RouteManager.Orientation.East && final_orientation == RouteManager.Orientation.North)
     {
         float temp_x = bezier_position[0];
         bezier_position[0] = bezier_position[1];
         bezier_position[1] = temp_x;
     }
     else if (orientation == RouteManager.Orientation.West && final_orientation == RouteManager.Orientation.South)
     {
         float temp_x = bezier_position[0];
         bezier_position[0] = -bezier_position[1];
         bezier_position[1] = -temp_x;
     }
     else if (orientation == RouteManager.Orientation.West && final_orientation == RouteManager.Orientation.North)
     {
         float temp_x = bezier_position[0];
         bezier_position[0] = -bezier_position[1];
         bezier_position[1] = temp_x;
     }
     return(bezier_position);
 }
Esempio n. 5
0
 public static float get_exit_dist(RouteManager.Orientation orientation)
 {
     if (orientation == RouteManager.Orientation.West || orientation == RouteManager.Orientation.East)
     {
         return(exit_dest_west_east);
     }
     else if (orientation == RouteManager.Orientation.North || orientation == RouteManager.Orientation.South)
     {
         return(exit_dest_north_south);
     }
     else
     {
         throw new Exception(orientation + " is not a valid exit destination");
     }
 }
Esempio n. 6
0
    public IEnumerator one_time_bezier_move(Boxcar prev_boxcar)
    {
        prev_boxcar.train.is_boxcar_filling_void = true;
        Vector3    prev_destination     = prev_boxcar.train_destination;
        Vector3Int prev_boxcar_position = prev_boxcar.tile_position;

        RouteManager.Orientation prev_orientation = prev_boxcar.orientation;
        yield return(StartCoroutine(bezier_move(transform, orientation, prev_boxcar.orientation)));

        orientation           = prev_orientation;
        tile_position         = prev_boxcar_position;
        next_tilemap_position = (Vector2Int)prev_boxcar_position;
        prev_tile_position    = prev_boxcar_position;
        train_destination     = prev_destination;
        prev_boxcar.train.is_boxcar_filling_void = false;
    }
Esempio n. 7
0
 public static RouteManager.Orientation is_curve_steep(RouteManager.Orientation orientation)
 {
     if (orientation == RouteManager.Orientation.ne_SteepCurve || orientation == RouteManager.Orientation.nw_SteepCurve ||
         orientation == RouteManager.Orientation.sw_SteepCurve || orientation == RouteManager.Orientation.se_SteepCurve)
     {
         return(RouteManager.Orientation.Steep_Angle);
     }
     else if (orientation == RouteManager.Orientation.ne_LessSteepCurve || orientation == RouteManager.Orientation.nw_LessSteepCurve ||
              orientation == RouteManager.Orientation.sw_LessSteepCurve || orientation == RouteManager.Orientation.se_LessSteepCurve)
     {
         return(RouteManager.Orientation.Less_Steep_Angle);
     }
     else
     {
         return(RouteManager.Orientation.Right_Angle);
     }
 }
Esempio n. 8
0
    public Station get_station_by_orientation(RouteManager.Orientation orientation)
    {
        switch (orientation)
        {
        case RouteManager.Orientation.East:
            return(East_Station);

        case RouteManager.Orientation.West:
            return(West_Station);

        case RouteManager.Orientation.North:
            return(North_Station);

        case RouteManager.Orientation.South:
            return(South_Station);
        }
        throw new Exception("not a valid orientation");
    }
Esempio n. 9
0
    public Station(Vector3Int outer_start, Vector3Int inner_start, RouteManager.Orientation orientation, Tilemap outer_track_tilemap, Tilemap inner_track_tilemap)
    {
        this.orientation = orientation;

        outer_track                = new Station_Track();
        outer_track.inner          = 0;
        outer_track.tilemap        = outer_track_tilemap;
        outer_track.start_location = outer_start;
        outer_track.train          = null;
        outer_track.station        = this;

        inner_track                = new Station_Track();
        inner_track.inner          = 1;
        inner_track.tilemap        = inner_track_tilemap;
        inner_track.start_location = inner_start;
        inner_track.train          = null;
        inner_track.station        = this;
    }
Esempio n. 10
0
    public void create_vehicle_at_home_base(RouteManager.Orientation orientation, Station_Track st)
    {
        // buying a new train in MenuManager
        train_counter++;
        GameObject new_train = Instantiate(Train);

        Train_List.Add(new_train);
        Train train_component = new_train.GetComponent <Train>();

        train_component.initialize_orientation(orientation);
        train_component.in_city = true;
        train_component.set_id(train_counter);
        train_component.set_city(CityManager.home_base); // new vehicles always created at home base
        place_vehicle(new_train);                        // place the vehicle, which proceeds to depart
        train_component.station_track = st;
        train_component.init_arrive_at_city(st);         // call immediately on instantiation. Otherwise, in_city = false and the wrong board is updated
        //st.train = new_train; BUG! If a train collides with one which is first
    }
Esempio n. 11
0
    public List <int[]> get_parking_list()
    {
        RouteManager.Orientation orientation = station_track.station.orientation;
        int          is_inner                 = station_track.inner; // 0 means no, 1 means yes
        List <int>   parking_coord            = TrackManager.parking_coord_map[orientation];
        int          y                        = parking_coord[0];
        int          start_x                  = parking_coord[1];
        int          end_x                    = parking_coord[2];
        List <int[]> valid_parking_coord_list = new List <int[]>();

        for (int i = start_x; i < end_x; i++)
        {
            if (city.gameobject_board[i, y] == null) // parking spot is available
            {
                valid_parking_coord_list.Add(new int[] { i, y });
            }
        }
        return(valid_parking_coord_list);
    }
Esempio n. 12
0
    public void click_room(PointerEventData eventData)
    {
        // get station
        // get adjacent boarding track
        // if train is on track, then search for appropriate boxcars on track
        all_eligible_boxcar = new List <Offset_Tile>();
        List <string> train_hint_list = new List <string>();
        Vector2Int    selected_tile   = GameManager.get_selected_tile(eventData.position);
        // get room, and check if it is occupied before boarding
        //get person
        Room   room             = CityManager.Activated_City_Component.get_selected_room(selected_tile);
        bool   is_room_occupied = CityManager.Activated_City_Component.is_selected_room_occupied(room);
        string building_type    = CityManager.Activated_City_Component.city_type;

        if (is_room_occupied)
        {
            Person person = room.person_go_instance.GetComponent <Person>();
            person.is_selected = true;
            Station cb_station = CityManager.Activated_City_Component.get_station_track(selected_tile).station;
            RouteManager.Orientation orientation = cb_station.orientation;
            bool is_outer_track_valid            = is_track_contain_valid_boxcar(true, cb_station, building_type);
            bool is_inner_track_valid            = is_track_contain_valid_boxcar(false, cb_station, building_type);
            if (is_outer_track_valid || is_inner_track_valid)
            {
                List <int[]> inner_outer_coord = new List <int[]>();
                if (is_outer_track_valid)
                {
                    List <int[]> available_outer_track_vehicle = filter_available_boxcar(TrackManager.add_to_train_coord_map[orientation][0], person);
                    inner_outer_coord.AddRange(available_outer_track_vehicle);
                }
                if (is_inner_track_valid)
                {
                    List <int[]> available_inner_track_vehicle = filter_available_boxcar(TrackManager.add_to_train_coord_map[orientation][1], person);
                    inner_outer_coord.AddRange(available_inner_track_vehicle);
                }
                List <List <int[]> > city_action_coord = new List <List <int[]> > {
                    inner_outer_coord
                };
                train_hint_list.Add("board");
                GameObject.Find("GameManager").GetComponent <GameManager>().mark_tile_as_eligible(city_action_coord, train_hint_list, gameObject, true);
            }
        }
    }
Esempio n. 13
0
    public Station_Track add_train_to_station(GameObject train_object, RouteManager.Orientation orientation)
    {
        switch (orientation)
        {
        case RouteManager.Orientation.North:
            return(South_Station.set_station_track(train_object));

        case RouteManager.Orientation.East:
            return(West_Station.set_station_track(train_object));

        case RouteManager.Orientation.West:
            return(East_Station.set_station_track(train_object));

        case RouteManager.Orientation.South:
            return(North_Station.set_station_track(train_object));

        default:
            return(null);
        }
    }
Esempio n. 14
0
    public static RouteManager.Orientation flip_straight_orientation(RouteManager.Orientation orientation)
    {
        switch (orientation)
        {
        case RouteManager.Orientation.East:
            return(RouteManager.Orientation.West);

        case RouteManager.Orientation.West:
            return(RouteManager.Orientation.East);

        case RouteManager.Orientation.North:
            return(RouteManager.Orientation.South);

        case RouteManager.Orientation.South:
            return(RouteManager.Orientation.North);

        default:
            return(RouteManager.Orientation.None);
        }
    }
Esempio n. 15
0
    public IEnumerator turn_turntable(GameObject train_object, RouteManager.Orientation end_orientation, bool depart_for_turntable, City city = null)
    {
        ////print("end orientation of turntable is " + end_orientation);
        float turn_angle  = get_turntable_rotation(end_orientation);
        float t_param     = 0;
        float start_angle = transform.eulerAngles.z;
        float end_angle   = start_angle + turn_angle;

        while (t_param < 1)
        {
            t_param += Time.deltaTime * turntable_speed_multiplier;
            float angle = Mathf.LerpAngle(start_angle, end_angle, t_param);
            transform.eulerAngles = new Vector3(0, 0, angle);
            yield return(new WaitForEndOfFrame());
        }
        Train train = train_object.GetComponent <Train>();

        train.GetComponent <CapsuleCollider2D>().size = new Vector2(.205f, .837f);
        train.board_turntable(end_orientation, depart_for_turntable, city);
    }
Esempio n. 16
0
    public static bool is_exit_route_shown(RouteManager.Orientation orientation)
    {
        //todo
        switch (orientation)
        {
        case RouteManager.Orientation.North:
            return(RouteManager.exit_north_tilemap.GetComponent <TilemapRenderer>().enabled);

        case RouteManager.Orientation.East:
            return(RouteManager.exit_east_tilemap.GetComponent <TilemapRenderer>().enabled);

        case RouteManager.Orientation.West:
            return(RouteManager.exit_west_tilemap.GetComponent <TilemapRenderer>().enabled);

        case RouteManager.Orientation.South:
            return(RouteManager.exit_south_tilemap.GetComponent <TilemapRenderer>().enabled);

        default:
            return(false);
        }
    }
Esempio n. 17
0
    public void unload_train(GameObject boxcar_go, Vector2Int room_position)
    {
        Boxcar boxcar = boxcar_go.GetComponent <Boxcar>();
        Person person = boxcar.passenger_go.GetComponent <Person>();

        person.offset_map    = RouteManager.offset_route_map[boxcar.station_track.start_location];
        person.is_enter_home = true;
        Room   room       = city_room_matrix[room_position.x, room_position.y];
        string track_name = RouteManager.shipyard_track_tilemap.GetTile(boxcar.tile_position).name;

        try
        {
            //print("boxcar track loc " + boxcar.station_track.start_location + " track name is " + track_name);
            RouteManager.Orientation exit_orientation = CityManager.station_track_unloading_map[boxcar.station_track.start_location][track_name];
            StartCoroutine(GameObject.Find("PersonRouteManager").GetComponent <PersonRouteManager>().unload_train(boxcar, room, exit_orientation));
        }
        catch (KeyNotFoundException k)
        {
            print("exit orientation not found");
        }
    }
Esempio n. 18
0
    public IEnumerator one_time_straight_move(Boxcar prev_boxcar)
    {
        prev_boxcar.train.is_boxcar_filling_void = true;
        Vector3Int prev_boxcar_position = prev_boxcar.tile_position;

        //Vector3Int prev_boxcar_prev_tile_position = prev_boxcar.prev_tile_position;
        //Vector2Int prevboxcar_next_tilemap_position = prev_boxcar.next_tilemap_position;
        RouteManager.Orientation prev_orientation = prev_boxcar.orientation;
        Vector3 prev_destination = prev_boxcar.train_destination;

        //one_time_move_pass = true; // lets boxcar move  even though train hasnt departed yet.
        yield return(StartCoroutine(simple_straight_move(transform.position, prev_boxcar.transform.position))); // dont set new positions until movement is completed

        //one_time_move_pass = false;
        tile_position         = prev_boxcar_position;
        next_tilemap_position = (Vector2Int)prev_boxcar_position;
        prev_tile_position    = prev_boxcar_position;
        orientation           = prev_orientation;
        train_destination     = prev_destination;
        prev_boxcar.train.is_boxcar_filling_void = false;
    }
Esempio n. 19
0
    public virtual void set_initial_rotation(RouteManager.Orientation orientation)
    {
        switch (orientation)
        {
        case RouteManager.Orientation.North:
            angle = 0;
            break;

        case RouteManager.Orientation.East:
            angle = -90;
            break;

        case RouteManager.Orientation.West:
            angle = 90;
            break;

        case RouteManager.Orientation.South:
            angle = 180;
            break;
        }
    }
Esempio n. 20
0
    public override void set_initial_rotation(RouteManager.Orientation orientation)
    {
        switch (orientation)
        {
        case RouteManager.Orientation.North:
            transform.eulerAngles = new Vector3(0, 0, 0);
            break;

        case RouteManager.Orientation.East:
            transform.eulerAngles = new Vector3(0, 0, -90);
            break;

        case RouteManager.Orientation.West:
            transform.eulerAngles = new Vector3(0, 0, 90);
            break;

        case RouteManager.Orientation.South:
            transform.eulerAngles = new Vector3(0, 0, 180);
            break;
        }
    }
Esempio n. 21
0
    public IEnumerator move_checkpoints(List <Checkpoint> checkpoint_list)
    {
        Person person = gameObject.GetComponent <Person>();

        ////print("begin moving " + gameObject.name + " to checkpoints");
        for (int i = 0; i < checkpoint_list.Count; i++)
        {
            Checkpoint cp = checkpoint_list[i];
            if (cp.animation_clip != "none") // animation has changed
            {
                ////print("set animation clip " + cp.animation_clip);
                // flip here
                if (cp.animation_clip == "player_idle_hor" || cp.animation_clip == "player_walk_hor")
                {
                    if (cp.end_orientation == RouteManager.Orientation.West)
                    {
                        gameObject.GetComponent <SpriteRenderer>().flipX = true;
                    }
                    else if (cp.end_orientation == RouteManager.Orientation.East)
                    {
                        gameObject.GetComponent <SpriteRenderer>().flipX = false;
                    }
                    else
                    {
                        throw new Exception("cant have a up or down orientation for hor animation");
                    }
                }
                yield return(StartCoroutine(set_animation_clip(cp.animation_clip)));
            }
            Vector2 checkpoint_position = cp.dest_pos;
            tile_position     = (Vector3Int)cp.tile_position;
            angle             = cp.final_angle;
            orientation       = cp.end_orientation;
            final_orientation = orientation;
            yield return(StartCoroutine(straight_move(transform.position, checkpoint_position)));

            person.tile_position = tile_position; // update tile position
        }
        person.next_tilemap_position = (Vector2Int)person.tile_position;
    }
Esempio n. 22
0
    public bool is_train_on_track(RouteManager.Orientation orientation, bool get_outer)
    {
        Station_Track station_track;
        Station       station;

        switch (orientation)
        {
        case RouteManager.Orientation.North:
            station = North_Station;
            break;

        case RouteManager.Orientation.East:
            station = East_Station;
            break;

        case RouteManager.Orientation.West:
            station = West_Station;
            break;

        case RouteManager.Orientation.South:
            station = South_Station;
            break;

        default:
            throw new Exception("nota  valid orientation for station");
        }
        if (get_outer)
        {
            station_track = station.outer_track;
        }
        else
        {
            station_track = station.inner_track;
        }
        if (station_track.train != null && station_track.train.GetComponent <Train>().is_boxcar_within_max_limit())
        {
            return(true);
        }
        return(false);
    }
Esempio n. 23
0
 public void set_angle_using_orientation(RouteManager.Orientation orientation)
 {
     if (orientation == RouteManager.Orientation.North)
     {
         orient_angle = 0;
     }
     else if (orientation == RouteManager.Orientation.East)
     {
         orient_angle = -90f;
     }
     else if (orientation == RouteManager.Orientation.West)
     {
         orient_angle = 90f;
     }
     else if (orientation == RouteManager.Orientation.South)
     {
         orient_angle = 180f;
     }
     else
     {
         throw new Exception("unable to set angle because orientation not recognized");
     }
 }
Esempio n. 24
0
    public virtual IEnumerator bezier_move(Transform location, RouteManager.Orientation orientation, RouteManager.Orientation final_orientation)
    {
        Vector2 position = location.position;
        float   t_param;

        t_param = 1;
        bool final_step = false;

        in_tile = true;
        // change animation clip
        string animation_name = PersonRouteManager.get_animation_from_orientation(final_orientation, "walk");

        StartCoroutine(set_animation_clip(animation_name));
        while (!final_step)
        {
            if (PauseManager.game_is_paused)
            {
                yield return(new WaitForEndOfFrame());

                continue;
            }
            t_param -= Time.deltaTime * speed;

            if (t_param < 0) // set t_param to 0 to get bezier coordinates closer to the destination (and be within tolerance)
            {
                t_param    = 0;
                final_step = true;
            }
            next_position      = bezier_equation(t_param, TrackManager.offset_right_angle_inner_curve);
            next_position      = transform_curve(next_position, orientation, final_orientation) + position; //offset with current position
            transform.position = next_position;
            yield return(new WaitForEndOfFrame());
        }
        set_angle_using_orientation(final_orientation);
        in_tile = false;
    }
Esempio n. 25
0
    public void click_inventory(PointerEventData eventData)
    {
        // NOT GETTING CALLED
        selected_tile_pos = GameManager.get_selected_tile(eventData.position);
        selected_tile     = (Tile)inventory_tilemap.GetTile((Vector3Int)selected_tile_pos);
        if (selected_tile != null)
        {
            List <List <int[]> >       boxcar_action_coord      = new List <List <int[]> >();
            List <int[]>               valid_unloading_pos_list = new List <int[]>();
            Station_Track              station_track            = CityManager.Activated_City_Component.get_station_track(selected_tile_pos); // inner, outer doesnt matter
            RouteManager.Orientation[] orientation_list         = new RouteManager.Orientation[] { RouteManager.Orientation.North, RouteManager.Orientation.East, RouteManager.Orientation.West, RouteManager.Orientation.South };
            foreach (RouteManager.Orientation orientation in orientation_list)
            {
                List <List <int[]> > valid_boxcar_add_pos = TrackManager.add_to_train_coord_map[orientation];

                bool train_in_outer_track = CityManager.Activated_City_Component.is_train_on_track(orientation, true);
                bool train_in_inner_track = CityManager.Activated_City_Component.is_train_on_track(orientation, false);

                //concatenate lists of outer track and inner track positions
                if (train_in_outer_track)
                {
                    valid_unloading_pos_list.AddRange(valid_boxcar_add_pos[0]);
                }
                if (train_in_inner_track)
                {
                    valid_unloading_pos_list.AddRange(valid_boxcar_add_pos[1]);
                }
                boxcar_action_coord.Add(valid_unloading_pos_list);
            }
            List <string> hint_context_list = new List <string>()
            {
                "add"
            };
            GameObject.Find("GameManager").GetComponent <GameManager>().mark_tile_as_eligible(boxcar_action_coord, hint_context_list, gameObject, true);
        }
    }
Esempio n. 26
0
 public void board_turntable(RouteManager.Orientation orientation, bool depart_turntable, City city = null)
 {
     if (depart_turntable)
     {
         if (CityManager.Activated_City_Component == city)
         {
             GameManager.sound_manager.play_train_bell();
         }
         start_all_boxcar_at_turntable();
         halt_train(true, false);                       //unhalt the boxcars
         halt_train(is_halt = false, is_pause = false); // unpause the train
         is_train_departed_for_turntable = true;
         city.remove_train_from_station(gameObject);
     }
     else // leaving the turntable
     {
         leave_city = true;
         foreach (GameObject boxcar_object in boxcar_squad)
         {
             Boxcar boxcar = boxcar_object.GetComponent <Boxcar>();
             boxcar.leave_city = true;
         }
     }
 }
Esempio n. 27
0
    public static float get_orientation_angle(RouteManager.Orientation orientation)
    {
        float final_angle = -1;

        switch (orientation)
        {
        case RouteManager.Orientation.North:
            final_angle = 90;
            break;

        case RouteManager.Orientation.East:
            final_angle = 0;    // random_algos.degree_to_radian(-90);
            break;

        case RouteManager.Orientation.West:
            final_angle = 180;    // random_algos.degree_to_radian(90);
            break;

        case RouteManager.Orientation.South:
            final_angle = 270;    // random_algos.degree_to_radian(180);
            break;
        }
        return(final_angle);
    }
Esempio n. 28
0
    public IEnumerator Make_All_Boxcars_Depart(GameObject[,] board, List <GameObject> boxcar_list, Train train)
    {
        // start coroutine when a train departs or arrives at a city
        int boxcar_count     = boxcar_list.Count;
        int boxcar_depart_id = 0; // counter
        // 1. train departs
        // 2. train is placed in city tile
        // 3. train calls Boxcar Depart Coroutine
        // 4. train moves to city boundary
        // 5. train updates tile position
        // 6. train confirms end of track is next tile
        // 7. train stops and tells boxcars to stop
        Vector3Int last_location = train.tile_position;

        ////print("train last location is " + last_location);
        RouteManager.Orientation depart_orientation = train.orientation;
        MovingObject             last_vehicle       = train;

        if (train.in_city)
        {
            board = train.get_city().city_board;
        }
        while (boxcar_depart_id < boxcar_count)
        {
            if (boxcar_depart_id >= boxcar_list.Count)
            {
                break;
            }
            GameObject boxcar = boxcar_list[boxcar_depart_id];
            if (boxcar == null)
            {
                yield break; // the boxcar collidd with another train while entering city.
            }
            Boxcar moving_boxcar = boxcar.GetComponent <Boxcar>();

            if (!is_vehicle_in_cell(last_location, board) && moving_boxcar.in_city == last_vehicle.in_city && !moving_boxcar.is_pause) // dont depart until boxcar has arrived at city
            {
                if (moving_boxcar.in_city && moving_boxcar.city != last_vehicle.city)
                {
                    yield return(new WaitForEndOfFrame());

                    continue;
                }
                last_vehicle            = moving_boxcar;
                moving_boxcar.departing = false; // reset departing
                //print("Make Boxcar depart. boxcar orientation is " + moving_boxcar.get_orientation() + " new tile position is " + last_location + "old tile position is " + moving_boxcar.tile_position);
                moving_boxcar.set_depart_status(true);
                if (train.in_city)
                {
                    moving_boxcar.receive_train_order = true;
                }
                moving_boxcar.tile_position = last_location;
                place_vehicle(boxcar);
                moving_boxcar.is_halt = false;
                spawn_moving_object(moving_boxcar);
                moving_boxcar.set_depart_status(false);
                boxcar_depart_id++;
                game_manager.enable_vehicle_for_screen(boxcar); // switch on when boxcar is departing from the city. Dont show entire train cargo.
                //board[last_location.x, last_location.y] = boxcar.gameObject;
            }
            yield return(new WaitForEndOfFrame());
        }
    }
Esempio n. 29
0
    public void set_signal_from_exit_route(Vector3Int city_tile_position, Traffic_Light_Loc traffic_light_loc)
    {
        bool    exit_route_is_shown = CityManager.is_exit_route_shown(traffic_light_loc.orientation);
        Tilemap toggled_tilemap     = TrackManager.instance.top_tilemap;

        tile_position = (Vector3Int)RouteManager.get_depart_tile_position(traffic_light_loc.orientation, city_tile_position);
        if (!exit_route_is_shown) // no route exists, dont show signal
        {
            change_traffic_signal_tile(Traffic_Light.None, traffic_light_loc);
            return;
        }
        HashSet <Vector3Int> seen_track_tile_set = new HashSet <Vector3Int>(); // keep track of tracks to discover loop routes

        // used by traffic lights to warn of incoming trains etc.
        final_orientation = traffic_light_loc.orientation;
        Traffic_Light signal     = Traffic_Light.Green;
        int           tile_count = 0;

        while (true)
        {
            tile_count      += 1;
            this.orientation = final_orientation; // updating the orientation at every new tile
            if (seen_track_tile_set.Contains(tile_position))
            {
                ////print("yellow warning for orientation " + orientation + " this route contains loop");
                signal = update_signal(signal, Traffic_Light.Yellow); // warning, this route contains a loop
                break;
            }
            seen_track_tile_set.Add(tile_position);
            GameObject vehicle_go = VehicleManager.vehicle_board[tile_position.x + 1, tile_position.y + 1]; // remove offset
            if (!tile_position.Equals(city_tile_position) && vehicle_go != null)
            {
                ////print("RED warning for orientation " + orientation + " vehicle " + vehicle_go.name + " found at " + tile_position);
                signal = update_signal(signal, Traffic_Light.Red); // is train enroute? . If YES return RED todoed
            }
            PositionPair position_pair;
            Vector2      no_offset = new Vector2(0, 0);
            position_pair         = RouteManager.get_destination(this, toggled_tilemap, no_offset); // set the final orientation and destination
            next_tilemap_position = position_pair.tile_dest_pos;                                    // discard abs pos information
            tile_position         = new Vector3Int(next_tilemap_position.x, next_tilemap_position.y, 0);
            if (is_end_of_track())
            {
                GameObject city_object = CityManager.instance.get_city(next_tilemap_position);
                if (city_object == null) // end of track
                {
                    ////print("yellow warning for orientation " + orientation + " this route does not end at a city");
                    signal = update_signal(signal, Traffic_Light.Yellow);
                    break;
                }
                else // is a city, find station
                {
                    // return green or red depending on whether another train station is full todoed
                    // return city_object;
                    City city = city_object.GetComponent <City>();
                    RouteManager.Orientation flipped_final_orientation = TrackManager.flip_straight_orientation(final_orientation);
                    Station incoming_station  = city.get_station_by_orientation(flipped_final_orientation);
                    bool    station_available = incoming_station.is_station_track_available();
                    if (station_available)
                    {
                        ////print("GREEN for orientation " + orientation + " stations available GOOD TO GO");
                        signal = update_signal(signal, Traffic_Light.Green);
                    }
                    else
                    {
                        ////print("RED warning for orientation " + orientation + " the destination city has no available tracks");
                        signal = update_signal(signal, Traffic_Light.Red);
                    } // station track is not available
                    break;
                }
            }
        }
        change_traffic_signal_tile(signal, traffic_light_loc);
    }
Esempio n. 30
0
 public Traffic_Light_Loc(Vector2Int tile_pos, Tilemap traffic_tilemap, RouteManager.Orientation orientation)
 {
     this.tile_pos        = (Vector3Int)tile_pos;
     this.traffic_tilemap = traffic_tilemap;
     this.orientation     = orientation;
 }