File: layout_overlapping_boxes.des

package info (click to toggle)
crawl 2%3A0.34.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 100,188 kB
  • sloc: cpp: 363,709; ansic: 27,765; javascript: 9,516; python: 8,463; perl: 3,293; java: 3,132; xml: 2,380; makefile: 1,835; sh: 611; objc: 250; cs: 15; sed: 9; lisp: 3
file content (65 lines) | stat: -rw-r--r-- 2,478 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
##############################################################
# layout_overlapping_boxes
#
# This layout places many overlapping boxes and then connects
#  the resulting mess into a layout.  The boxes are aligned on
#  a grid of "blocks" so that they line up nicely.  It comes
#  out looking like a more regular form of layout_subdivisions
#  with some of the rooms connected into open areas.
#

: crawl_require("dlua/layout/zonify.lua")
: crawl_require("dlua/layout/minimum_map_area.lua")

NAME:   layout_overlapping_boxes
DEPTH:  Dis:1-6
WEIGHT: 5
ORIENT: encompass
TAGS:   overwritable layout allow_dup unrand layout_type_divisions
TAGS:   no_rotate no_vmirror no_hmirror
{{
    local gxm, gym = dgn.builder_bounds()
    extend_map{width = gxm, height = gym, fill="x"}

    -- block sizes 2-4 (top) to 4-6 (bottom)
    local depth_frac = you.depth_fraction()
    local block_size = math.floor(2 + depth_frac * 2 + crawl.random_real() * 3)

    -- minimum sum must always be 2 for 1x1 rooms
    local count_sum_min = math.max(2, math.floor(8 + depth_frac * 2
                                                   - block_size))
    local count_sum_max = math.floor(12 + depth_frac * 3 - block_size * 2)

    local blocks_across_x = math.floor((gxm - 17) / block_size)
    local blocks_across_y = math.floor((gym - 17) / block_size)
    local start_x = gxm / 2 - math.floor((blocks_across_x * block_size) / 2)
    local start_y = gym / 2 - math.floor((blocks_across_y * block_size) / 2)

    -- add a whole bunch of overlapping rooms
    for i = 1, 200 do
        local count_sum = crawl.random_range(count_sum_min, count_sum_max)
        local count_x = crawl.random_range(1, count_sum - 1)
        local count_y = count_sum - count_x

        local block_x = crawl.random_range(0, blocks_across_x - count_x)
        local block_y = crawl.random_range(0, blocks_across_y - count_y)

        local x1 = start_x + block_x * block_size
        local y1 = start_y + block_y * block_size
        local x2 = x1      + count_x * block_size
        local y2 = y1      + count_y * block_size

        make_box { x1 = x1, y1 = y1, x2 = x2, y2 = y2,
                   wall = 'x', floor = '.' }
    end

    connect_adjacent_rooms { wall = "x", floor = ".", replace = '+',
                             max = 1000 }
    zonify.map_fill_zones(_G, 1, 'x')
}}
# Enforce minimum floor size
validate {{
    return minimum_map_area.is_map_big_enough(_G, minimum_map_area.DIVISIONS)
}}
MAP
ENDMAP