地图生成机制:地图结构
先确定地图上下长度。联机的长度会比单机少一个房间,三层下来少了三个房间。地图节点会排布在长度乘左右宽度7的网格上。

接下来生成地图节点和路径。先生成初始房间紧接着的第一个行(GetOrCreatePoint(column, row): 如果第column列,第row行还没有节点,就在此处创建一个并返回。如果已经有了,直接返回该节点。行数从初始房间为0数起,直到GetRowCount()为第一个Boss房):在7列之间随机创建或取已有节点并从该节点出发生成路径重复七次。第二次必然会在还没有节点的位置新创建一个节点,所以初始房间出发应当至少有两条路能走(虽然但是,我印象里打过不止一局先古之民出去只有一个点能走的情况,不知道为什么)。

生成路径:从某个点出发,生成一条直到Boss房之前的路径。对于这条路径最前端的点a,列出其左、中、右三个点,如果a已经在最左,则左点会与中点重复,如果a已经在最右,右点与中点重复。然后把这三个点打乱顺序之后一个一个看是否有与已有路径冲突的,防止出现交叉路径,将第一个没有冲突的点作为这条路径的下一个点。
重复创建7次初始点并从初始点生成路径之后,再将所有初始点与初始先古遗民房间连接起来,末端点与Boss房连接起来,地图结构就确定了


确定结构之后,就是给这些点确定房间类型。Boss房前必定是火堆,Boss房前第7行的房间必定是宝箱,出发的第一行必定是小怪。接下来创建一个房间类型列表,往表里塞上一楼讲的房间数量,比如8个精英,3个商店……然后把所有未确定类型的房间打乱,一个一个赋予房间类型,直到所有特殊类型房间被赋完,再将余下所有点填上小怪。
赋予房间类型的时候会检查是否合法。以下是所有不允许的形状:
前4步(不包括先古遗民房)不能有精英和火堆
最后3行的房间除了Boss前火堆之外不能有其他火堆
精英、火堆、商店、宝箱房不能和相同类型的房间连接
精英、火堆、商店、问号、小怪不能有和自己相同类型的同胞节点。简单但不全面地说就是不能有分岔路左右都是精英、火堆、商店、问号、小怪中的一种相同类型(因为小怪是最后填上去的,所以小怪其实没有这个限制)。更全面的说法是,如果有多个节点a, b的下一步可以走到子节点c, c的类型是精英,那么a, b的所有其他子节点都不能是精英。
