public GameObject instantiate_environment(GameObject environmentObject, Pos pos, bool traversable = true)
    {
        int randomY = rng.Next(1, 4) * 90;

        // detect whether this object is a prefab or has already been spawned
        if (environmentObject.scene.name != null)
        {
            environmentObject.transform.position = grid_to_world(pos);
            environmentObject.transform.rotation = Quaternion.Euler(new Vector3(0, randomY, 0));
        }
        else
        {
            environmentObject = Instantiate(environmentObject, grid_to_world(pos), Quaternion.Euler(new Vector3(0, randomY, 0)));
        }

        DungeonObject env = environmentObject.GetComponent <DungeonObject>();

        (env as Environment).init_environment(pos);

        if (!traversable)
        {
            nav_map.removeTraversableTile(pos);
            map[pos.x, pos.y].traversable = true;
            map[pos.x, pos.y].occupied    = true;
            map[pos.x, pos.y].resident    = env;
        }
        else
        {
            nav_map.insertTraversableTile(pos);
            map[pos.x, pos.y].traversable = true;
            map[pos.x, pos.y].occupied    = false;
            map[pos.x, pos.y].environment = env;
        }

        return(environmentObject);
    }