Advertisement
AceZephyr

ff7-wm.lua

Nov 2nd, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.04 KB | Source Code | 0 0
  1. bit = (require "migration_helpers").EmuHawk_pre_2_9_bit();
  2.  
  3. enable_draw_map = false
  4. enable_wmrng = false
  5. enable_ffmode = false
  6.  
  7. TARGETS = {}
  8. SELECTIONS  = {}
  9.  
  10. CURRENT_MODULE = 0x9c560
  11. PLAYER_POINTER = 0x10AD38
  12.  
  13. function u8(ptr)
  14.     return memory.read_u8(ptr)
  15. end
  16.  
  17. function u16(ptr)
  18.     return memory.read_u16_le(ptr)
  19. end
  20.  
  21. function s32(ptr)
  22.     return memory.read_s32_le(ptr)
  23. end
  24.  
  25. function u32(ptr)
  26.     return memory.read_u32_le(ptr)
  27. end
  28.  
  29. CLOUD = u32(PLAYER_POINTER)
  30.  
  31. function set_player()
  32.     CLOUD = u32(PLAYER_POINTER)
  33.     console.clear()
  34. end
  35.  
  36. function select(_c)
  37.     if SELECTIONS[_c] == nil then
  38.         SELECTIONS[_c] = true
  39.     else
  40.         SELECTIONS[_c] = nil
  41.     end
  42.     console.clear()
  43. end
  44.  
  45. function target(_x, _z, _val)
  46.     local idx = 36 * _z + _x
  47.     if _val == nil then
  48.         if TARGETS[idx] == nil then
  49.             TARGETS[idx] = "blue"
  50.         else
  51.             TARGETS[idx] = nil
  52.         end
  53.     else
  54.         if TARGETS[idx] == _val then
  55.             TARGETS[idx] = nil
  56.         else
  57.             TARGETS[idx] = _val
  58.         end
  59.     end
  60.     console.clear()
  61. end
  62.  
  63. function buf_ff()
  64.     local k
  65.     k = 0x10AE5C
  66.     while k < 0x10AE5C + 521 do
  67.         memory.write_u8(k, 0xFF)
  68.         k = k + 1
  69.     end
  70. end
  71.  
  72. function ff7_wmtris_main()
  73.    
  74.     local MINIMAP_MODE = 0x1164f8
  75.    
  76.     local WORLD_CHUNK_HEADERS = 0x80109a38
  77.     local WORLD_CHUNK_HEADER_SIZE = 0x18
  78.     local WORLD_CHUNK_HEADER_COUNT = 32
  79.    
  80.     local WORLD_CHUNK_LL_HEAD = 0x109D5C
  81.    
  82.     local WORLD_CHUNK_LOAD_LL_HEAD = 0x109D40
  83.    
  84.     local WORLD_CHUNK_NEXT_FREE_LL_HEAD = 0x109D38
  85.    
  86.     local WORLD_CHUNK_LOADED_LL_HEAD = 0x109D3C
  87.  
  88.     local MAP_X = 190
  89.     local MAP_Y = 72
  90.  
  91.     local st = {}
  92.     local wmcx = {}
  93.     local wmcz = {}
  94.     local wmc_tri = {}
  95.     local wmc_vert = {}
  96.     local wm_ll_order = {}
  97.  
  98.     local vlc_cache = {}
  99.  
  100.     CLOUD = u32(PLAYER_POINTER)
  101.    
  102.     function get_vlc_cache(_x, _z)
  103.         return vlc_cache[36 * _z + _x]
  104.     end
  105.    
  106.     function populate_vlc_cache(_x, _z, vertex_pointer)
  107.         local cache_idx = 36 * _z + _x
  108.         local i
  109.         if vlc_cache[cache_idx] == nil then
  110.             vlc_cache[cache_idx] = {}
  111.    
  112.             i = 0
  113.             while i < 0x7a * 4 do
  114.                 vlc_cache[cache_idx][i] = u16(vertex_pointer + i * 2)
  115.                 i = i + 1
  116.             end
  117.         end
  118.     end
  119.    
  120.    
  121.    
  122.     function clear_vlc_cache()
  123.         for k in pairs (vlc_cache) do
  124.             vlc_cache[k] = nil
  125.         end
  126.         console.clear()
  127.     end
  128.  
  129.     function draw_wmtris()
  130.         local i
  131.         local x, z, x_chunk, z_chunk, x_sub, z_sub
  132.         local real_idx, real_x, real_z
  133.         local sto_idx, sto_x, sto_z
  134.         local v0i, v1i, v2i, v0x, v0z, v1x, v1z, v2x, v2z
  135.         local color, ws, draw_map, tri_num
  136.         local vlc
  137.         local chunk_ptr
  138.        
  139.         PLAYER = u32(PLAYER_POINTER)
  140.         if PLAYER ~= 0 then
  141.             x = u32(PLAYER + 0xC)
  142.             z = u32(PLAYER + 0x14)
  143.  
  144.             x_chunk = math.floor(x / 8192)
  145.             z_chunk = math.floor(z / 8192)
  146.             x_sub = x % 8192
  147.             z_sub = z % 8192
  148.  
  149.             st[0] = u32(CLOUD + 0x60)
  150.             st[1] = u32(CLOUD + 0x68)
  151.             st[2] = u32(CLOUD + 0x70)
  152.             st[3] = u32(CLOUD + 0x78)
  153.             st[4] = u32(CLOUD + 0x80)
  154.             st[5] = u32(CLOUD + 0x88)
  155.  
  156.             i = 0
  157.             while i < WORLD_CHUNK_HEADER_COUNT do
  158.                 wmcx[i] = u16(WORLD_CHUNK_HEADERS + i * WORLD_CHUNK_HEADER_SIZE + 0x10)
  159.                 wmcz[i] = u16(WORLD_CHUNK_HEADERS + i * WORLD_CHUNK_HEADER_SIZE + 0x12)
  160.                 wmc_tri[i] = u32(WORLD_CHUNK_HEADERS + i * WORLD_CHUNK_HEADER_SIZE + 0x4)
  161.                 wmc_vert[i] = u32(WORLD_CHUNK_HEADERS + i * WORLD_CHUNK_HEADER_SIZE + 0x8)
  162.                 wm_ll_order[i] = -1
  163.                 populate_vlc_cache(wmcx[i], wmcz[i], wmc_vert[i])
  164.                 i = i + 1
  165.             end
  166.  
  167.             i = 0
  168.             chunk_ptr = u32(WORLD_CHUNK_LL_HEAD)
  169.             while i < 32 and chunk_ptr ~= 0 do
  170.                 wm_ll_order[(chunk_ptr - WORLD_CHUNK_HEADERS) / 0x18] = i
  171.                 i = i + 1
  172.                 chunk_ptr = u32(chunk_ptr)
  173.             end
  174.  
  175.             gui.text(0, 0, string.format("(%2d-%2d) [%04X %04X]", x_chunk, z_chunk, x_sub, z_sub), nil, "topright")
  176.  
  177.             i = 0
  178.             while i < 6 do
  179.                 if st[i] ~= 0 then
  180.                     sto_x = u16(CLOUD + 0x64 + i * 8)
  181.                     sto_z = u16(CLOUD + 0x66 + i * 8)
  182.                     tri_num = math.floor(((st[i] - 0x800e5a3c) % 0x1200) / 12)
  183.                     real_x = -1
  184.                     real_z = -1
  185.  
  186.                     real_idx = -1
  187.                     sto_idx = -1
  188.                     j = 0
  189.                     while (real_idx < 0 or sto_idx < 0) and j < WORLD_CHUNK_HEADER_COUNT do
  190.                         if wmc_tri[j] == st[i] - (tri_num * 12) then
  191.                             real_x = wmcx[j]
  192.                             real_z = wmcz[j]
  193.                             real_idx = j
  194.                         end
  195.                         if wmcx[j] == sto_x and wmcz[j] == sto_z then
  196.                             sto_idx = j
  197.                         end
  198.                         j = j + 1
  199.                     end
  200.  
  201.                     if real_idx >= 0 then
  202.                         if real_x ~= sto_x or real_z ~= sto_z then
  203.                             v0i = u8(st[i])
  204.                             v1i = u8(st[i] + 1)
  205.                             v2i = u8(st[i] + 2)
  206.  
  207.                             if v0i >= 0x7a or v1i >= 0x7a or v2i >= 0x7a then
  208.                                 color = "red"
  209.                             else
  210.                                 vlc = get_vlc_cache(sto_x, sto_z)
  211.  
  212.                                 if vlc ~= nil then
  213.  
  214.                                     v0x = vlc[v0i * 4]
  215.                                     v0z = vlc[v0i * 4 + 2]
  216.  
  217.                                     v1x = vlc[v1i * 4]
  218.                                     v1z = vlc[v1i * 4 + 2]
  219.  
  220.                                     v2x = vlc[v2i * 4]
  221.                                     v2z = vlc[v2i * 4 + 2]
  222.  
  223.                                     if (v0x == v1x) and (v1x == v2x) and (v0z == v1z) and (v1z == v2z) then
  224.                                         ws = u8(st[i] + 3)
  225.                                         if bit.band(bit.lshift(1, bit.band(ws, 0x1f)), 0x721b6f83) ~= 0 then
  226.                                             color = "lime"
  227.                                         else
  228.                                             color = "orange"
  229.                                         end
  230.                                     else
  231.                                         color = "yellow"
  232.                                     end
  233.                                 else
  234.                                     color = "pink"
  235.                                 end
  236.                             end
  237.                         else
  238.                             color = "white"
  239.                         end
  240.  
  241.                         if sto_idx >= 0 then
  242.                             gui.text(0, (i+2)*16, string.format("st%d (c%02d %02d-%02d) [%03d c%02d %02d-%02d] %08X", i, sto_idx, sto_x, sto_z, tri_num, real_idx, real_x, real_z, st[i]), color, "topright")
  243.                         else
  244.                             gui.text(0, (i+2)*16, string.format("st%d (cXX %02d-%02d) [%03d c%02d %02d-%02d] %08X", i, sto_x, sto_z, tri_num, real_idx, real_x, real_z, st[i]), color, "topright")
  245.                         end
  246.                     end
  247.                 end
  248.                 i = i + 1
  249.             end
  250.  
  251.             i = 0
  252.             while i < WORLD_CHUNK_HEADER_COUNT do
  253.                 if x_chunk == wmcx[i] and z_chunk == wmcz[i] then
  254.                     color = "lime"
  255.                 elseif math.abs(x_chunk - wmcx[i]) <= 1 and math.abs(z_chunk - wmcz[i]) <= 1 then
  256.                     color = "white"
  257.                 elseif math.abs(x_chunk - wmcx[i]) <= 2 and math.abs(z_chunk - wmcz[i]) <= 2 then
  258.                     color = "yellow"
  259.                 else
  260.                     color = "red"
  261.                 end
  262.                 if enable_draw_map then
  263.                     gui.drawRectangle(MAP_X + 12 * wmcx[i], MAP_Y + 12 * wmcz[i],11,11,color)
  264.                     local textColor = color
  265.                     if SELECTIONS[i] ~= nil then
  266.                         textColor = "pink"
  267.                     end
  268.                     gui.drawText(MAP_X + 12 * wmcx[i], MAP_Y + 12 * wmcz[i], string.format("%02d", i), textColor, nil, 8)
  269.                 end
  270.                 local nextPtr = u32(WORLD_CHUNK_HEADERS + i * WORLD_CHUNK_HEADER_SIZE)
  271.                 local nextIdx
  272.                 if nextPtr == 0 then
  273.                     nextIdx = -1
  274.                 else
  275.                     nextIdx = math.floor((nextPtr - WORLD_CHUNK_HEADERS) / WORLD_CHUNK_HEADER_SIZE)
  276.                 end
  277.                 gui.text(0, (31-i)*16, string.format("c%02d %02d-%02d %02d -> c%02d", i, wmcx[i], wmcz[i], wm_ll_order[i], nextIdx), color, "bottomright")
  278.                 i = i + 1
  279.             end
  280.  
  281.             local auxPtr = u32(WORLD_CHUNK_LOAD_LL_HEAD)
  282.             if auxPtr == 0 then
  283.                 gui.text(0, 33*16, "No load list", "white", "bottomright")
  284.             else
  285.                 gui.text(0, 33*16, string.format("Load: c%02d", math.floor((auxPtr - WORLD_CHUNK_HEADERS) / WORLD_CHUNK_HEADER_SIZE)), "white", "bottomright")
  286.             end
  287.  
  288.             local mainPtr = u32(WORLD_CHUNK_LL_HEAD)
  289.             if mainPtr == 0 then
  290.                 gui.text(0, 34*16, "No main list", "white", "bottomright")
  291.             else
  292.                 gui.text(0, 34*16, string.format("Main: c%02d", math.floor((mainPtr - WORLD_CHUNK_HEADERS) / WORLD_CHUNK_HEADER_SIZE)), "white", "bottomright")
  293.             end
  294.  
  295.             local nfPtr = u32(0x109D38)
  296.             if nfPtr == 0 then
  297.                 gui.text(0, 35*16, "No Next Free", "white", "bottomright")
  298.             else
  299.                 gui.text(0, 35*16, string.format("Next Free: c%02d", math.floor((nfPtr - WORLD_CHUNK_HEADERS) / WORLD_CHUNK_HEADER_SIZE)), "white", "bottomright")
  300.             end
  301.  
  302.             local loadedPtr = u32(WORLD_CHUNK_LOADED_LL_HEAD)
  303.             if loadedPtr == 0 then
  304.                 gui.text(0, 36*16, "No Loaded", "white", "bottomright")
  305.             else
  306.                 gui.text(0, 36*16, string.format("Loaded: c%02d", math.floor((loadedPtr - WORLD_CHUNK_HEADERS) / WORLD_CHUNK_HEADER_SIZE)), "white", "bottomright")
  307.             end
  308.  
  309.             if enable_draw_map then
  310.                 local target_x, target_z, target_idx
  311.                 for target_idx in pairs(TARGETS) do
  312.                     target_x = math.floor(target_idx % 36)
  313.                     target_z = math.floor(target_idx / 36)
  314.                     gui.drawRectangle(MAP_X + 12 * target_x, MAP_Y + 12 * target_z, 11, 11, TARGETS[target_idx])
  315.                 end
  316.             end
  317.         end
  318.     end
  319.  
  320.     function draw_wmrng()
  321.         local WMRNG_IDX = 0x10AE58
  322.         local WMRNG_BUF = 0x10AE5C
  323.  
  324.         local WM_FRACTION = 0x11627C
  325.         local WM_DANGER = 0x116284
  326.  
  327.         local ROWS = 30
  328.         local COLUMNS = 18
  329.  
  330.         local MAIN_COL_POS = 17
  331.  
  332.         local i, j
  333.  
  334.         local danger = s32(WM_DANGER)
  335.         local frac = s32(WM_FRACTION)
  336.         local curr_idx = u32(WMRNG_IDX)
  337.  
  338.         local idx = curr_idx - frac + COLUMNS - MAIN_COL_POS
  339.         local val = nil
  340.  
  341.         local color = nil
  342.  
  343.         local danger_increase = 512
  344.  
  345.         if PLAYER == 0 then
  346.             return
  347.         end
  348.  
  349.         function rng(_idx)
  350.             local k = 0
  351.             if _idx < 0 then
  352.                 return nil
  353.             elseif _idx < 0x209 then
  354.                 return u8(WMRNG_BUF + _idx)
  355.             elseif _idx < 0x412 then
  356.                 while _idx >= 0x209 do
  357.                     k = bit.bxor(k, u8(WMRNG_BUF + (_idx - 0x209)))
  358.                     _idx = _idx - 32
  359.                 end
  360.                 return bit.bxor(k, u8(WMRNG_BUF + _idx))
  361.             else
  362.                 return nil
  363.             end
  364.         end
  365.  
  366.         gui.text(0, 16*(ROWS+3), string.format("danger: %d", danger), nil, "bottomleft")
  367.         gui.text(0, 16*(ROWS+2), string.format("frac: %d", frac), nil, "bottomleft")
  368.         gui.text(0, 16*(ROWS+1), string.format("idx: %03d", curr_idx), nil, "bottomleft")
  369.  
  370.         if enable_wmrng then
  371.             i = 0
  372.             while i < ROWS do
  373.                 j = 0
  374.                 while j < COLUMNS do
  375.                     val = rng(idx)
  376.                     if val ~= nil then
  377.                         if j % 18 == MAIN_COL_POS or (idx - curr_idx == 1)  then
  378.                             if i * ROWS + j >= 0 then
  379.                                 if val < bit.rshift(danger + (i + 1) * danger_increase, 8) then
  380.                                     color = "red"
  381.                                 else
  382.                                     color = "lime"
  383.                                 end
  384.                             end
  385.                         else
  386.                             if i * ROWS + j >= 0 then
  387.                                 if val < bit.rshift(danger + (i + 1) * danger_increase, 8) then
  388.                                     color = "pink"
  389.                                 else
  390.                                     color = "lightgreen"
  391.                                 end
  392.                             end
  393.                         end
  394.                         gui.text(30*j, 16*(ROWS - i - 1), string.format("%02X ", val), color, "bottomleft")
  395.                     end
  396.                     j = j + 1
  397.                     idx = idx + 1
  398.                 end
  399.                 i = i + 1
  400.             end
  401.         end
  402.     end
  403.  
  404.     function frame()
  405.         gui.clearGraphics()
  406.         if u8(CURRENT_MODULE) == 3 then
  407.             if enable_ffmode then
  408.                 buf_ff()
  409.             end
  410.             draw_wmtris()
  411.             draw_wmrng()
  412.         end
  413.         emu.frameadvance()
  414.     end
  415.  
  416.     while true do
  417.         frame()
  418.     end
  419. end
  420.  
  421. ff7_wmtris_main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement