User Tools

Site Tools


dev:random-maps

Random Map Deployment Guide

Using random maps

Any exit with ”/!” as the destination map will generate a random map.

To specify random map parameters, you put parameters in the message field for the exit.

To use the standalone random map generator, you do this:

random_map inputfile <map path>

where inputfile is a plaintext file containing the map parameters, and map path is the destination of the generated map, relative to LIBDIR/maps.

How styles work

A “style” is usually a small map which contains only objects which define the “style”. For example, a monsterstyle “orc” might be a map generated with crossedit which has six orcs, a kobold, and a troll in it. When monsters are placed, the generator will randomly choose monsters from the “orc” style, and for this example, on average, it will generate 6 orcs/troll and 1 kobold/troll. So orcs will be very common, and there'll be occasional trolls and kobolds.

In principle, you may put any object in any style map. However, the map generator will do special things with the object depending on which directory it is in. Style maps are located in maps/styles/*, you may use crossedit to modify the style maps, or create new ones.

Parameters

Style Parameters

layoutstyle <style> (special!) Pick the layout style for the map. Currently, “rogue”, “spiral”, “maze”, “snake”, “onion”, and “squarespiral” are allowed. See below for more detail.
floorstyle <style> Load /styles/floorstyles/<style> and pick a random floortype from that style map for the random map. The entire map will be tiled with the floortype.
multiple_floors <0/1> If set to 1, different rooms of the map will have different floors (from the same map style though). This only works if there are doors and walls, as the filling uses them to find rooms.
wallstyle <style> Load /styles/wallstyles/<style> and pick a random walltype from that style for the random map. All the walls in the map will be of this type. The walls are modified on insertion so that players cannot go through them: this is expected for walls, but the random map generator makes sure of it. A <style> of “none” causes no walls or doors to be generated.
doorstyle <style> Load /styles/doorstyles/<style> and pick a random doortype from that style for the random map. A <style> of “none” causes no doors to generated.
exitstyle <style> Put one or two exits in the map, one leading back to the map where we entered from (origin_map, origin_x, origin_y), and, if appropriate, one leading to another, harder, random map. A style of “none” causes no exits to be generated.
decorstyle <style> Load /styles/decorstyles/<style> and pick the decor objects from that style to insert in the map. Decor objects are modified on insertion so that they do NOT block movement, regardless of the archetype. They are placed randomly. A style of “none” causes no decor objects to be generated.
monsterstyle <style> Load /styles/monsterstyles/<style>, if it exists. If it doesn't exist, then it will look for a directory of that name. If it finds a directory, it will choose a style based on dungeon_level. It will pick the style with the name <name>_# with the # closest to the dungeon_level. Monster objects are copied from the style map, so you may form style maps with modified monsters which are weaker or stronger than the default archetype.A style of “none” causes no monsters to be generated.
treasurestyle <style> (Special) If the style name chosen is contained in the lib/treasures file, it will use that for making treasures. If it is NOT in the lib/treasures file, it will look up /styles/treasurestyle/<style>, and pick random treasures from there. If <style> matches neither of these, it will generate treasures using the “chest” treasurelist. A style of “none” causes no treasures to be placed.

Layout parameters

xsize size of the map. If not set, random from 10 to 70
ysize size of the map. If not set, random from 10 to 70
expand2x Do we double the size of the layout? This has the effect of increasing the corridor widths by about 2x. Set it to a non-zero integer if this is desired.
symmetry <sym> Symmetry of the layout: You can cause the map generator to generate a symmetrical layout by using this flag. See below for more information

Symmetry value

value meaning
0 random symmetry
1 no symmetry
2 symmetry about the vertical centerline
3 symmetry about the horizontal centerline
4 both 2 and 3 symmetry

Available layouts options

Layout Style Parameter Value Effect
maze layoutoptions1 0 (default) Sparse maze: a maze with “rooms” will be made
maze layoutoptions1 1 Full maze: a maze with no “open” spaces will be made.

50% of the time a maze layout will be “doorified”, meaning that doors will be placed at random in the maze.

Layout Style Parameter Value Effect
onion layoutoptions1 0 (default) Pick random options
onion layoutoptions2 0 (default) Pick a random number of “onion layers”

See “Onion Rooms” below for the rest of the options.

Map generation parameters

Parameter Meaning
difficulty Set the map difficulty. Has no relation to the “difficulty” defined in common/*.c. If nonzero, this map and its descendants will have the same difficulty. If zero, it'll be set to the value of dungeon_level and incremeneted with each recursive map.
difficulty_increase Sets how fast the difficulty increases. This value is a float - the default value is 1.0. Reducing This only applies to map without a default difficulty set (but that could change in the future). For each level of a map, the difficulty is set to depth * difficulty_increase. Setting this parameter to 0.5 (or other values between 0 and 1) is a way to have deep dungeons that do not increase in difficulty all that rapidly.
dungeon_level Another way of setting the map difficulty. This has no relation to the “difficulty” defined in the common/*.c source code. The effect is to pick which monsters to use: for example, if the monsterstyle is “humanoid” and the dungeonlevel is 9, the style map /styles/monsterstyles/humanoid/humanoid_9 will be the style from which monsters are chosen. After the monsters are placed, the map difficulty is set according to the server's rule, for treasure purposes.
dungeon_depth
orientation How the exits look. See exit style below.
origin_x <You shouldn't need to set this> The exit which leads back from this map will go to this x.
origin_y Like origin_x
random_seed Set the random seed number used. This number completely determines the random numbers: a map with the same random seed and other parameters will always produce exactly the same map.
final_map When dungeon_level >= dungeon_depth, another exit isn't usually made. However, if final_map is set to a map's name, then an exit to this map will be made.
exit_on_final_map The default action is to place an exit on the final map. When explicitly set to 'no' this will not place a return exit on the final_map. If you use this setting YOU MUST PROVIDE A WAY BACK IN THE FINAL MAP!
final_exit_archetype If there is a final map, this field lets you specify the exact archetype to use for the final exit (trunk only).

Exit style

Value Meaning
0 random “orientation”
1 player arrives in the map at a “stairs up”, he goes to harder levels by finding a “stairs down”
2 reverse of 1
3-6 exits are horizontal. In the future these will be made to make exits to rightward, leftward, north and south.

Misc. Parameters

decoroptions <option>

Currently, ignored. Possibly in the future it will cause the decor to be patterned in some way, such as <put decor along walls> or <put decor in center of rooms>.

treasureoptions <opt>

Parameterizes how the treasure is placed and protected.

Value Meaning
0 Choose random treasure options
1 Concentrate the treasure on the map in a few locations
2 Hide the treasure behind hidden doors
4 put the treasure in a chest which must be unlocked (a key will be placed somewhere in the map, probably in a monster.)
8
16 Trap the treasure. A trap from /styles/trapstyles/traps is selected and inserted into the treasure chest.
32 Sparse treasure. 1/2 as much treasure is generated.
64 Rich treasure. 2x as much treasure is generated.

If option 1 is not set, options 2-16 are ignored. Options may be added together: treasureoptions 3 means treasure options 1 and 2 are set.

Map Layout styles

Onion Maps

Onion rooms are like this:

    regular			   random
    centered, linear onion:        bottom/right centered, nonlinear:

    #########################     #########################
    #                       #     #                       #
    # ########  ##########  #     #   #####################
    # #                  #  #     #   #                   #
    # # ######  ######## #  #     #   #                   #
    # # #              # #  #     #   #   ######## ########
    # # # ####  ###### # #  #     #   #   #               #
    # # # #          # # #  #     #   #   #               #
    # # # ############ # #  #     #   #   #  ########### ##
    # # #              # #  #     #   #   #  #            #
    # # ################ #  #     #   #   #  #    #########
    # #                  #  #     #       #  #    #       #
    # ####################  #     #   #   #  #            #
    #                       #     #   #   #  #    #       #
    #########################     ######################### 
Option Meaning
0 Pick random options below
1 “centered”
2 linear doors (default is nonlinear)
4 bottom “centered”
8 bottom-right centered
16 outer wall off: i.e., no outer wall.
32 irregularly/randomly spaced layers (default: regular)

Maze Maps

Maze maps are like this:

   A "sparse" maze::

    ########################################
    #   # # # #  #  #  #  #  #  #   #   #  #
    #         #  #  #     #  #  # # # # #  #
    ####   ## ## #  # ### #  ##   #   # # ##
    #  #####   # ## # # # ##  ### ##  ###  #
    ##              ### #  #       #       #
    #           ###     #  #    ####   ### #
    #           # ##    ## ##   #      # ###
    # ######    #  ###      #   # ##   #   #
    #      #   ##    ####   ##  #  #   # # #
    #  #  ##  ##  ##    ###  ## #  #   # # #
    #### ##  ##    ##     ##  ###  # ### ###
    #    #  ##      #####  #       ###     #
    ##  ##  #   ###     # ##              ##
    #  ##  ##  ## #    ## #           ###  #
    ## #   #   #  #    #  #           # ## #
    #  ### ### ## #   ## ##  ####    ##  # #
    ##   #   #  # #   #  #   #  #### #   ###
    #  ###  ## ## #   ## ##  ##    # ###   #
    ## #   ##  #  #    #  #   # # ##   #  ##
    #  #####  ## ## #### ##   # # #    ##  #
    ##        #  #  #    #   ## # ###      #
    #  # # #  #     # #  # #    #   #  # # #
    ########################################

   A "full" maze::

    ########################################
    #   #    # # #                 #       #
    #   # #  #   # # #  # # # # #    #  #  #
    ###   ## ##    ######## ### ### ### #  #
    #   # #     ##     #  ### ### #   ### ##
    # ##### ###  ##### ##         ## ## #  #
    #  #    # ## #   #  ##  ####   #  # # ##
    # #### ##  ### ####  # ##  ## ### # #  #
    #   #  #    #     #  ###    #   # #    #
    # ### ## ## ### ####      #### ## #  ###
    #  #  #  #    #  # ####  ##  # #  ## # #
    #  # ##  #### ##      # ##   # ##  #   #
    # ####  ## #   ### #### #  ### #  #### #
    #  #    #  # #   # #    # ##   #### #  #
    # #####   ####  ## ###    #  #      ## #
    #     ## ## #  ##    ##  ## ##### #  # #
    #  #   #  # ## #   #  # ##  # # ###  # #
    ## ### # ##  # # #### ###   # #   # ## #
    #  # # #    ## # #  #      ## ###   #  #
    ## # ####  ##  # #    ######  # # #### #
    #     # ####   # ######      ## ###  # #
    ### #      ## ##   #    # # ##         #
    #   #  # #    #  #    # # #    # #  #  #
    ########################################

Spiral Maps

   A Spiral Map::

    ###########################
    ###########################
    ########### D    ##########
    #########   ####   ########
    ########  ########  #######
    #######  ##########  ######
    ######  ############  #####
    ###### ####     #####D#####
    #####  ###  ###  ####  ####
    ##### #### #####  #### ####
    #####D#### ###### ####D####
    #####  ###  #C### #### ####
    ###### ####  >###D#### ####
    ######D########## ####D####
    ######  ########  ###  ####
    #######  ######  #### #####
    ######## D D  D ####  #####
    #################### ######
    ###################  ######
    #################   #######
    ################# <########
    ###########################
    ###########################

Values for layoutoptions1:

0 pick random options
1 Regular spiral: distance increases constantly with angle
2 Fine spiral: most coils possible are fit in
4 Fit Spiral: scale spiral to fit rectangular region (i.e., the spiral will look elliptical)

Rogue-like Maps

   A Rogue-like Map:

    ###############################
    #############       ###########
    #          ##       ###########
    #          DD       ###########
    #          ##       ###########
    #          ##       ####     ##
    #          #####D#######     ##
    #          D           D     ##
    ###D######D##### #######     ##
    ### ##       ###      ##     ##
    ###D D       ###       ###D####
    ### ##       D  D  <   ### ####
    ### ######D#####       ### ####
    ###D###### #####      #### ####
    ##    #### ##### #   ##### ####
    ##    #### ##### ######### ####
    ##    ####D##### ######### ####
    ##    ##     ### #     ### ####
    ##    ##     ### #     ###D####
    ##    ##     ### #     ###   ##
    ########     ### #     ###    #
    ########     D D D     ### >  #
    ########     #####     ###    #
    ########     #####     ###   ##
    ########     #####     ########
    ##################     ########
    ###############################

Available layoutoptions1:

0 pick random room shapes (i.e., mix it up)
1 Always use rectangular rooms
2 Always use “circular” rooms

Snake layouts

 No options are available for snake layouts.
 A player must touch every room to descend deeper in a snake.
 This is a basic snake layout::
  ############################
  #>                         #
  #                          #
  #                          #
  ##########################D#
  #                          #
  #                          #
  #                          #
  #D##########################
  #                          #
  #                          #
  #                          #
  ##########################D#
  #                          #
  #                          #
  #                          #
  #D##########################
  #                          #
  #                          #
  #                          #
  #                          #
  #                         <#
  ############################
 This is a roomified, xy-symmetric snake layout::
  ###################################
  #>       #     #   #     #       >#
  #        #     #   #     #        #
  ##D#######     D   D     #######D##
  #        #     #   #     #        #
  #        #     #   #     #        #
  #        D     # < #     D        #
  #        #     #   #     #        #
  #        #     #   #     #        #
  ##D#######     D   D     #######D##
  #        #     #   #     #        #
  #>       #     #   #     #       >#
  ###################################

Square spirals

 No options are available for square spirals
 A player must touch every room to descend in a square spiral.
 This is a basic square spiral layout::
  ###############################
  #   #                         #
  #   D                         #
  #   #####################D#####
  #   #   #               #     #
  #   #   #               #     #
  #   #   D               #     #
  #   #   #############D###     #
  #   #   #   #       #   #     #
  #   #   #   #       #   #     #
  #   #   #   D       #   #     #
  #   #   #   #####D###   #     #
  #   #   #   # > #   #   #     # 
  #   #   #   D   #   #   #     #
  #   #   #########   #   #     #
  #   #   #       D   #   #     #
  #   #   #       #   #   #     #
  #   #   D       #   #   #     #
  #   #################   #     #
  #   #               D   #     #
  #   #               #   #     #
  #   D               #   #     #
  #########################     #
  #                       D     #
  #                       #     #
  #                       #     #
  #<                      #     #
  ###############################
 This is an xy-symmetric  square spiral layout::
  #####################################
  #             #   <   #             #
  ##D##########D#       #D##########D##
  #  #    #     ####D####     #    #  #
  #  ###DD###   #       #   ###DD###  #
  #  #   #> #   ##D###D##   # >#   #  #
  #  #   ####D###       ###D####   #  #
  #  #   D      #       #      D   #  #
  #  ############D#####D############  #
  #  D                             D  #
  #  #                             #  #
  #  D                             D  #
  #  ############D#####D############  #
  #  #   D      #       #      D   #  #
  #  #   ####D###       ###D####   #  #
  #  #   #> #   ##D###D##   # >#   #  #
  #  ###DD###   #       #   ###DD###  #
  #  #    #     ####D####     #    #  #
  ##D##########D#       #D##########D##
  #             #   <   #             #
  ##################################### 

Example input file

layoutstyle onion
monsterstyle humanoid
dungeon_depth 3
xsize 15
ysize 15
exitstyle cstair
orientation 1
decorstyle furniture
floorstyle dirt
wallstyle wooden
symmetry 1

Reference

Below is the original proposal:

 Random Maps

  The major thing still missing from Crossfire, I think, is a good facility
for generating random maps:

  1.  They can be used by map creators to create a basic layout for his
quest or whatever, so that he need not start from a blank canvas.

  2.  Buildings with nothing else in them can have a random map in them.
In fact, we could have the same random map generated every time someone
enters a particular building (pick the seed off of the parent map name
and the entrance location!)  This would transform the world from finite
to infinite.

 Needed Features:

  Styles:

   Random maps would need to be "styled":  walls, doors, monsters, and other
decor should be picked from certain subsets of the total object set.  An inn
has a very different style than a castle, and from a dungeon, in both walls,
decor, and monsters.

  Ubiquity: (map configurable:  unspecified==no random maps)

   Any exit which does not have a destination specified should lead to
a random map, but WITH a sign saying "this is a random map".

  Identifiability:  (configurable)
 
   Random maps includes a sign 
which states that the map is random.

  Recursion:

   Random maps should optionally have another entrance to a random map of
the same style.  The depth of recursion should be specifiable.

  Difficulty:

   Difficulty should be specifiable.  Also, whether the map advances in
difficult with recursion should be specified.

  Quests:

   It would be cool if random quests could be implemented, too.  I won't
put this in immediately.

  Standalone operation:

   It'd be cool if the random map generator operated standalone, so that
map designers could use it easily as well as the server could at exits.

  Size:

   Random maps should be sized.  A big, multi-square exit should have a bigger
random map to it, while a small house should have a small interior.

  Inheritance: 
 
   The type and location of the exit should imply something about its random
interior.  A shop exit should have a shop interior, a house should have a
home interior, etc, a difficult map should have difficult sub-maps.

  Directedness:

   Buildings should have random maps with stairs up to the next random map,
dungeons with stairs down, etc.

 What does everyone think?  Anyone willing to help?  Has anyone already
 made so much progress on this that I should just help them instead of
 starting one myself?


 Algorithms:

  Maze algorithm:  start from a wall point, move forward left or right
or start from a new wall point, at random, recursively.  If blocked,
pop the stack until you can walk again.  If you return all the way,
a maze is generated.


  Specs for a room algorithm:
  Can you write for a function:

  char **room_gen_corridored(int xsize, int ysize, int option);

  which allocates and returns a char[xsize][ysize], with # being a wall
  and a char value of 0 indicating nothing.
  like::

   ######################
   #       #   #        #
   #       #   #        #
   #                    #
   #       #   #        #
   #########   ##########
   #       #   #        #
   #                    #
   #       #   #        #
   #       #   #        #
   #########   ##########
   #       #   #        #
   #                    #
   #       #   #        #
   ######################

   Some suggested options:
   option:
   0   random choice of one of the other options below *
   1   vertical centered corridor *
   2   horizontal centered corridor *
   4   vertical corridor on the right-hand wall *
   8   vertical corridor on the left-hand wall
   16  horizontal corridor on the bottom wall *
   32  horizontal corridor on the top wall

   The *'d ones are the important ones.

   Options 4 and 16 are important so I can easily create reasonable
  bilaterally and 4-way symmetric maps, as in a castle.

  If you're really ambitious, you could make it so you could ADD the
  options to get something like 10:  centered vertical corridor and right-hand
  corridor.

  One restriction you must satisfy, however, is that every place on the map
  be accessible from everywhere else.

  Feel free to contact me with any questons.

  peterm@langmuir.eecs.berkeley.edu
dev/random-maps.txt · Last modified: 2007/12/02 12:00 (external edit)