Esempio n. 1
0
    public static void ChooseEntrancePoint(GenerationRandom genRan, BuildingVoxels vox, Building build, BuildingGenerationPlan plan, bool requiredSubworld = true)
    {
        Vec2i entranceSide = plan.EntranceSide;

        Vec2i mid  = new Vec2i(build.Width / 2, build.Height / 2);
        Vec2i entr = null;

        //Travel out iterativly till we reach the wall
        for (int r = 0; r < Mathf.Max(build.Width, build.Height); r++)
        {
            Vec2i v = mid + entranceSide * r;
            if (v.x < 0 || v.z < 0 || v.x >= build.Width || v.z >= build.Height)
            {
                break;
            }
            if (vox.GetVoxel(v.x, 1, v.z) != Voxel.none)
            {
                entr = v;
                break;
            }
        }

        if (entr == null)
        {
            entr = new Vec2i(2, 2);
        }
        build.SetEntrancePoint(entr);
        for (int y = 0; y < 4; y++)
        {
            vox.ClearVoxel(entr.x, y, entr.z);
        }
        if (requiredSubworld)
        {
            Door interior = new Door();
            interior.SetRotation(Vector2.Angle(Vector2.up, entranceSide));
            interior.SetPosition(entr);
            build.InternalEntranceObject = interior;
            AddObject(build, vox, interior, true);

            Door external = new Door();
            external.SetPosition(entr);
            external.SetRotation(Vector2.Angle(Vector2.up, entranceSide));

            build.ExternalEntranceObject = external;
            build.AddExternalObject(external);
        }
    }