Advertisement
sparkletwist

Fixed version of Automap.lua

May 8th, 2012
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.61 KB | None | 0 0
  1. -- Custom item: Automap v0.2 FINAL.
  2. -- Created by Parallax, November 2007.
  3. -- Extremely minor fixes by Sophia, May 2012.
  4. -- Thanks to Joramun, whose magic map was an invaluable reference in the early stages of development.
  5. -- Thanks to Sophia for DSB, as well as for her help and advice.
  6. -- Thanks to Gambit37, whose beautiful Conflux maps inspired the default background.
  7. -- This item was designed with modularity and adaptability in mind. Some comments are interspersed throughout the code
  8. -- to try and make the process a little bit more transparent. I hope they help.
  9. -- Feel free to use this item as is in your own dungeon and to modify it to suit your needs. If you do use it, please
  10. -- acknowledge me in the credits.
  11.  
  12.  
  13. gfx[ROOT_NAME .. "_background"] = dsb_get_bitmap("Automap_backgd")
  14.  
  15. if (not esb_typecheck) then
  16.     local iconsheet = dsb_get_bitmap("Automap_tiles")
  17.     gfx[ROOT_NAME .. "_tiles"] = {}
  18.     local counter = 0
  19.     for y=0,(dsb_bitmap_height(iconsheet)-15),15 do
  20.         for x=0,(dsb_bitmap_width(iconsheet)-15),15 do
  21.             gfx[ROOT_NAME .. "_tiles"][counter] = dsb_new_bitmap(15, 15)
  22.             dsb_bitmap_blit(iconsheet, gfx[ROOT_NAME .. "_tiles"][counter], x, y, 0, 0, 15, 15)
  23.             counter = counter + 1
  24.         end
  25.     end
  26.     dsb_destroy_bitmap(iconsheet)
  27. end
  28.  
  29. if (not esb_typecheck) then
  30.     iconsheet = dsb_get_bitmap("Automap_arrow")
  31.     gfx[ROOT_NAME .. "_arrow"] = {}
  32.     local counter = 0
  33.     for x=0,(dsb_bitmap_width(iconsheet)-15),15 do
  34.         gfx[ROOT_NAME .. "_arrow"][counter] = dsb_new_bitmap(15, 15)
  35.         dsb_bitmap_blit(iconsheet, gfx[ROOT_NAME .. "_arrow"][counter], x, 0, 0, 0, 15, 15)
  36.         counter = counter + 1
  37.     end
  38.     dsb_destroy_bitmap(iconsheet)
  39. end
  40.  
  41. -- This function draws a quarter of a closed tile (or unexplored fake wall) and a selection of wallitems on it.
  42. -- The contents of this function can be altered to change what wallitems get displayed.
  43. function automap_drawpartial(map, tile, FLAG, lvl, x, y, dir, ptx, pty)
  44.     local i
  45.     local item
  46.     local hasaltar = false
  47.     local hasalcove = false
  48.     local hasfountain = false
  49.     local hasmirror = false
  50.  
  51.     -- Start by drawing a wall.
  52.     dsb_bitmap_draw(tile[FLAG.WALL + dir], map, ptx, pty, false)
  53.     -- Then make a list of every instance on the tile.
  54.     local contents = dsb_fetch(lvl, x, y, dir)
  55.     -- Now go through all instances on the given tile and see if anything else needs displaying.
  56.     if (contents == nil) then return end
  57.     for i in pairs(contents) do
  58.         item = dsb_find_arch(contents[i])
  59.         if ((item.class == "ALCOVE") and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then
  60.             if (item == obj.alcove_vi) then
  61.                 hasaltar = true
  62.             else
  63.                 hasalcove = true
  64.             end
  65.         end
  66.         if ((item.class == "FOUNTAIN") and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasfountain = true end
  67.         if ((item == obj.mirror) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasmirror = true end
  68.     end
  69.     -- Contents enumerated, now display what needs displaying.
  70.     if (hasaltar) then dsb_bitmap_draw(tile[FLAG.ALTAR + dir], map, ptx, pty, false) end
  71.     if (hasalcove) then dsb_bitmap_draw(tile[FLAG.ALCOV + dir], map, ptx, pty, false) end
  72.     if (hasfountain) then dsb_bitmap_draw(tile[FLAG.FOUNT + dir], map, ptx, pty, false) end
  73.     if (hasmirror) then dsb_bitmap_draw(tile[FLAG.MIRRO + dir], map, ptx, pty, false) end
  74.     return
  75. end
  76.  
  77. -- This function draws the open (or closed, visited, movable wall) tile at (lvl, x, y) in the dungeon.
  78. -- The graphics are drawn on {map} at the coordinates (ptx, pty) and are taken from the tile set {tile}.
  79. -- You may want to modifiy this function to change what gets displayed on the automap.
  80. -- If you want to change the background image, or the tile set or you want fake walls to be revealed
  81. -- by standing next to them, this is not the right place.
  82. function automap_drawfull(map, tile, FLAG, lvl, x, y, ptx, pty)
  83.     local i
  84.     local item
  85.     local hasup = false
  86.     local hasdown = false
  87.     local hasframe = false
  88.     local way
  89.     local hasdoorbutton = false
  90.     local hasdoor = false
  91.     local thedoor
  92.     local hasfake = false
  93.     local haspit = false
  94.     local hashaze = false
  95.     local haspad = false
  96.     local hasfirepit = false
  97.     local hassquaredrain = false
  98.     local hasrounddrain = false
  99.  
  100.     -- Start by drawing an open tile.
  101.     dsb_bitmap_draw(tile[FLAG.FLOOR], map, ptx, pty, false)
  102.     -- Then check for wall. Closed movable walls get nothing else.
  103.     if (dsb_get_cell(lvl, x, y) ~= false) then
  104.         dsb_bitmap_draw(tile[FLAG.BLOCK], map, ptx, pty, false)
  105.         return
  106.     end
  107.     -- Then make a list of every instance on the tile.
  108.     local contents = dsb_fetch(lvl, x, y, CENTER)
  109.     -- Now go through all instances on the given tile and see if anything else needs displaying.
  110.     if (contents == nil) then return end
  111.     for i in pairs(contents) do
  112.         item = dsb_find_arch(contents[i])
  113.         if ((item == obj.fakewall) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasfake = true end
  114.         if ((item == obj.stairsdown) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasdown = true end
  115.         if ((item == obj.stairsup) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasup = true end
  116.         if ((item == obj.fakepit) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then haspit = true end
  117.         if ((item == obj.pit) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then haspit = true end
  118.         if ((item == obj.doorframe) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then
  119.             -- There is a doorframe, but we need to know whether to display it north-south
  120.             -- or east-west. Since doors may be completely surrounded by walls, looking at
  121.             -- walls around may cause graphical glitches. We look for visited tiles instead.
  122.             if (dsb_visited(lvl,x+1,y) or dsb_visited(lvl,x-1,y)) then
  123.                 hasframe = true
  124.                 way = 1
  125.             elseif (dsb_visited(lvl,x,y+1) or dsb_visited(lvl,x,y-1)) then
  126.                 hasframe = true
  127.                 way = 0
  128.             end
  129.         -- We might end up here with way undefined if the party has been teleported or dropped onto
  130.         -- a tile with a door frame. In that case well, tough luck, we're not displaying anything.
  131.         end
  132.         if ((item == obj.doorbutton) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasdoorbutton = true end
  133.         if ((item.type == "DOOR") and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then
  134.             hasdoor = true
  135.             thedoor = dsb_find_arch(contents[i])
  136.             if (dsb_get_gfxflag(contents[i], GF_BASHED)) then hasdoor = false end
  137.         end
  138.         if ((item == obj.bluehaze) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hashaze = true end
  139.         if ((item == obj.pad) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then haspad = true end
  140.         if ((item == obj.firepit) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasfirepit = true end
  141.         if ((item == obj.squaredrain) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hassquaredrain = true end
  142.         if ((item == obj.rounddrain) and (not dsb_get_gfxflag(contents[i], GF_INACTIVE))) then hasrounddrain = true end
  143.     end
  144.     -- Fake walls take precedence over stairs but neither displays anything else.
  145.     if (hasfake) then
  146.         dsb_bitmap_draw(tile[FLAG.FAKE], map, ptx, pty, false)
  147.         return
  148.     end
  149.     if (hasup) then
  150.         dsb_bitmap_draw(tile[FLAG.GO_UP], map, ptx, pty, false)
  151.         return
  152.     end
  153.     if (hasdown) then
  154.         dsb_bitmap_draw(tile[FLAG.GO_DN], map, ptx, pty, false)
  155.         return
  156.     end
  157.     -- Other objects are compatible.
  158.     if (haspit) then dsb_bitmap_draw(tile[FLAG.PIT], map, ptx, pty, false) end
  159.     if (haspad) then dsb_bitmap_draw(tile[FLAG.PAD], map, ptx, pty, false) end
  160.     if (hasfirepit) then dsb_bitmap_draw(tile[FLAG.FIRE], map, ptx, pty, false) end
  161.     if (hassquaredrain) then dsb_bitmap_draw(tile[FLAG.SQDRN], map, ptx, pty, false) end
  162.     if (hasrounddrain) then dsb_bitmap_draw(tile[FLAG.RDDRN], map, ptx, pty, false) end
  163.     if (hasframe) then
  164.         if (hasdoorbutton) then dsb_bitmap_draw(tile[FLAG.DBUTT+way], map, ptx, pty, false) end
  165.         if (hasdoor) then
  166.             if (thedoor.class == "WOOD") then
  167.                 dsb_bitmap_draw(tile[FLAG.DWOOD+way], map, ptx, pty, false)
  168.             elseif (thedoor.class == "PORTCULLIS") then
  169.                 dsb_bitmap_draw(tile[FLAG.DPORT+way], map, ptx, pty, false)
  170.             elseif (thedoor.class == "METAL") then
  171.                 dsb_bitmap_draw(tile[FLAG.DMETL+way], map, ptx, pty, false)
  172.             elseif (thedoor.class == "BLACK") then
  173.                 dsb_bitmap_draw(tile[FLAG.DBLAK+way], map, ptx, pty, false)
  174.             elseif (thedoor.class == "RA") then
  175.                 dsb_bitmap_draw(tile[FLAG.DRA+way], map, ptx, pty, false)
  176.             else
  177.                 dsb_bitmap_draw(tile[FLAG.DWOOD+way], map, ptx, pty, false)
  178.             end
  179.         else
  180.             dsb_bitmap_draw(tile[FLAG.FRAME+way], map, ptx, pty, false)
  181.         end
  182.     end
  183.     if (hashaze) then dsb_bitmap_draw(tile[FLAG.HAZE], map, ptx, pty, false) end
  184.     return
  185. end
  186.  
  187. -- This is the general automap display function. It selects the appropriate images, computes the range of display and
  188. -- cycles through all tiles to see if they should be displayed.
  189. -- If you wish to change the background image or the tile set, look in here.
  190. -- If you want to make fake walls visible on the map even when they have not been stepped on, it's in here too.
  191. -- To display more or other wallitems, modify the MAP_FLAG table(s) and the function autmap_drawpartial above.
  192. -- If you want to change what gets displayed on the open tiles, alter MAP_FLAG and look in automap_drawfull above.
  193. function automap_display(bitmap, mouse_x, mouse_y)
  194.     local lev, party_x, party_y, facing = dsb_party_coords()
  195.  
  196.     -- What follows here is a horrible, terrible hack to recover the name of the archetype that launched the fullscreen
  197.     -- function because we cannot assume that it will be "automap", and we need to know it for sure in order to access
  198.     -- the graphics. The item that launched this fullscreen, our automap, can only be in one of five locations: mouse
  199.     -- pointer, or one of the four party right hands. We check every location for an item for which the 'marker' value
  200.     -- matches the "key", an unremarkable 39-digit hexadecimal number.
  201.     -- This method is NOT foolproof. While the probability that another, unrelated archetype would have the same value
  202.     -- for the nonstandard property 'marker' is astronomically low, the chances that someone would clone this automap
  203.     -- and not change the value of 'marker' are fairly high. And that is bound to cause trouble.
  204.     local ppos
  205.     local self_arch
  206.     local check_arch
  207.     local check = dsb_fetch(MOUSE_HAND, 0, 0, 0)
  208.     if (check ~= nil) then check_arch = dsb_find_arch(check) end
  209.     if (check_arch ~= nil) then
  210.         if (check_arch.marker == "F10C16FD355D1A7A93C0A9178BD95F468285F9") then self_arch = check_arch end
  211.     end
  212.     for ppos=0, 3 do
  213.         if (dsb_ppos_char(ppos)) then
  214.             check = dsb_fetch(PARTY, ppos, INV_R_HAND, 0)
  215.             if (check ~= nil) then
  216.                 check_arch = dsb_find_arch(check)
  217.                 if (check_arch ~= nil) then
  218.                     if (check_arch.marker == "F10C16FD355D1A7A93C0A9178BD95F468285F9") then self_arch = check_arch end
  219.                 end
  220.             end
  221.         end
  222.     end
  223.  
  224.     -- If using multiple maps, replace these parameters with a function
  225.     -- that selects the map and tileset you want to use based on the party's position.
  226.     -- The map is drawn on bitmap background, using the tile set tile_set. Only the rectangle from (left, top) to
  227.     -- (right, bottom) will have tiles drawn on. The party is represented by {arrow}.
  228.     local left = 122
  229.     local top = 74
  230.         local right = 482
  231.         local bottom = 434
  232.     local tile_set = self_arch.tiles
  233.     local background = self_arch.backgd
  234.     local arrow = self_arch.arrow
  235.     local MAP_FLAG = {  VOID = 0,   -- Pink square for undefined items.
  236.                 FLOOR = 1,  -- Open tile. shows the ground.
  237.                 GO_UP = 2,  -- Stairs going up.
  238.                 GO_DN = 3,  -- Stairs going down.
  239.                 WALL = 4,   -- Solid wall, Northern face. East is +1, South +2, West +3.
  240.                 OPEN = 8,   -- Partial open tile, northern face. Once again, the next three indexes are reserved for the other directions.
  241.                 BLOCK = 12, -- Closed movable wall the tile of which was once stepped on while open.
  242.                 FAKE = 13,  -- Fake wall that has been visited.
  243.                 PIT = 14,   -- Fake or real pit. Not invisible pit.
  244.                 HAZE = 15,  -- Blue haze.
  245.                 FRAME = 16, -- Door frame. Used for open doors as well.
  246.                 DWOOD = 18, -- Closed wooden door.
  247.                 DPORT = 20, -- Closed portcullis.
  248.                 DMETL = 22, -- Closed metal door.
  249.                 DBLAK = 24, -- Closed black door.
  250.                 DBUTT = 48, -- Door button, for doors that have them.
  251.                 DRA = 26,   -- Closed RA door.
  252.                 PAD = 28,   -- Large pad.
  253.                 FIRE = 29,  -- Black flame fire pit.
  254.                 SQDRN = 30, -- Square grate.
  255.                 RDDRN = 31, -- Round grate.
  256.                 FOUNT = 32, -- Lion head or medusa fountain.
  257.                 ALCOV = 36, -- Square or round alcove
  258.                 ALTAR = 40, -- VI altar of rebirth.
  259.                 MIRRO = 44  -- Champion mirror.
  260.     }
  261.  
  262.     -- First we draw the background image.
  263.     dsb_bitmap_draw(background, bitmap, 0, 0, false)
  264.     -- Now we compute the display range of the map, which is the largest fraction
  265.     -- of the level that we can display on the map and still have the party position in view.
  266.     -- Within these constraints, the map will center on the party as closely as possible.
  267.     -- Note: NO check is made as to whether this is the most map that could be displayed.
  268.     -- In fully explored levels, both areas would coincide, but not necessary while still exploring.
  269.     local wide = dsb_bitmap_width(tile_set[0])
  270.     local high = dsb_bitmap_height(tile_set[0])
  271.     local xrange = math.floor((right-left+1) / wide)
  272.     local yrange = math.floor((bottom-top+1) / high)
  273.     local xcenter = (right+left)/2
  274.     local ycenter = (top+bottom)/2
  275.     local xmin = -1
  276.     local ymin = -1
  277.     if (party_x-xrange/2>xmin) then xmin = math.floor(party_x-xrange/2) end
  278.     if (party_y-yrange/2>ymin) then ymin = math.floor(party_y-yrange/2) end
  279.     local xmax, ymax = dsb_level_getinfo(lev)
  280.     if (xmin+xrange-1<xmax) then xmax = xmin+xrange-1 end
  281.     if (ymin+yrange-1<ymax) then ymax = ymin+yrange-1 end
  282.     xcenter = math.floor(xcenter - ((xmin+xmax)/2+0.5)*wide + 0.001)
  283.     ycenter = math.floor(ycenter - ((ymin+ymax)/2+0.5)*high + 0.001)
  284.  
  285.     -- Now that we have the display range and the reference point, we can cycle over the entire display.
  286.     local dir
  287.     local xdiff
  288.     local ydiff
  289.     local drawit
  290.     local contents
  291.     local id
  292.     local item
  293.     local isfake
  294.     for y=ymin, ymax do
  295.         for x=xmin, xmax do
  296.             -- This part draws (or not) the tile at (x,y). If you want a secret
  297.             -- area, insert a controller function here.
  298.  
  299.             -- compute the screen coordinates for the top-left corner of the tile.
  300.             x_dest = xcenter + x*wide
  301.             y_dest = ycenter + y*high
  302.             -- Check if the tile is a fake wall. Unexplored faked walls will be treated as real walls
  303.             -- so as not to spoil the secrets.
  304.             -- if you DO wish to spoil the secrets, then remove the loop so isfake is always false, and
  305.             -- also remove the similar loop further down.
  306.             isfake = false
  307.             contents = dsb_fetch(lev, x, y, CENTER)
  308.             if (contents ~= nil) then
  309.                 for id in pairs(contents) do
  310.                     item = dsb_find_arch(contents[id])
  311.                     if ((item == obj.fakewall) and (not dsb_get_gfxflag(contents[id], GF_INACTIVE))) then isfake = true end
  312.                 end
  313.             end
  314.             -- Now determine if the tile should be drawn entirely, partially, or not at all.
  315.             if (dsb_visited(lev, x, y)) then
  316.                 -- tile has been visited, draw it.
  317.                 automap_drawfull(bitmap, tile_set, MAP_FLAG, lev, x, y, x_dest, y_dest)
  318.             elseif ((dsb_get_cell(lev, x, y) ~= false) or isfake) then
  319.                 -- This tile is a wall, check each side to see if we need to draw it.
  320.                 for dir=0, 3 do
  321.                     xdiff = 0
  322.                     ydiff = 0
  323.                     if (dir == 0) then ydiff = -1 end
  324.                     if (dir == 1) then xdiff = 1 end
  325.                     if (dir == 2) then ydiff = 1 end
  326.                     if (dir == 3) then xdiff = -1 end
  327.                     -- Check the tile in front of the wall.
  328.                     if (dsb_visited(lev, x+xdiff, y+ydiff)) then
  329.                         -- It was visited. Draw a wall in that direction.
  330.                         automap_drawpartial(bitmap, tile_set, MAP_FLAG, lev, x, y, dir, x_dest, y_dest)
  331.                     elseif (dsb_get_cell(lev, x+xdiff, y+ydiff) == false) then
  332.                         -- The tile is open, but not visited.
  333.                         -- Draw a wall if a visited tile is adjacent.
  334.                         drawit = dsb_visited(lev, x+2*xdiff, y+2*ydiff)
  335.                         drawit = drawit or dsb_visited(lev, x+xdiff+ydiff, y+ydiff+xdiff)
  336.                         drawit = drawit or dsb_visited(lev, x+xdiff-ydiff, y+ydiff-xdiff)
  337.                         -- but do not draw if this adjacent tile is a fake wall!
  338.                         contents = dsb_fetch(lev, x+xdiff, y+ydiff, CENTER)
  339.                         if (contents ~= nil) then
  340.                             for id in pairs(contents) do
  341.                                 item = dsb_find_arch(contents[id])
  342.                                 if ((item == obj.fakewall) and (not dsb_get_gfxflag(contents[id], GF_INACTIVE))) then drawit = false end
  343.                             end
  344.                         end
  345.                         if (drawit) then
  346.                             automap_drawpartial(bitmap, tile_set, MAP_FLAG, lev, x, y, dir, x_dest, y_dest)
  347.                         end
  348.                     end
  349.                 end
  350.             else
  351.                 -- This tile is open but not visited. Draw it full if adjacent to a visited tile.
  352.                 drawit = dsb_visited(lev, x+1, y)
  353.                 drawit = drawit or dsb_visited(lev, x-1, y)
  354.                 drawit = drawit or dsb_visited(lev, x, y+1)
  355.                 drawit = drawit or dsb_visited(lev, x, y-1)
  356.                 if (drawit) then
  357.                     automap_drawfull(bitmap, tile_set, MAP_FLAG, lev, x, y, x_dest, y_dest)
  358.                 else
  359.                     -- OK, so it is not adjacent to a visited tile. Draw a partial open tile
  360.                     -- in each direction where it is adjacent to an open tile that is
  361.                     -- adjacent to a visited tile (and then we're done, promised!)
  362.                     for dir=0, 3 do
  363.                         xdiff = 0
  364.                         ydiff = 0
  365.                         if (dir == 0) then ydiff = -1 end
  366.                         if (dir == 1) then xdiff = 1 end
  367.                         if (dir == 2) then ydiff = 1 end
  368.                         if (dir == 3) then xdiff = -1 end
  369.                         -- Check the tile in this direction.
  370.                         if (dsb_get_cell(lev, x+xdiff, y+ydiff) == false) then
  371.                             -- The tile is open.
  372.                             -- Draw a partial open space if a visited tile is adjacent.
  373.                             drawit = dsb_visited(lev, x+2*xdiff, y+2*ydiff)
  374.                             drawit = drawit or dsb_visited(lev, x+xdiff+ydiff, y+ydiff+xdiff)
  375.                             drawit = drawit or dsb_visited(lev, x+xdiff-ydiff, y+ydiff-xdiff)
  376.                             if (drawit) then
  377.                                 dsb_bitmap_draw(tile_set[MAP_FLAG.OPEN+dir], bitmap, x_dest, y_dest, false)
  378.                             end
  379.                         end
  380.                     end
  381.                 end
  382.             end
  383.         end
  384.     end
  385.  
  386.     -- Finally, display the party arrow.
  387.     x_dest = xcenter + party_x*wide
  388.     y_dest = ycenter + party_y*high
  389.     dsb_bitmap_draw(arrow[facing], bitmap, x_dest, y_dest, false)
  390.     return false
  391. end
  392.  
  393. function automap_click(mouse_x, mouse_y, mouse_buttons)
  394.     return true
  395. end
  396.  
  397. function method_view_automap()
  398.     dsb_fullscreen(automap_display, automap_click, nil, nil)
  399. end
  400.  
  401. obj[ROOT_NAME] = {
  402.     name="AUTOMAP",
  403.     type="THING",
  404.     class="SCROLL",
  405.     mass=1,
  406.     icon=gfx.icons[31],
  407.     alt_icon=gfx.icons[30],
  408.     dungeon=gfx.scroll,
  409.     backgd = gfx[ROOT_NAME .. "_background"],
  410.     tiles = gfx[ROOT_NAME .. "_tiles"],
  411.     arrow = gfx[ROOT_NAME .. "_arrow"],
  412.     marker = "F10C16FD355D1A7A93C0A9178BD95F468285F9",
  413.     methods = {
  414.         { "EXAMINE", 0, CLASS_FIGHTER, method_view_automap }
  415.     },
  416.     to_r_hand = alticon,
  417.     from_r_hand = normicon,
  418.     on_look = method_view_automap,
  419.     fit_chest=true
  420.  
  421. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement