Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / room / RoomInfo.cs
@小李xl 小李xl on 29 Aug 2023 7 KB 预生成房间数据

using System.Collections.Generic;
using Godot;

/// <summary>
/// 房间的数据描述
/// </summary>
public class RoomInfo : IDestroy
{
    public RoomInfo(int id, DungeonRoomType type, DungeonRoomSplit roomSplit)
    {
        Id = id;
        RoomType = type;
        RoomSplit = roomSplit;
    }

    /// <summary>
    /// 房间 id
    /// </summary>
    public int Id;

    /// <summary>
    /// 房间类型
    /// </summary>
    public DungeonRoomType RoomType;

    /// <summary>
    /// 层级, 也就是离初始房间间隔多少个房间
    /// </summary>
    public int Layer;
    
    /// <summary>
    /// 生成该房间使用的配置数据
    /// </summary>
    public DungeonRoomSplit RoomSplit;
    
    /// <summary>
    /// 房间大小, 单位: 格
    /// </summary>
    public Vector2I Size;

    /// <summary>
    /// 房间位置, 单位: 格
    /// </summary>
    public Vector2I Position;
    
    /// <summary>
    /// 门
    /// </summary>
    public List<RoomDoorInfo> Doors = new List<RoomDoorInfo>();

    /// <summary>
    /// 连接该房间的过道占用区域信息
    /// </summary>
    public List<Rect2I> AisleArea = new List<Rect2I>();

    /// <summary>
    /// 下一个房间
    /// </summary>
    public List<RoomInfo> Next = new List<RoomInfo>();
    
    /// <summary>
    /// 上一个房间
    /// </summary>
    public RoomInfo Prev;

    /// <summary>
    /// 当前房间使用的预设
    /// </summary>
    public RoomPreinstall RoomPreinstall;

    /// <summary>
    /// 当前房间归属区域
    /// </summary>
    public AffiliationArea AffiliationArea;

    /// <summary>
    /// 静态精灵绘制画布
    /// </summary>
    public RoomStaticImageCanvas StaticImageCanvas;

    /// <summary>
    /// 是否处于闭关状态, 也就是房间门没有主动打开
    /// </summary>
    public bool IsSeclusion { get; private set; } = false;
    
    public bool IsDestroyed { get; private set; }
    
    // private bool _beReady = false;
    // private bool _waveStart = false;
    // private int _currWaveIndex = 0;
    // private int _currWaveNumber = 0;
    //private List<ActivityMark> _currActivityMarks = new List<ActivityMark>();

    /// <summary>
    /// 获取房间的全局坐标, 单位: 像素
    /// </summary>
    public Vector2I GetWorldPosition()
    {
        return new Vector2I(
            Position.X * GameConfig.TileCellSize,
            Position.Y * GameConfig.TileCellSize
        );
    }

    /// <summary>
    /// 获取房间左上角的 Tile 距离全局坐标原点的偏移, 单位: 像素
    /// </summary>
    /// <returns></returns>
    public Vector2I GetOffsetPosition()
    {
        return RoomSplit.RoomInfo.Position.AsVector2I() * GameConfig.TileCellSize;
    }
    
    /// <summary>
    /// 获取房间横轴结束位置, 单位: 格
    /// </summary>
    public int GetHorizontalEnd()
    {
        return Position.X + Size.X;
    }

    /// <summary>
    /// 获取房间纵轴结束位置, 单位: 格
    /// </summary>
    public int GetVerticalEnd()
    {
        return Position.Y + Size.Y;
    }
    
    /// <summary>
    /// 获取房间横轴开始位置, 单位: 格
    /// </summary>
    public int GetHorizontalStart()
    {
        return Position.X;
    }

    /// <summary>
    /// 获取房间纵轴开始位置, 单位: 格
    /// </summary>
    public int GetVerticalStart()
    {
        return Position.Y;
    }

    /// <summary>
    /// 获取房间宽度, 单位: 像素
    /// </summary>
    public int GetWidth()
    {
        return Size.X * GameConfig.TileCellSize;
    }
    
    
    /// <summary>
    /// 获取房间高度, 单位: 像素
    /// </summary>
    public int GetHeight()
    {
        return Size.Y * GameConfig.TileCellSize;
    }
    
    public void Destroy()
    {
        if (IsDestroyed)
        {
            return;
        }

        IsDestroyed = true;
        foreach (var nextRoom in Next)
        {
            nextRoom.Destroy();
        }
        Next.Clear();
        if (RoomPreinstall != null)
        {
            RoomPreinstall.Destroy();
            RoomPreinstall = null;
        }

        // foreach (var activityMark in ActivityMarks)
        // {
        //     activityMark.QueueFree();
        // }
        // ActivityMarks.Clear();
        
        if (StaticImageCanvas != null)
        {
            StaticImageCanvas.Destroy();
        }
    }
    
    /// <summary>
    /// 房间准备好了, 准备刷敌人, 并且关闭所有门,
    /// 当清完每一波刷新的敌人后即可开门
    /// </summary>
    public void BeReady()
    {
        // //没有标记, 啥都不要做
        // if (ActivityMarks.Count == 0)
        // {
        //     _beReady = true;
        //     IsSeclusion = false;
        //     return;
        // }
        // IsSeclusion = true;
        // _waveStart = false;
        //
        // if (!_beReady)
        // {
        //     _beReady = true;
        //     //按照 WaveNumber 排序
        //     ActivityMarks.Sort((x, y) =>
        //     {
        //         return x.WaveNumber - y.WaveNumber;
        //     });
        // }
        //
        // //不是初始房间才能关门
        // if (RoomSplit.RoomInfo.RoomType != DungeonRoomType.Inlet)
        // {
        //     //关门
        //     foreach (var doorInfo in Doors)
        //     {
        //         doorInfo.Door.CloseDoor();
        //     }
        // }
        //
        // //执行第一波生成
        // NextWave();
    }

    /// <summary>
    /// 当前房间所有敌人都被清除了
    /// </summary>
    public void OnClearRoom()
    {
        // if (_currWaveIndex >= ActivityMarks.Count) //所有 mark 都走完了
        // {
        //     IsSeclusion = false;
        //     _currActivityMarks.Clear();
        //     //开门
        //     if (RoomSplit.RoomInfo.RoomType != DungeonRoomType.Inlet)
        //     {
        //         foreach (var doorInfo in Doors)
        //         {
        //             doorInfo.Door.OpenDoor();
        //         }
        //     }
        // }
        // else //执行下一波
        // {
        //     NextWave();
        // }
    }

    /// <summary>
    /// 返回当前这一波所有的标记的 Doing 函数是否执行完成
    /// </summary>
    public bool IsCurrWaveOver()
    {
        // for (var i = 0; i < _currActivityMarks.Count; i++)
        // {
        //     if (!_currActivityMarks[i].IsOver())
        //     {
        //         return false;
        //     }
        // }

        return true;
    }

    /// <summary>
    /// 执行下一轮标记
    /// </summary>
    private void NextWave()
    {
        // if (!_waveStart)
        // {
        //     _waveStart = true;
        //     _currWaveIndex = 0;
        //     _currWaveNumber = ActivityMarks[0].WaveNumber;
        // }
        // GD.Print("执行下一波, 当前: " + _currWaveNumber);
        //
        // _currActivityMarks.Clear();
        // //根据标记生成对象
        // for (; _currWaveIndex < ActivityMarks.Count; _currWaveIndex++)
        // {
        //     var mark = ActivityMarks[_currWaveIndex];
        //     if (mark.WaveNumber != _currWaveNumber) //当前这波已经执行完成了
        //     {
        //         _currWaveNumber = mark.WaveNumber;
        //         break;
        //     }
        //     else //生成操作
        //     {
        //         mark.BeReady(this);
        //         _currActivityMarks.Add(mark);
        //     }
        // }
    }
}