Guest User

Untitled

a guest
Dec 16th, 2018
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 35.72 KB | None | 0 0
  1. local TILE_ADDR = 0x00A0
  2.  
  3. local gui = gui
  4. local bit = bit
  5. local memory = memory
  6.  
  7. -- drawing
  8. local CANVAS_WIDTH = 800
  9. local CANVAS_HEIGHT = 450
  10.  
  11. local ROOM_SIZE = 12
  12. local ROOM_GAP = 0
  13. local TILE_SIZE = ROOM_SIZE * 2 + ROOM_GAP * 1
  14.  
  15. local X_OFFSET = 6
  16. local Y_OFFSET = 50
  17.  
  18. local draw_POS = {
  19.     [1] = { x = 0, y = 0 },
  20.     [2] = { x = 1, y = 0 },
  21.     [3] = { x = 0, y = 1 },
  22.     [4] = { x = 1, y = 1 }
  23. }
  24.  
  25. -- colors
  26.  
  27. local HM = 0xC0B8A8 -- houses
  28. local HC = 0xA89868 -- hyrule castle
  29. local AT = HC -- aga's tower
  30. local EX = 0x706890 -- escape
  31. local SY = 0x204020 -- sanctuary
  32. local CV = 0x684830 -- caves
  33.  
  34. local EP = 0x80A870 -- eastern palace
  35. local DP = 0x807838 -- desert palace
  36. local TH = 0x987870 -- tower of hera
  37.  
  38. local PD = 0x909090 -- palace of darkness
  39. local SP = 0x7890F8 -- swamp palace
  40. local SW = 0x605030 -- skull woods
  41. local TT = 0x787888 -- thieves town
  42. local IP = 0xA8E0E8 -- ice palace
  43. local MM = 0x408068 -- misery mire
  44. local TR = 0x583028 -- turtle rock
  45. local GT = 0xA09058 -- ganon's tower
  46.  
  47. local GE = 0x984848 -- empty gt TILEs
  48. local EM = 0x606060 -- empty TILEs
  49.  
  50. local COMPLETE = 0xFFFF0000
  51. local VISITED = 0xFFFFFF00
  52. local UNVISITED = 0xFFAAAAAA
  53. local CURRENT = 0xFF00FFFF
  54.  
  55. local BLACK = 0xFF000000
  56. local WHITE = 0xFFFFFFFF
  57.  
  58. local OPAQUE = 0xFF000000
  59. local TRANS = 0x99000000
  60.  
  61. local MINIMAP_X = 266
  62. local MINIMAP_Y = 5
  63. local MINIMAP_SCALE = 3
  64.  
  65. local function get_color(color, opacity)
  66.     return bit.bor(color, opacity)
  67. end -- end get_color
  68.  
  69. -- room number from quadrant variables
  70. local R1, R2, R3, R4 = 1, 2, 3, 4
  71.  
  72. local TILES_TO_VALS = {
  73.     ['RX'] = {
  74.         R1 = { A9 = 0x00, AA = 0x00 },
  75.         R2 = { A9 = 0x01, AA = 0x00 },
  76.         R3 = { A9 = 0x00, AA = 0x02 },
  77.         R4 = { A9 = 0x01, AA = 0x02 }
  78.     },
  79.  
  80.     ['A9AA'] = {
  81.             [0x00] = {
  82.                 [0x00] = R1,
  83.                 [0x02] = R3
  84.             },
  85.             [0x01] = {
  86.                 [0x00] = R2,
  87.                 [0x02] = R4
  88.         }
  89.     }
  90. }
  91.  
  92. local function stop_running()
  93.     running = false
  94. end
  95.  
  96. local function end_thing()
  97.     client.SetGameExtraPadding(0, 0, 0, 0)
  98.     stop_running()
  99. end
  100.  
  101. local function initialize()
  102.     running = true
  103.  
  104.     memory.usememorydomain("WRAM")
  105.     client.SetGameExtraPadding(0, 0, 230, 0)
  106.     the_canvas = gui
  107.  
  108.     event.onexit(end_thing)
  109. end
  110.  
  111. --[==[
  112. Format:
  113.     [0x##] = {        -- room id
  114.         c = XX        -- color
  115.         p = AABA        -- room pattern
  116.         r = { p }      -- pattern as table
  117.         v = 0100        -- rooms reachable without glitches
  118.         x = { v }      -- reachability as table; no dupes
  119.     }
  120. ]==]
  121.  
  122. local TILE_DATA = {
  123.     [0x00] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  124.     [0x01] = { c = HC, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  125.     [0x02] = { c = SY, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  126.     [0x03] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  127.     [0x04] = { c = TR, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  128.     [0x05] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  129.     [0x06] = { c = SP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  130.     [0x07] = { c = TH, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  131.     [0x08] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  132.     [0x09] = { c = PD, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  133.     [0x0A] = { c = PD, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  134.     [0x0B] = { c = PD, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  135.     [0x0C] = { c = GT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  136.     [0x0D] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  137.     [0x0E] = { c = IP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  138.     [0x0F] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  139.  
  140.     [0x10] = { c = GT, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  141.     [0x11] = { c = EX, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  142.     [0x12] = { c = SY, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  143.     [0x13] = { c = TR, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  144.     [0x14] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  145.     [0x15] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  146.     [0x16] = { c = SP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  147.     [0x17] = { c = TH, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  148.     [0x18] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  149.     [0x19] = { c = PD, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  150.     [0x1A] = { c = PD, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  151.     [0x1B] = { c = PD, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  152.     [0x1C] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  153.     [0x1D] = { c = GT, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  154.     [0x1E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  155.     [0x1F] = { c = IP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  156.  
  157.     [0x20] = { c = AT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  158.     [0x21] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  159.     [0x22] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  160.     [0x23] = { c = TR, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  161.     [0x24] = { c = TR, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  162.     [0x25] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  163.     [0x26] = { c = SP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  164.     [0x27] = { c = TH, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  165.     [0x28] = { c = SP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  166.     [0x29] = { c = SW, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  167.     [0x2A] = { c = PD, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  168.     [0x2B] = { c = PD, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  169.     [0x2C] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  170.     [0x2D] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  171.     [0x2E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  172.     [0x2F] = { c = CV, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  173.  
  174.     [0x30] = { c = AT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  175.     [0x31] = { c = TH, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  176.     [0x32] = { c = EX, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  177.     [0x33] = { c = DP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  178.     [0x34] = { c = SP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  179.     [0x35] = { c = SP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  180.     [0x36] = { c = SP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  181.     [0x37] = { c = SP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  182.     [0x38] = { c = SP, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  183.     [0x39] = { c = SW, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  184.     [0x3A] = { c = PD, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  185.     [0x3B] = { c = PD, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  186.     [0x3C] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  187.     [0x3D] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  188.     [0x3E] = { c = IP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  189.     [0x3F] = { c = IP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  190.  
  191.     [0x40] = { c = AT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  192.     [0x41] = { c = HC, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  193.     [0x42] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  194.     [0x43] = { c = DP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  195.     [0x44] = { c = TT, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  196.     [0x45] = { c = TT, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  197.     [0x46] = { c = SP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  198.     [0x47] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  199.     [0x48] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  200.     [0x49] = { c = SW, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  201.     [0x4A] = { c = PD, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  202.     [0x4B] = { c = PD, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  203.     [0x4C] = { c = GT, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  204.     [0x4D] = { c = GT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  205.     [0x4E] = { c = IP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  206.     [0x4F] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  207.  
  208.     [0x50] = { c = HC, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  209.     [0x51] = { c = HC, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  210.     [0x52] = { c = HC, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  211.     [0x53] = { c = DP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  212.     [0x54] = { c = SP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  213.     [0x55] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  214.     [0x56] = { c = SW, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  215.     [0x57] = { c = SW, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  216.     [0x58] = { c = SW, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  217.     [0x59] = { c = SW, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  218.     [0x5A] = { c = PD, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  219.     [0x5B] = { c = GT, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  220.     [0x5C] = { c = GT, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  221.     [0x5D] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  222.     [0x5E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  223.     [0x5F] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  224.  
  225.     [0x60] = { c = HC, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  226.     [0x61] = { c = HC, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  227.     [0x62] = { c = HC, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  228.     [0x63] = { c = DP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  229.     [0x64] = { c = TT, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  230.     [0x65] = { c = TT, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  231.     [0x66] = { c = SP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  232.     [0x67] = { c = SW, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  233.     [0x68] = { c = SW, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  234.     [0x69] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  235.     [0x6A] = { c = PD, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  236.     [0x6B] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  237.     [0x6C] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  238.     [0x6D] = { c = GT, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  239.     [0x6E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  240.     [0x6F] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  241.  
  242.     [0x70] = { c = EX, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  243.     [0x71] = { c = EX, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  244.     [0x72] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  245.     [0x73] = { c = DP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  246.     [0x74] = { c = DP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  247.     [0x75] = { c = DP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  248.     [0x76] = { c = SP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  249.     [0x77] = { c = TH, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  250.     [0x78] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  251.     [0x79] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  252.     [0x7A] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  253.     [0x7B] = { c = GT, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  254.     [0x7C] = { c = GT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  255.     [0x7D] = { c = GT, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  256.     [0x7E] = { c = IP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  257.     [0x7F] = { c = IP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  258.  
  259.     [0x80] = { c = EX, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  260.     [0x81] = { c = EX, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  261.     [0x82] = { c = EX, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  262.     [0x83] = { c = DP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  263.     [0x84] = { c = DP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  264.     [0x85] = { c = DP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  265.     [0x86] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  266.     [0x87] = { c = TH, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  267.     [0x88] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  268.     [0x89] = { c = EP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  269.     [0x8A] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  270.     [0x8B] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  271.     [0x8C] = { c = GT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  272.     [0x8D] = { c = GT, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  273.     [0x8E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  274.     [0x8F] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  275.  
  276.     [0x90] = { c = MM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  277.     [0x91] = { c = MM, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  278.     [0x92] = { c = MM, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  279.     [0x93] = { c = MM, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  280.     [0x94] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  281.     [0x95] = { c = GT, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  282.     [0x96] = { c = GT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  283.     [0x97] = { c = MM, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  284.     [0x98] = { c = MM, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  285.     [0x99] = { c = EP, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  286.     [0x9A] = { c = GE, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  287.     [0x9B] = { c = GT, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  288.     [0x9C] = { c = GT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  289.     [0x9D] = { c = GT, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  290.     [0x9E] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  291.     [0x9F] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  292.  
  293.     [0xA0] = { c = MM, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  294.     [0xA1] = { c = MM, p = 'AABA', r = { 'A', 'A', 'B', 'A' } },
  295.     [0xA2] = { c = MM, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  296.     [0xA3] = { c = MM, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  297.     [0xA4] = { c = TR, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  298.     [0xA5] = { c = GT, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  299.     [0xA6] = { c = GT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  300.     [0xA7] = { c = TH, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  301.     [0xA8] = { c = EP, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  302.     [0xA9] = { c = EP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  303.     [0xAA] = { c = EP, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  304.     [0xAB] = { c = TT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  305.     [0xAC] = { c = TT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  306.     [0xAD] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  307.     [0xAE] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  308.     [0xAF] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  309.  
  310.     [0xB0] = { c = AT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  311.     [0xB1] = { c = MM, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  312.     [0xB2] = { c = MM, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  313.     [0xB3] = { c = MM, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  314.     [0xB4] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  315.     [0xB5] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  316.     [0xB6] = { c = TR, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  317.     [0xB7] = { c = TR, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  318.     [0xB8] = { c = EP, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  319.     [0xB9] = { c = EP, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  320.     [0xBA] = { c = EP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  321.     [0xBB] = { c = TT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  322.     [0xBC] = { c = TT, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  323.     [0xBD] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  324.     [0xBE] = { c = IP, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  325.     [0xBF] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  326.  
  327.     [0xC0] = { c = AT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  328.     [0xC1] = { c = MM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  329.     [0xC2] = { c = MM, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  330.     [0xC3] = { c = MM, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  331.     [0xC4] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  332.     [0xC5] = { c = TR, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  333.     [0xC6] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  334.     [0xC7] = { c = TR, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  335.     [0xC8] = { c = EP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  336.     [0xC9] = { c = EP, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  337.     [0xCA] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  338.     [0xCB] = { c = TT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  339.     [0xCC] = { c = TT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  340.     [0xCD] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  341.     [0xCE] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  342.     [0xCF] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  343.  
  344.     [0xD0] = { c = AT, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  345.     [0xD1] = { c = MM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  346.     [0xD2] = { c = MM, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  347.     [0xD3] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  348.     [0xD4] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  349.     [0xD5] = { c = TR, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  350.     [0xD6] = { c = TR, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  351.     [0xD7] = { c = EM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  352.     [0xD8] = { c = EP, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  353.     [0xD9] = { c = EP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  354.     [0xDA] = { c = EP, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  355.     [0xDB] = { c = TT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  356.     [0xDC] = { c = TT, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  357.     [0xDD] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  358.     [0xDE] = { c = IP, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  359.     [0xDF] = { c = CV, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  360.  
  361.     [0xE0] = { c = AT, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  362.     [0xE1] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  363.     [0xE2] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  364.     [0xE3] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  365.     [0xE4] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  366.     [0xE5] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  367.     [0xE6] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  368.     [0xE7] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  369.     [0xE8] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  370.     [0xE9] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  371.     [0xEA] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  372.     [0xEB] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  373.     [0xEC] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  374.     [0xED] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  375.     [0xEE] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  376.     [0xEF] = { c = CV, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  377.  
  378.     [0xF0] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  379.     [0xF1] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  380.     [0xF2] = { c = HM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  381.     [0xF3] = { c = HM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  382.     [0xF4] = { c = HM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  383.     [0xF5] = { c = HM, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  384.     [0xF6] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  385.     [0xF7] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  386.     [0xF8] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  387.     [0xF9] = { c = CV, p = 'ABBB', r = { 'A', 'B', 'B', 'B' } },
  388.     [0xFA] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  389.     [0xFB] = { c = CV, p = 'ABBB', r = { 'A', 'B', 'B', 'B' } },
  390.     [0xFC] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  391.     [0xFD] = { c = CV, p = 'ABAA', r = { 'A', 'B', 'A', 'A' } },
  392.     [0xFE] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  393.     [0xFF] = { c = CV, p = 'ABCC', r = { 'A', 'B', 'C', 'C' } },
  394.  
  395.     -- underworld 2
  396.     [0x0100] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  397.     [0x0101] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  398.     [0x0102] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  399.     [0x0103] = { c = CV, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  400.     [0x0104] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  401.     [0x0105] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  402.     [0x0106] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  403.     [0x0107] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  404.     [0x0108] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  405.     [0x0109] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  406.     [0x010A] = { c = CV, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  407.     [0x010B] = { c = CV, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  408.     [0x010C] = { c = CV, p = 'ABCB', r = { 'A', 'B', 'C', 'B' } },
  409.     [0x010D] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  410.     [0x010E] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  411.     [0x010F] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  412.  
  413.     [0x0110] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  414.     [0x0111] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  415.     [0x0112] = { c = CV, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  416.     [0x0113] = { c = CV, p = 'ABAB', r = { 'A', 'B', 'A', 'B' } },
  417.     [0x0114] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  418.     [0x0115] = { c = CV, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  419.     [0x0116] = { c = CV, p = 'AABC', r = { 'A', 'A', 'B', 'C' } },
  420.     [0x0117] = { c = CV, p = 'AAAA', r = { 'A', 'A', 'A', 'A' } },
  421.     [0x0118] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  422.     [0x0119] = { c = CV, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  423.     [0x011A] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  424.     [0x011B] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  425.     [0x011C] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  426.     [0x011D] = { c = CV, p = 'AABB', r = { 'A', 'A', 'B', 'B' } },
  427.     [0x011E] = { c = CV, p = 'ABAC', r = { 'A', 'B', 'A', 'C' } },
  428.     [0x011F] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  429.  
  430.     [0x0120] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  431.     [0x0121] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  432.     [0x0122] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  433.     [0x0123] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  434.     [0x0124] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  435.     [0x0125] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  436.     [0x0126] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  437.     [0x0127] = { c = CV, p = 'ABCD', r = { 'A', 'B', 'C', 'D' } },
  438. }
  439.  
  440. -- room tracking
  441. local prev = nil
  442. local prev_quad = nil
  443. local check_map = false
  444.  
  445. -- drawing
  446. local function draw_tile(tile, quad_id)
  447.     if tile == nil then return end
  448.  
  449.     local x = (bit.band(tile, 0x0F) * TILE_SIZE + 1) + X_OFFSET
  450.     local y = ((bit.band(tile, 0xF0) / 16) * TILE_SIZE + 1) + Y_OFFSET
  451.  
  452.     the_canvas.drawRectangle(x, y, TILE_SIZE, TILE_SIZE, BLACK, BLACK) -- clear only this section
  453.  
  454.     local d = TILE_DATA[tile]
  455.     local r = d.r
  456.  
  457.     local room_completion_colors = { 0, 0, 0, 0 }
  458.  
  459.     for i=1, 4 do
  460.         room_completion_colors[i] =
  461.             quad_id == TILE_DATA[tile].r[i] and CURRENT
  462.                 or UNVISITED and OPAQUE or TRANS
  463.         the_canvas.drawRectangle(
  464.                 x + (ROOM_SIZE) * draw_POS[i].x,
  465.                 y + (ROOM_SIZE) * draw_POS[i].y,
  466.                 ROOM_SIZE,
  467.                 ROOM_SIZE,
  468.                 nil,
  469.                 room_completion_colors[i]
  470.             )
  471.         if TILE_DATA[tile].x[r[i]] == 0 then
  472.             --[[the_canvas.drawText(
  473.                 x + (ROOM_SIZE) * draw_POS[i].x + 1,
  474.                 y + (ROOM_SIZE) * draw_POS[i].y - 1,
  475.                 "X",
  476.                 0x55FFFFFF,
  477.                 0
  478.             )]]
  479.         end
  480.     end
  481.  
  482.     local C0
  483.  
  484.     if quad_id then
  485.         C0 = CURRENT
  486.     else
  487.         C0 = UNVISITED
  488.     end
  489.  
  490.     -- vertical separators
  491.     local C1 = r[1] == r[2] and room_completion_colors[1] or C0
  492.     local C2 = r[3] == r[4] and room_completion_colors[3] or C0
  493.  
  494.     the_canvas.drawLine(x + ROOM_SIZE + ROOM_GAP, y + ROOM_GAP,
  495.                             x + ROOM_SIZE + ROOM_GAP, y + ROOM_SIZE,
  496.                             C1)
  497.  
  498.     the_canvas.drawLine(x + ROOM_GAP + ROOM_SIZE, y + ROOM_GAP + ROOM_GAP + ROOM_SIZE,
  499.                             x + ROOM_GAP + ROOM_SIZE, y + ROOM_SIZE + ROOM_SIZE,
  500.                             C2)
  501.  
  502.     -- horizontal separators
  503.     local C3 = r[1] == r[3] and room_completion_colors[1] or C0
  504.     local C4 = r[2] == r[4] and room_completion_colors[2] or C0
  505.  
  506.     the_canvas.drawLine(x + ROOM_GAP + ROOM_GAP, y + ROOM_GAP + ROOM_SIZE,
  507.                             x + ROOM_SIZE, y + ROOM_GAP + ROOM_SIZE,
  508.                             C3)
  509.  
  510.     the_canvas.drawLine(x + ROOM_GAP + ROOM_GAP + ROOM_SIZE, y + ROOM_GAP + ROOM_SIZE,
  511.                             x + ROOM_SIZE + ROOM_SIZE, y + ROOM_GAP + ROOM_SIZE,
  512.                             C4)
  513.  
  514.     local C5 = d.p == 'AAAA' and C1 or C0
  515.  
  516.     the_canvas.drawPixel(x + ROOM_GAP + ROOM_SIZE, y + ROOM_GAP + ROOM_SIZE, BLACK)
  517.     the_canvas.drawPixel(x + ROOM_GAP + ROOM_SIZE, y + ROOM_GAP + ROOM_SIZE, C5)
  518.  
  519.     the_canvas.drawRectangle(x, y, TILE_SIZE, TILE_SIZE, C0, nil)
  520. end -- end draw_tile
  521.  
  522. local function draw_all()
  523.     the_canvas.Clear(BLACK)
  524.     for i=0, 0x0127 do
  525.         draw_tile(i)
  526.     end
  527.  
  528.     --the_canvas.refresh()
  529. end -- end draw_all
  530.  
  531. local NONE = nil
  532.  
  533. local NOTHING = 0xFF777777
  534. local TURF = 0xFF4A9C4A
  535. local COLL = 0xFF282828
  536. local SEMI = 0xFF303030
  537. local CHEST = 0xFFDEB429
  538. local RAIL = 0xFF707070
  539. local SPIKE = 0xFFE0E0E0
  540. local POT = 0xFF7B4A4A
  541. local BUSH = 0xFF317331
  542. local WATER = 0xFF3962AC
  543. local SHALLOW_WATER = 0xFF5A83C5
  544. local ICE = 0xFFACE6EE
  545. local THICK_GRASS = 0xFF115511
  546. local SPIKE_FLOOR = 0xFFA4A4A4
  547. local PIT = 0xFF550000
  548. local CRACKED = 0xFF330000
  549. local AUTO_STAIRS = 0xFF6A4A31
  550. local MANUAL_STAIRS = 0xFF8A6A51
  551. local ROOM_STAIRS = 0xFF5A737B
  552. local PEGS_1 = 0xFF414183
  553. local PEGS_2 = 0xFF6A6AC5
  554. local LIGHT_ROCK = 0xFF7BBD94
  555. local DARK_ROCK = 0xFF528373
  556. local RUPEES = 0xFF626283
  557. local SOM_LINE = 0xFFEEEEEE
  558. local SOM_LINE_Q = 0xFF7B4A4A
  559. local TORCH = 0xFFA4A4A4
  560. local CONVEYOR = 0xFF627362
  561. local SIGN = 0xFF8B7341
  562. local STAR = 0xFFAC7B52
  563. local KEY_DOOR = 0xFFAC9C6A
  564. local WARP = 0xFFAC7B52
  565. local SWITCH = 0xFF415241
  566.  
  567. local collision_map = {
  568.     [0x00] = NOTHING,
  569.     [0x01] = COLL,
  570.     [0x02] = COLL,
  571.     [0x03] = COLL,
  572.     [0x04] = COLL,
  573.     [0x05] = nil,
  574.     [0x06] = nil,
  575.     [0x07] = nil,
  576.     [0x08] = WATER,
  577.     [0x09] = SHALLOW_WATER,
  578.     [0x0A] = nil,
  579.     [0x0B] = COLL,
  580.     [0x0C] = nil,
  581.     [0x0D] = SPIKE_FLOOR,
  582.     [0x0E] = ICE,
  583.     [0x0F] = ICE,
  584.     [0x10] = SEMI,
  585.     [0x11] = SEMI,
  586.     [0x12] = SEMI,
  587.     [0x13] = SEMI,
  588.     [0x14] = SEMI,
  589.     [0x15] = SEMI,
  590.     [0x16] = SEMI,
  591.     [0x17] = SEMI,
  592.     [0x18] = SEMI,
  593.     [0x19] = SEMI,
  594.     [0x1A] = SEMI,
  595.     [0x1B] = SEMI,
  596.     [0x1C] = AUTO_STAIRS, -- stairs?
  597.     [0x1D] = AUTO_STAIRS,
  598.     [0x1E] = AUTO_STAIRS,
  599.     [0x1F] = AUTO_STAIRS,
  600.     [0x20] = PIT,
  601.     [0x21] = nil,
  602.     [0x22] = MANUAL_STAIRS,
  603.     [0x23] = SWITCH,
  604.     [0x24] = nil,
  605.     [0x25] = nil,
  606.     [0x26] = COLL,
  607.     [0x27] = COLL,
  608.     [0x28] = SEMI,
  609.     [0x29] = SEMI,
  610.     [0x2A] = SEMI,
  611.     [0x2B] = SEMI,
  612.     [0x2C] = SEMI,
  613.     [0x2D] = SEMI,
  614.     [0x2E] = SEMI,
  615.     [0x2F] = SEMI,
  616.     [0x30] = ROOM_STAIRS,
  617.     [0x31] = ROOM_STAIRS,
  618.     [0x32] = ROOM_STAIRS,
  619.     [0x33] = ROOM_STAIRS,
  620.     [0x34] = ROOM_STAIRS,
  621.     [0x35] = ROOM_STAIRS,
  622.     [0x36] = ROOM_STAIRS,
  623.     [0x37] = ROOM_STAIRS,
  624.     [0x38] = ROOM_STAIRS,
  625.     [0x39] = ROOM_STAIRS,
  626.     [0x3A] = STAR,
  627.     [0x3B] = STAR,
  628.     [0x3C] = nil,
  629.     [0x3D] = AUTO_STAIRS,
  630.     [0x3E] = AUTO_STAIRS,
  631.     [0x3F] = AUTO_STAIRS,
  632.     [0x40] = THICK_GRASS,
  633.     [0x41] = nil,
  634.     [0x42] = COLL,
  635.     [0x43] = COLL,
  636.     [0x44] = SPIKE,
  637.     [0x45] = nil,
  638.     [0x46] = COLL,
  639.     [0x47] = nil,
  640.     [0x48] = TURF,
  641.     [0x49] = nil,
  642.     [0x4A] = nil,
  643.     [0x4B] = WARP,
  644.     [0x4C] = nil,
  645.     [0x4D] = nil,
  646.     [0x4E] = COLL,
  647.     [0x4F] = COLL,
  648.     [0x50] = BUSH,
  649.     [0x51] = BUSH,
  650.     [0x52] = LIGHT_ROCK,
  651.     [0x53] = DARK_ROCK,
  652.     [0x54] = SIGN,
  653.     [0x55] = LIGHT_ROCK,
  654.     [0x56] = DARK_ROCK,
  655.     [0x57] = COLL,
  656.     [0x58] = CHEST,
  657.     [0x59] = CHEST,
  658.     [0x5A] = CHEST,
  659.     [0x5B] = CHEST,
  660.     [0x5C] = CHEST,
  661.     [0x5D] = CHEST,
  662.     [0x5E] = ROOM_STAIRS,
  663.     [0x5F] = nil,
  664.     [0x60] = RUPEES,
  665.     [0x61] = nil,
  666.     [0x62] = CRACKED,
  667.     [0x63] = CHEST,
  668.     [0x64] = nil,
  669.     [0x65] = nil,
  670.     [0x66] = PEGS_1,
  671.     [0x67] = PEGS_2,
  672.     [0x68] = CONVEYOR,
  673.     [0x69] = CONVEYOR,
  674.     [0x6A] = CONVEYOR,
  675.     [0x6B] = CONVEYOR,
  676.     [0x6C] = COLL,
  677.     [0x6D] = COLL,
  678.     [0x6E] = COLL,
  679.     [0x6F] = COLL,
  680.     [0x70] = POT,
  681.     [0x71] = POT,
  682.     [0x72] = POT,
  683.     [0x73] = POT,
  684.     [0x74] = POT,
  685.     [0x75] = POT,
  686.     [0x76] = POT,
  687.     [0x77] = POT,
  688.     [0x78] = POT,
  689.     [0x79] = POT,
  690.     [0x7A] = POT,
  691.     [0x7B] = POT,
  692.     [0x7C] = POT,
  693.     [0x7D] = POT,
  694.     [0x7E] = POT,
  695.     [0x7F] = POT,
  696.     [0x80] = ROOM_STAIRS,
  697.     [0x81] = ROOM_STAIRS,
  698.     [0x82] = ROOM_STAIRS,
  699.     [0x83] = ROOM_STAIRS,
  700.     [0x84] = ROOM_STAIRS,
  701.     [0x85] = ROOM_STAIRS,
  702.     [0x86] = ROOM_STAIRS,
  703.     [0x87] = ROOM_STAIRS,
  704.     [0x88] = ROOM_STAIRS,
  705.     [0x89] = ROOM_STAIRS,
  706.     [0x8A] = ROOM_STAIRS,
  707.     [0x8B] = ROOM_STAIRS,
  708.     [0x8C] = ROOM_STAIRS,
  709.     [0x8D] = ROOM_STAIRS,
  710.     [0x8E] = ROOM_STAIRS,
  711.     [0x8F] = ROOM_STAIRS,
  712.     [0x90] = nil,
  713.     [0x91] = nil,
  714.     [0x92] = nil,
  715.     [0x93] = nil,
  716.     [0x94] = nil,
  717.     [0x95] = nil,
  718.     [0x96] = nil,
  719.     [0x97] = nil,
  720.     [0x98] = nil,
  721.     [0x99] = nil,
  722.     [0x9A] = nil,
  723.     [0x9B] = nil,
  724.     [0x9C] = nil,
  725.     [0x9D] = nil,
  726.     [0x9E] = nil,
  727.     [0x9F] = nil,
  728.     [0xA0] = nil,
  729.     [0xA1] = nil,
  730.     [0xA2] = nil,
  731.     [0xA3] = nil,
  732.     [0xA4] = nil,
  733.     [0xA5] = nil,
  734.     [0xA6] = nil,
  735.     [0xA7] = nil,
  736.     [0xA8] = nil,
  737.     [0xA9] = nil,
  738.     [0xAA] = nil,
  739.     [0xAB] = nil,
  740.     [0xAC] = nil,
  741.     [0xAD] = nil,
  742.     [0xAE] = nil,
  743.     [0xAF] = nil,
  744.     [0xB0] = SOM_LINE,
  745.     [0xB1] = SOM_LINE,
  746.     [0xB2] = SOM_LINE,
  747.     [0xB3] = SOM_LINE,
  748.     [0xB4] = SOM_LINE,
  749.     [0xB5] = SOM_LINE,
  750.     [0xB6] = SOM_LINE_Q,
  751.     [0xB7] = nil,
  752.     [0xB8] = nil,
  753.     [0xB9] = nil,
  754.     [0xBA] = nil,
  755.     [0xBB] = nil,
  756.     [0xBC] = nil,
  757.     [0xBD] = SOM_LINE,
  758.     [0xBE] = AUTO_STAIRS,
  759.     [0xBF] = nil,
  760.     [0xC0] = TORCH,
  761.     [0xC1] = TORCH,
  762.     [0xC2] = TORCH,
  763.     [0xC3] = TORCH,
  764.     [0xC4] = TORCH,
  765.     [0xC5] = TORCH,
  766.     [0xC6] = TORCH,
  767.     [0xC7] = TORCH,
  768.     [0xC8] = TORCH,
  769.     [0xC9] = TORCH,
  770.     [0xCA] = TORCH,
  771.     [0xCB] = TORCH,
  772.     [0xCC] = TORCH,
  773.     [0xCD] = TORCH,
  774.     [0xCE] = TORCH,
  775.     [0xCF] = TORCH,
  776.     [0xD0] = nil,
  777.     [0xD1] = nil,
  778.     [0xD2] = nil,
  779.     [0xD3] = nil,
  780.     [0xD4] = nil,
  781.     [0xD5] = nil,
  782.     [0xD6] = nil,
  783.     [0xD7] = nil,
  784.     [0xD8] = nil,
  785.     [0xD9] = nil,
  786.     [0xDA] = nil,
  787.     [0xDB] = nil,
  788.     [0xDC] = nil,
  789.     [0xDD] = nil,
  790.     [0xDE] = nil,
  791.     [0xDF] = nil,
  792.     [0xE0] = nil,
  793.     [0xE1] = nil,
  794.     [0xE2] = nil,
  795.     [0xE3] = nil,
  796.     [0xE4] = nil,
  797.     [0xE5] = nil,
  798.     [0xE6] = nil,
  799.     [0xE7] = nil,
  800.     [0xE8] = AUTO_STAIRS,
  801.     [0xE9] = nil,
  802.     [0xEA] = nil,
  803.     [0xEB] = nil,
  804.     [0xEC] = nil,
  805.     [0xED] = nil,
  806.     [0xEE] = nil,
  807.     [0xEF] = nil,
  808.     [0xF0] = KEY_DOOR,
  809.     [0xF1] = KEY_DOOR,
  810.     [0xF2] = KEY_DOOR,
  811.     [0xF3] = KEY_DOOR,
  812.     [0xF4] = COLL,
  813.     [0xF5] = COLL,
  814.     [0xF6] = COLL,
  815.     [0xF7] = COLL,
  816.     [0xF8] = COLL,
  817.     [0xF9] = COLL,
  818.     [0xFA] = COLL,
  819.     [0xFB] = COLL,
  820.     [0xFC] = COLL,
  821.     [0xFD] = COLL,
  822.     [0xFE] = COLL,
  823.     [0xFF] = COLL
  824. }
  825.  
  826. local function in_overworld()
  827.     return memory.readbyte(0x001B) == 0
  828. end
  829.  
  830. local tile_shit = {}
  831. local ow = true
  832. local owm = -1
  833. local owmy, owmx
  834. local uwm = -1
  835.  
  836. local mod_factor = 0x200
  837. local scale_factor = 2
  838. local scale_factor_tile = 8
  839. local MAP_OFFSET_BASE_X = 128
  840. local MAP_OFFSET_BASE_Y = 108
  841. local map_offset_x = MAP_OFFSET_BASE_X
  842. local map_offset_y = MAP_OFFSET_BASE_Y
  843.  
  844. for x = 0, 63 do
  845.     tile_shit[x] = {}
  846.     for y = 0, 63 do
  847.         tile_shit[x][y] = 0
  848.     end
  849. end
  850.  
  851. local function get_uw_tile(y, x, tilemap_mask, layer)
  852.     local tile_idx = y * 64 + x + (layer == 1 and 0x1000 or 0x0000)
  853.     return memory.read_u8(0x12000 + tile_idx)
  854. end
  855.  
  856. local function get_ow_tile(y, x)
  857.     local tile1_idx = (y * 64 + x) * 2
  858.     local tile1 = bit.lshift(memory.read_u16_le(0x2000 + tile1_idx), 2)
  859.  
  860.     local tile2_idx = bit.lshift(bit.bor(tile1, bit.band(x, 1)), 1)
  861.     local tile2 = memory.read_u16_le(0x0F8000 + tile2_idx, "System Bus")
  862.  
  863.     local tile3_idx = bit.band(tile2, 0x1FF)
  864.     local tile3 = memory.read_u16_le(0x0FFD94 + tile3_idx, "System Bus")
  865.  
  866.     if tile3 >= 0x10 and tile3 < 0x1C then
  867.         tile3 = bit.bor(bit.rol(bit.lshift(bit.band(tile3, 0x40), 1), 2), tile3)
  868.     end
  869.  
  870.     return bit.band(tile3, 0xFF)
  871. end
  872.  
  873. local big_ow_screens = {
  874.     [0x00] = true,
  875.     [0x03] = true,
  876.     [0x05] = true,
  877.     [0x18] = true,
  878.     [0x1B] = true,
  879.     [0x1E] = true,
  880.     [0x2A] = true,
  881.     [0x30] = true,
  882.     [0x35] = true,
  883.     [0x40] = true,
  884.     [0x43] = true,
  885.     [0x45] = true,
  886.     [0x58] = true,
  887.     [0x5B] = true,
  888.     [0x5E] = true,
  889.     [0x6A] = true,
  890.     [0x70] = true,
  891.     [0x75] = true
  892. }
  893.  
  894. local function get_all_tiles()
  895.     --print('get_all_tiles')
  896.     ow = in_overworld()
  897.  
  898.     if ow then
  899.         owm = memory.read_u8(0x8A)
  900.         owmx = bit.band(owm, 1) == 1
  901.         owmy = bit.band(math.floor(owm / 8), 1) == 1
  902.     else
  903.         uwm = memory.read_u8(0xA0)
  904.     end
  905.  
  906.     local layer = memory.read_u16_le(0x00EE)
  907.     local tilemap_mask = memory.read_u16_le(0x00EC)
  908.  
  909.     mod_factor = (ow) and 0x400 or 0x200
  910.     scale_factor = (ow) and 1 or 2
  911.     scale_factor_tile = (ow) and 16 or 8
  912.     map_offset_x = math.floor(MAP_OFFSET_BASE_X * MINIMAP_SCALE / scale_factor_tile)
  913.     map_offset_y = math.floor(MAP_OFFSET_BASE_Y * MINIMAP_SCALE / scale_factor_tile)
  914.  
  915.     for y = 0, 63 do
  916.         for x = 0, 63 do
  917.             local tile
  918.  
  919.             if ow then
  920.                 tile = get_ow_tile(y, x, tilemap_mask)
  921.             else
  922.                 tile = get_uw_tile(y, x, tilemap_mask, layer)
  923.             end
  924.  
  925.             tile_shit[x][y] = tile
  926.         end
  927.     end
  928. end
  929.  
  930. local got_map = false
  931.  
  932. local function draw_minimap()
  933.     --the_canvas.drawRectangle(MINIMAP_X-10, MINIMAP_Y-10, MINIMAP_SCALE * 80, MINIMAP_SCALE * 80, BLACK, BLACK)
  934.     the_canvas.drawRectangle(MINIMAP_X-1, MINIMAP_Y-1, MINIMAP_SCALE*64+2, MINIMAP_SCALE*64+2, COMPLETE, BLACK)
  935.  
  936.     for y = 0, 63 do
  937.         for x = 0, 63 do
  938.             local tile = tile_shit[x][y]
  939.             tile = collision_map[tile]
  940.  
  941.             if tile then
  942.                 the_canvas.drawRectangle(MINIMAP_X + x * MINIMAP_SCALE,
  943.                                          MINIMAP_Y + y * MINIMAP_SCALE,
  944.                                          MINIMAP_SCALE,
  945.                                          MINIMAP_SCALE,
  946.                                          tile - 0xAA000000,
  947.                                          tile)
  948.             end
  949.         end
  950.     end
  951.  
  952.     local linky = memory.read_u16_le(0x20)
  953.     local linkx = memory.read_u16_le(0x22)
  954.     local cameray = memory.read_u16_le(0x618)
  955.     local camerax = memory.read_u16_le(0x61C)
  956.  
  957.     linky = linky % mod_factor
  958.     linkx = linkx % mod_factor
  959.     cameray = cameray % mod_factor
  960.     camerax = camerax % mod_factor
  961.  
  962.     if ow then
  963.         if owmx then
  964.             linkx = bit.band(linkx + 0x200, 0x3FF)
  965.             camerax = bit.band(camerax + 0x200, 0x3FF)
  966.         end
  967.         if owmy then
  968.             linky = bit.band(linky + 0x200, 0x3FF)
  969.             cameray = bit.band(cameray + 0x200, 0x3FF)
  970.         end
  971.     end
  972.  
  973.     linky = math.floor(linky * MINIMAP_SCALE / scale_factor_tile)
  974.     linkx = math.floor(linkx * MINIMAP_SCALE / scale_factor_tile)
  975.     cameray = math.floor(cameray * MINIMAP_SCALE / scale_factor_tile)
  976.     camerax = math.floor(camerax * MINIMAP_SCALE / scale_factor_tile)
  977.  
  978.     the_canvas.drawRectangle(MINIMAP_X + camerax - map_offset_x, MINIMAP_Y + cameray - map_offset_y, 256 / scale_factor_tile * MINIMAP_SCALE, 236 / scale_factor_tile * MINIMAP_SCALE, CURRENT)
  979.     the_canvas.drawRectangle(MINIMAP_X + linkx, MINIMAP_Y + linky + MINIMAP_SCALE, MINIMAP_SCALE * scale_factor, MINIMAP_SCALE * scale_factor, VISITED)
  980. end
  981.  
  982. local modes_to_ignore = {
  983.     [0x7FBF] = true,
  984.     [0x0000] = true,
  985.     [0x0001] = true,
  986.     [0x0002] = true,
  987.     [0x0003] = true,
  988.     [0x0004] = true,
  989.     [0x0005] = true,
  990.     [0x0006] = true,
  991.     [0x0007] = true,
  992.     [0x0008] = true,
  993.     [0x0008] = true,
  994.     [0x0008] = true,
  995.     [0x0008] = true,
  996.     [0x0009] = true,
  997.     [0x0100] = true,
  998.     [0x0101] = true,
  999.     [0x0102] = true,
  1000.     [0x0103] = true,
  1001.     [0x0104] = true,
  1002.     [0x0105] = true,
  1003.     [0x0105] = true,
  1004.     [0x0400] = true,
  1005.     [0x0401] = true,
  1006.     [0x0402] = true,
  1007.     [0x0403] = true,
  1008.     [0x0500] = true,
  1009.     [0x1701] = true,
  1010.     [0x1702] = true,
  1011.     [0x0500] = true,
  1012.     [0x1B02] = true
  1013. }
  1014.  
  1015. local active_link_modes = {
  1016.     [0x0700] = true,
  1017.     [0x0900] = true,
  1018.     [0x0B00] = true,
  1019. }
  1020.  
  1021. local refresh_map_modes = {
  1022.     [0x0703] = true,
  1023.     [0x0704] = true,
  1024.     [0x0705] = true,
  1025.     [0x0708] = true,
  1026.     [0x0709] = true,
  1027.     [0x070B] = true,
  1028.     [0x070C] = true,
  1029.     [0x070D] = true,
  1030.     [0x0710] = true,
  1031.     [0x0716] = true,
  1032.     [0x0717] = true,
  1033.     [0x071A] = true,
  1034. }
  1035.  
  1036. local prev_dma = 0
  1037. local prev_layer = 9
  1038. local redraw = false
  1039.  
  1040. local function do_main()
  1041.     local last = nil
  1042.     while running do
  1043.         emu.frameadvance()
  1044.         local gamemode = memory.read_u16_be(0x0010)
  1045.  
  1046.         local current = tostring(in_overworld()) .. '-' .. tostring(memory.read_u8(in_overworld() and 0x8A or 0xA0))
  1047.         if current ~= last or refresh_map_modes[gamemode] then
  1048.             -- get new map when changing screen
  1049.             got_map = false
  1050.             last = current
  1051.         end
  1052.  
  1053.         if not got_map and active_link_modes[gamemode] then
  1054.             -- redraw map once we know
  1055.             redraw = true
  1056.             got_map = true
  1057.         elseif active_link_modes[gamemode] then -- hopefully this catches bushes and pots
  1058.  
  1059.             local cur_dma = memory.read_u16_be(0x1002) -- don't care what this is, just see if it changed
  1060.  
  1061.             -- check if link switched layers
  1062.             local cur_layer = memory.read_u16_le(0x00EE)
  1063.  
  1064.             if cur_dma ~= prev_dma then
  1065.                 prev_dma = cur_dma
  1066.                 redraw = true
  1067.             end
  1068.  
  1069.             if cur_layer ~= prev_layer then
  1070.                 prev_layer = cur_layer
  1071.                 redraw = true
  1072.             end
  1073.         end
  1074.  
  1075.         if redraw then
  1076.             get_all_tiles()
  1077.             redraw = false
  1078.         end
  1079.  
  1080.         if not modes_to_ignore[gamemode] then
  1081.             draw_minimap()
  1082.         end
  1083.     end
  1084.  
  1085.         --[[
  1086.         local ow_flag = memory.readbyte(0x001B)
  1087.  
  1088.         if not (ow_flag == 0x01) then
  1089.             if check_map and prev ~= nil then
  1090.                 draw_tile(prev)
  1091.                 prev = nil
  1092.             end
  1093.             check_map = false
  1094.         else
  1095.             if memory.readbyte(0x0010) == 0x07 then
  1096.                 check_map = true
  1097.             else
  1098.                 check_map = false
  1099.                 draw_tile(prev)
  1100.                 prev = nil
  1101.             end
  1102.         end
  1103.        
  1104.         if check_map then
  1105.             local tile = memory.readbyte(TILE_ADDR)
  1106.             local A9 = memory.readbyte(0xA9)
  1107.             local AA = memory.readbyte(0xAA)
  1108.  
  1109.             local quadrant = TILES_TO_VALS.A9AA[A9][AA]
  1110.             local quad_id = TILE_DATA[tile].r[quadrant]
  1111.  
  1112.             if quadrant ~= prev_quad or tile ~= prev then
  1113.                 prev_quad = quadrant
  1114.             end
  1115.  
  1116.             draw_tile(tile, quad_id)
  1117.  
  1118.             if tile ~= prev then
  1119.                 draw_tile(prev)
  1120.                 prev = tile
  1121.             end
  1122.         end
  1123. --]]
  1124. end
  1125.  
  1126. initialize()
  1127. --draw_all()
  1128. --get_all_tiles()
  1129. event.onloadstate(get_all_tiles)
  1130. do_main()
Advertisement
Add Comment
Please, Sign In to add comment