Advertisement
Guest User

Thinkzerker (WIP) - Simulate Exdeath battle outcome from FFV

a guest
Apr 27th, 2022
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 33.08 KB | None | 0 0
  1. --Welcome, to Die
  2. --DEHUMANIZE AND FACE TO TABLE (Raw C0FEC0 pRNG table)
  3. COFE = {0x07,0xB6,0xF0,0x1F,0x55,0x5B,0x37,0xE3,0xAE,0x4F,0xB2,0x5E,0x99,0xF6,0x77,0xCB,0x60,0x8F,0x43,0x3E,0xA7,0x4C,0x2D,0x88,0xC7,0x68,0xD7,0xD1,0xC2,0xF2,0xC1,0xDD,0xAA,0x93,0x16,0xF7,0x26,0x04,0x36,0xA1,0x46,0x4E,0x56,0xBE,0x6C,0x6E,0x80,0xD5,0xB5,0x8E,0xA4,0x9E,0xE7,0xCA,0xCE,0x21,0xFF,0x0F,0xD4,0x8C,0xE6,0xD3,0x98,0x47,0xF4,0x0D,0x15,0xED,0xC4,0xE4,0x35,0x78,0xBA,0xDA,0x27,0x61,0xAB,0xB9,0xC3,0x7D,0x85,0xFC,0x95,0x6B,0x30,0xAD,0x86,0x00,0x8D,0xCD,0x7E,0x9F,0xE5,0xEF,0xDB,0x59,0xEB,0x05,0x14,0xC9,0x24,0x2C,0xA0,0x3C,0x44,0x69,0x40,0x71,0x64,0x3A,0x74,0x7C,0x84,0x13,0x94,0x9C,0x96,0xAC,0xB4,0xBC,0x03,0xDE,0x54,0xDC,0xC5,0xD8,0x0C,0xB7,0x25,0x0B,0x01,0x1C,0x23,0x2B,0x33,0x3B,0x97,0x1B,0x62,0x2F,0xB0,0xE0,0x73,0xCC,0x02,0x4A,0xFE,0x9B,0xA3,0x6D,0x19,0x38,0x75,0xBD,0x66,0x87,0x3F,0xAF,0xF3,0xFB,0x83,0x0A,0x12,0x1A,0x22,0x53,0x90,0xCF,0x7A,0x8B,0x52,0x5A,0x49,0x6A,0x72,0x28,0x58,0x8A,0xBF,0x0E,0x06,0xA2,0xFD,0xFA,0x41,0x65,0xD2,0x4D,0xE2,0x5C,0x1D,0x45,0x1E,0x09,0x11,0xB3,0x5F,0x29,0x79,0x39,0x2E,0x2A,0x51,0xD9,0x5D,0xA6,0xEA,0x31,0x81,0x89,0x10,0x67,0xF5,0xA9,0x42,0x82,0x70,0x9D,0x92,0x57,0xE1,0x3D,0xF1,0xF9,0xEE,0x08,0x91,0x18,0x20,0xB1,0xA5,0xBB,0xC6,0x48,0x50,0x9A,0xD6,0x7F,0x7B,0xE9,0x76,0xDF,0x32,0x6F,0x34,0xA8,0xD0,0xB8,0x63,0xC8,0xC0,0xEC,0x4B,0xE8,0x17,0xF8}
  4.  
  5. THINK_STATE = 0
  6.  
  7. TRUE_WHEEL = {}
  8.  
  9. function MAKE_TRUE_WHEEL()
  10.     --Builds the effective 512-unit wheel created by weaving A and B together
  11.     WHEEL_A = memory.readbyte(0x3A)
  12.     WHEEL_B = memory.readbyte(0x3B)
  13.     console.writeline("WheeL SeeD: ".. WHEEL_A .."|" ..WHEEL_B)
  14.  
  15.  
  16.     WHEEL_DIF = WHEEL_B - WHEEL_A
  17.     if WHEEL_DIF < 0 then WHEEL_DIF = WHEEL_DIF + 256 end
  18.  
  19.     WHEEL_SELECT = memory.readbyte(0x7C55)
  20.  
  21.     for TRUE_WHEEL_INDEX = 0, 512 do
  22.         --Toggle the selector
  23.         if WHEEL_SELECT == 0 then WHEEL_SELECT = 1 else WHEEL_SELECT = 0 end
  24.         --Read COFE from proper wheel
  25.         if WHEEL_SELECT == 0 then
  26.             local TEMP_A = (TRUE_WHEEL_INDEX - TRUE_WHEEL_INDEX%2) / 2
  27.             TRUE_WHEEL[TRUE_WHEEL_INDEX+1] = COFE[TEMP_A+1]
  28.             --WHEEL_A = WHEEL_A + 1
  29.             --if WHEEL_A > 255 then WHEEL_A = 0 end
  30.         else
  31.             TRUE_WHEEL[TRUE_WHEEL_INDEX+1] = COFE[WHEEL_DIF+1]
  32.             WHEEL_DIF = WHEEL_DIF + 1
  33.             if WHEEL_DIF > 255 then WHEEL_DIF = 0 end
  34.         end
  35.  
  36.     end
  37.  
  38. end
  39.  
  40. function MAKE_FAKE_WHEEL(A, B)
  41.     --Builds the effective 512-unit wheel created by weaving A and B together
  42.     WHEEL_A = A
  43.     WHEEL_B = B
  44.     --console.writeline("WheeL SeeD: ".. WHEEL_A .."|" ..WHEEL_B)
  45.    
  46.    
  47.     WHEEL_DIF = WHEEL_B - WHEEL_A
  48.     if WHEEL_DIF < 0 then WHEEL_DIF = WHEEL_DIF + 256 end
  49.    
  50.     local WHEEL_SELECT = memory.readbyte(0x7C55)
  51.    
  52.     for TRUE_WHEEL_INDEX = 0, 512 do
  53.         --Toggle the selector
  54.         if WHEEL_SELECT == 0 then WHEEL_SELECT = 1 else WHEEL_SELECT = 0 end
  55.         --Read COFE from proper wheel
  56.         if WHEEL_SELECT == 0 then
  57.             local TEMP_A = (TRUE_WHEEL_INDEX - TRUE_WHEEL_INDEX%2) / 2
  58.             TRUE_WHEEL[TRUE_WHEEL_INDEX+1] = COFE[TEMP_A+1]
  59.             --WHEEL_A = WHEEL_A + 1
  60.             --if WHEEL_A > 255 then WHEEL_A = 0 end
  61.         else
  62.             TRUE_WHEEL[TRUE_WHEEL_INDEX+1] = COFE[WHEEL_DIF+1]
  63.             WHEEL_DIF = WHEEL_DIF + 1
  64.             if WHEEL_DIF > 255 then WHEEL_DIF = 0 end
  65.         end
  66.        
  67.     end
  68.    
  69. end
  70.  
  71. function GET_TRUE_INDEX()
  72.     local WHEEL_A = memory.readbyte(0x3A)
  73.     local WHEEL_B = memory.readbyte(0x3B)
  74.     local WHEEL_SELECT = memory.readbyte(0x7C55)
  75.    
  76.     if WHEEL_SELECT == 1 then
  77.         return WHEEL_A * 2
  78.     else
  79.         if (WHEEL_A * 2) - 1 >= 0 then
  80.             return (WHEEL_A * 2) - 1
  81.         else
  82.             return ((WHEEL_A * 2) - 1) + 512
  83.         end
  84.     end
  85. end
  86.  
  87. function GET_FAKE_INDEX(A, B)
  88.     local FAKE_A = A
  89.     local FAKE_B = B
  90.     local FAKE_SELECT = 0
  91.    
  92.     if FAKE_SELECT == 1 then
  93.         return FAKE_A * 2
  94.     else
  95.         if (FAKE_A * 2) - 1 >= 0 then
  96.             return (FAKE_A * 2) - 1
  97.         else
  98.             return ((FAKE_A * 2) - 1) + 512
  99.         end
  100.     end
  101. end
  102.  
  103. function THINCREMENT(A)
  104.     local X = A+1
  105.     if X > 511 then X = 0 end
  106.     return X
  107. end
  108.  
  109. function BAT_RNG_NEXT(R)
  110.     SIM_INDEX = THINCREMENT(SIM_INDEX)
  111.     return TRUE_WHEEL[SIM_INDEX+1] % R
  112. end
  113.  
  114. function RAW_THINK()
  115. --Base Variables to read
  116.     RNG_load_offset = memory.readbyte(0x94A)
  117.     RNG_big_wheel_index = memory.readbyte(0x16A7)
  118.     RNG_big_wheel_offset = memory.readbyte(0xAF9)
  119.    
  120.     RNG_BatWheel_A = memory.readbyte(0x3A)
  121.     RNG_BatWheel_B = memory.readbyte(0x3B)
  122.     RNG_BatWheel_Selector = memory.readbyte(0x7C55)
  123.    
  124.     RNG_last_used_range = memory.readbyte(0x7CB9)
  125.     RNG_last_result = memory.readbyte(0x7CBD)
  126.    
  127.     ESCAPE_CHANCE = memory.readbyte(0x3EF0)
  128.    
  129.     DIRECT_TED_HP = memory.readbyte(0x2306) + (memory.readbyte(0x2307) *256)
  130.    
  131.     --Enemy Speeds. To find: 27, 35, 35, 55
  132.     E_SPEED = {}
  133.     E_SPEED[1] = memory.readbyte(0x2229)
  134.     E_SPEED[2] = memory.readbyte(0x22A9)
  135.     E_SPEED[3] = memory.readbyte(0x2329) -- 44 +/- 1
  136.     E_SPEED[4] = memory.readbyte(0x23A9) -- 27
  137.     E_SPEED[5] = memory.readbyte(0x2429) -- 35
  138.     E_SPEED[6] = memory.readbyte(0x24A9) -- 55
  139.     E_SPEED[7] = memory.readbyte(0x2529) -- 35
  140.     E_SPEED[8] = memory.readbyte(0x25A9)
  141.    
  142.     --ATBs
  143.     ATB = {}
  144.     ATB[1] = memory.readbyte(0x3D7F)
  145.     ATB[2] = memory.readbyte(0x3D8A)
  146.     ATB[3] = memory.readbyte(0x3D95)
  147.     ATB[4] = memory.readbyte(0x3DA0)
  148.    
  149.     ATB[5] = memory.readbyte(0x3DAB)
  150.     ATB[6] = memory.readbyte(0x3DB6)
  151.     ATB[7] = memory.readbyte(0x3DC1)
  152.     ATB[8] = memory.readbyte(0x3DCC)
  153.     ATB[9] = memory.readbyte(0x3DD7)
  154.     ATB[10] = memory.readbyte(0x3DE2)
  155.     ATB[11] = memory.readbyte(0x3DED)
  156.     ATB[12] = memory.readbyte(0x3DF8)
  157.    
  158.     --Character Priority List
  159.     PHANTOM_SHUFFLER = {}
  160.    
  161.     for PAHNTOM_INDEX = 0, 11 do
  162.         PHANTOM_SHUFFLER[PAHNTOM_INDEX+1] = memory.readbyte(0x3E93+PAHNTOM_INDEX)
  163.     end
  164.     --[[
  165.     RNG_BIG_NEXT = {}
  166.  
  167.     for BIG_INDEX = 0, 8 do
  168.         TEMP_BIG_INDEX = RNG_big_wheel_index+BIG_INDEX
  169.         if TEMP_BIG_INDEX > 255 then TEMP_BIG_INDEX = TEMP_BIG_INDEX - 256 end
  170.         RNG_BIG_NEXT[BIG_INDEX+1] = COFE[TEMP_BIG_INDEX+1] - RNG_big_wheel_offset
  171.         if RNG_BIG_NEXT[BIG_INDEX+1] < 0 then RNG_BIG_NEXT[BIG_INDEX+1] = RNG_BIG_NEXT[BIG_INDEX+1] + 256 end
  172.     end
  173.     --]]
  174.    
  175.     byte_sum_1 = 0
  176.     byte_sum_2 = 0
  177.    
  178.     for byte_sum_index = 0, 1000 do
  179.         byte_sum_1 = (byte_sum_1 + memory.readbyte(byte_sum_index)) % 256
  180.     end
  181.     byte_sum_1 = (byte_sum_1 + RNG_big_wheel_offset) % 256
  182.     byte_sum_2 = byte_sum_1
  183.     for byte_sum_index = 1000, 2000 do
  184.         byte_sum_2 = (byte_sum_2 + memory.readbyte(byte_sum_index)) % 256
  185.     end
  186.    
  187.    
  188.    
  189.     gui.text(0,0, "Loading Offset: " .. string.format(RNG_load_offset) )
  190.    
  191.     gui.text(0,16, "BigWheel Offset: " .. string.format(RNG_big_wheel_offset) )
  192.     gui.text(0,32, "Bigwheel Index: " .. string.format(RNG_big_wheel_index) )
  193.    
  194.     --gui.text(0,48, "BigWheel Next: " )
  195.     --for gui_index=0,8 do
  196.     --  gui.text(16,64+(16*gui_index), string.format(RNG_BIG_NEXT[gui_index+1]))
  197.     --end
  198.     gui.text(380,0, "ByteSum A: " .. string.format(byte_sum_1) )
  199.     gui.text(380,16, "ByteSum B: " .. string.format(byte_sum_2) )
  200.    
  201.     gui.text(380,32, "ESC%: ".. string.format(ESCAPE_CHANCE))
  202.    
  203.     gui.text(380,48, "=Battle RNG=")
  204.     gui.text(380,64, "A:"..string.format(RNG_BatWheel_A))
  205.     gui.text(380,80, "B:"..string.format(RNG_BatWheel_B))
  206.     if(RNG_BatWheel_Selector == 1) then
  207.         gui.text(364,64, ">")
  208.     else
  209.         gui.text(364,80, ">")
  210.     end
  211.     --
  212.     gui.text(308, 96, "Last RNG: " .. string.format(RNG_last_result) .. " /" .. string.format(RNG_last_used_range))
  213.    
  214.     gui.text(460, 128, "Last ->")
  215.     gui.text(460, 144, "Next ->")
  216.     for gui_index=0,27 do
  217.         --Starting 8 spaces back,
  218.         POINTY = GET_TRUE_INDEX()+gui_index-8
  219.         --Show true wheel around true index
  220.         if POINTY > 511 then POINTY = POINTY - 512
  221.         elseif POINTY < 0 then POINTY = POINTY+512
  222.         end
  223.         RANDO = TRUE_WHEEL[POINTY+1]
  224.        
  225.         --Color math
  226.         if RANDO % 4 == 0  then
  227.             rng_color = "magenta"
  228.         elseif RANDO % 3 == 0 then
  229.             rng_color = "white"
  230.         else
  231.             rng_color = "white"
  232.         end
  233.        
  234.         gui.text(540,(16*gui_index), string.format(RANDO), rng_color)
  235.        
  236.     end
  237.    
  238.     THINK_INDEX = GET_TRUE_INDEX()
  239.     gui.text(308,112,"ShinDex : ".. string.format(THINK_INDEX))
  240.    
  241.     --[[
  242.     --Example zerk-think
  243.     --Select target - Draw cards until valid target. [Just 2 for TED]
  244.     while(TRUE_WHEEL[THINK_INDEX+1] % 8 ~= 2) do
  245.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  246.        
  247.     end
  248.     --Store the targeting card result, then consume
  249.     ZERK_THINK_1 = ("Target: ".. string.format(TRUE_WHEEL[THINK_INDEX+1] %8))
  250.     THINK_INDEX = THINCREMENT(THINK_INDEX)
  251.     --Is this quake?
  252.     --THINK_INDEX = THINK_INDEX + 1
  253.     if(TRUE_WHEEL[THINK_INDEX+1] %100 < 25) then
  254.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  255.         --Do Quake
  256.         ZERK_THINK_2 = "Quake"
  257.         --Damage Roll
  258.         MAGIC_ATT = (90 + (TRUE_WHEEL[THINK_INDEX+1] % 12)) * 1.5
  259.         QUAKE_DMG = (MAGIC_ATT - 25) * 42
  260.         ZERK_THINK_3 = "DMG: " .. QUAKE_DMG
  261.     else
  262.         --Or, do axe
  263.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  264.         ZERK_THINK_2 = "Axe"
  265.         --Hit Chance
  266.         if (TRUE_WHEEL[THINK_INDEX+1] %100 < 80) then
  267.             ZERK_THINK_3 = "[Hit]"
  268.             THINK_INDEX =THINCREMENT(THINK_INDEX)
  269.             --Evade Chance
  270.             if (TRUE_WHEEL[THINK_INDEX+1] %100 >= 10) then
  271.                 THINK_INDEX = THINCREMENT(THINK_INDEX)
  272.                 --Damage Roll
  273.                 AXE_ATT = (29 + (TRUE_WHEEL[THINK_INDEX+1] %59))*1.5
  274.                 AXE_DMG = (AXE_ATT -8) * 39
  275.                 ZERK_THINK_3 = ZERK_THINK_3 .. "DMG: " .. AXE_DMG
  276.             else
  277.                 --Evade
  278.                 ZERK_THINK_3 = ZERK_THINK_3 .. "[Evade]"
  279.             end
  280.         else
  281.             ZERK_THINK_3 = "[Miss]"
  282.         end
  283.        
  284.     end
  285.     --]]
  286.     --[[
  287.     --Example TED-think
  288.     THINK_INDEX = GET_TRUE_INDEX()
  289.     --Select target - Draw cards until valid target. [Just 0 for Faris]
  290.    
  291.     THINK_INDEX = THINCREMENT(THINK_INDEX)
  292.     TED_THINK_1 = TRUE_WHEEL[THINK_INDEX+1] % 3
  293.    
  294.     THINK_INDEX = THINCREMENT(THINK_INDEX) --Fake Target
  295.     THINK_INDEX = THINCREMENT(THINK_INDEX) --SeB
  296.    
  297.     while(TRUE_WHEEL[THINK_INDEX+1] % 4 ~= 0) do
  298.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  299.     end
  300.    
  301.     if TED_THINK_1 == 0 then
  302.         TED_THINK_1 = "FIGHT"
  303.         --Accuracy check, always passes
  304.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  305.         --Evade Check vs 33% Aegis
  306.         if(TRUE_WHEEL[THINK_INDEX] % 100 >= 33) then
  307.             --Damage roll
  308.             THINK_INDEX = THINCREMENT(THINK_INDEX)
  309.             TED_ATTACK_THINK = ((111 + TRUE_WHEEL[THINK_INDEX+1] % 13) - 55)/2
  310.             TED_THINK_2 = "Damage" .. (TED_ATTACK * 17)
  311.         else
  312.             TED_THINK_2 = "[BLOCKED]"
  313.         end
  314.     elseif TED_THINK_1 == 1 then
  315.         TED_THINK_1 = "White Hole"
  316.         --Aegis Block
  317.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  318.         if (TRUE_WHEEL[THINK_INDEX] % 100 >= 33) then
  319.             --WH Accuracy
  320.             THINK_INDEX = THINCREMENT(THINK_INDEX)
  321.             if (TRUE_WHEEL[THINK_INDEX+1] % 100 < 77) then
  322.                 TED_THINK_2 = "[VOID]"
  323.             else
  324.                 TED_THINK_2 = "[MISS]"
  325.             end
  326.         else
  327.             TED_THINK_2 = "[BLOCK]"
  328.         end
  329.                            
  330.     else
  331.         TED_THINK_1 = "Fight or Nothing"
  332.         --Accuracy check, always passes
  333.         THINK_INDEX = THINCREMENT(THINK_INDEX)
  334.         --Evade Check vs 33% Aegis
  335.         if(TRUE_WHEEL[THINK_INDEX] % 100 >= 33) then
  336.             --Damage roll
  337.             THINK_INDEX = THINCREMENT(THINK_INDEX)
  338.             TED_ATTACK_THINK = ((111 + TRUE_WHEEL[THINK_INDEX+1] % 13) - 55)/2
  339.             TED_THINK_2 = "Damage: " .. (TED_ATTACK * 17)
  340.         else
  341.             TED_THINK_2 = "[BLOCKED]"
  342.         end
  343.     end
  344.     --]]
  345.    
  346.     --gui.text(0, 184, "THINKING...")
  347.     --gui.text(0, 200, ZERK_THINK_1)
  348.     --gui.text(0, 216, ZERK_THINK_2)
  349.     --gui.text(0, 232, ZERK_THINK_3)
  350.    
  351.     --gui.text(0,264,"TED Move: " .. TED_THINK_1)
  352.     --gui.text(0,280, TED_THINK_2)
  353.    
  354.     gui.text(160, 328, string.format(DIRECT_TED_HP))
  355.    
  356.     for PHANTOM_GUI = 0, 11 do
  357.         gui.text(0+(PHANTOM_GUI*24), 64, string.format(PHANTOM_SHUFFLER[PHANTOM_GUI+1]), "green")
  358.     end
  359.    
  360.     gui.text(64,384, "Party ATB:","green")
  361.     gui.text(224,384, "Enemy ATB & SPD:","green")
  362.     for ATB_GUI = 0, 11 do
  363.        
  364.         gui.text(64 + (ATB_GUI *40), 400, string.format(ATB[ATB_GUI+1]),"cyan")
  365.     end
  366.    
  367.     for SPEED_GUI = 0, 7 do
  368.         gui.text(224 +(SPEED_GUI*40), 416, string.format(E_SPEED[SPEED_GUI+1]),"magenta")
  369.     end
  370. end
  371.  
  372. function ZERK_THINK()
  373.    
  374. end
  375.  
  376. function ZERK_AIM()
  377.     --Zerk Think
  378.     --Fake Target Select, seemingly unused RNG value
  379.     --SIM_INDEX = THINCREMENT(SIM_INDEX)
  380.     --Select target - Draw cards until valid target. [Just 2 for TED]
  381.     SIM_INDEX = THINCREMENT(SIM_INDEX)
  382.     while(TRUE_WHEEL[SIM_INDEX+1] % 8 ~= 2) do
  383.         SIM_INDEX = THINCREMENT(SIM_INDEX)
  384.     end
  385.    
  386.     return (TRUE_WHEEL[SIM_INDEX+1] % 8)
  387. end
  388.  
  389. function ZERK_EARTH_AXE()
  390.    
  391.     --Is this quake?
  392.     if(BAT_RNG_NEXT(100) < 25) then
  393.         --Do Quake
  394.         ZERK_MOVE = "QUAKE"
  395.         --Damage Roll
  396.         --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  397.         MAGIC_ATT = (90 + BAT_RNG_NEXT(12))
  398.         MAGIC_ATT = MAGIC_ATT + (MAGIC_ATT - MAGIC_ATT %2) /2 --Earth Boost
  399.         QUAKE_DMG = (MAGIC_ATT - 25) * 42
  400.         ZERK_DAMAGE = QUAKE_DMG
  401.     else
  402.         --Or, do axe
  403.         ZERK_MOVE = "AXE"
  404.         --Hit Chance
  405.         if (BAT_RNG_NEXT(100) < 80) then
  406.             ZERK_MOVE = ZERK_MOVE .. "[HIT]"
  407.             --Evade Chance
  408.             if (BAT_RNG_NEXT(100) >= 10) then
  409.                 --Damage Roll
  410.                 AXE_ATT = (29 + BAT_RNG_NEXT(59))
  411.                 AXE_ATT = AXE_ATT + ((AXE_ATT -  AXE_ATT % 2) / 2) --Pre-round, Zerk up
  412.                 AXE_ATT = AXE_ATT - 8 --TED Def
  413.                 AXE_DMG = AXE_ATT  * 39
  414.                 ZERK_DAMAGE = AXE_DMG
  415.             else
  416.                 --Evade
  417.                 ZERK_MOVE = ZERK_MOVE .. "[EVADE]"
  418.                 ZERK_DAMAGE = 0
  419.             end
  420.         else
  421.             ZERK_MOVE = "[MISS]"
  422.             ZERK_DAMAGE = 0
  423.         end
  424.        
  425.     end
  426. end
  427.  
  428. function TED_AIM(OLD_TARGET)
  429.     local TARGET = OLD_TARGET
  430.     --Monster Select target - Draw cards until valid target. [0 for Faris]
  431.     --SIM_INDEX = THINCREMENT(SIM_INDEX)
  432.     --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  433.     while(TARGET ~= 0) do
  434.         TARGET = BAT_RNG_NEXT(4)
  435.         --console.writeline("TED TRIES: "..TRUE_WHEEL[SIM_INDEX+1].."|"..TARGET)
  436.     end
  437.    
  438.     return TARGET
  439. end
  440.  
  441. function TED_AIM_REP()
  442.     local M_TARGET = BAT_RNG_NEXT(4)
  443.     while(M_TARGET ~= 0) do
  444.         M_TARGET = BAT_RNG_NEXT(4)
  445.         --console.writeline("TED TRIES: "..TRUE_WHEEL[SIM_INDEX+1].."|"..TARGET)
  446.     end
  447.     return M_TARGET
  448. end
  449.  
  450. function TED_NOTHING()
  451.     TED_MOVE = "NOTHING"
  452.     TED_TARGET = TED_AIM(TED_TARGET)
  453.     TED_DAMAGE = 0
  454. end
  455.  
  456. function TED_FIGHT()
  457.     TED_MOVE = "FIGHT"
  458.     --Take Aim.
  459.     TED_TARGET = TED_AIM(TED_TARGET)
  460.     --Accuracy check, always passes
  461.     SIM_INDEX = THINCREMENT(SIM_INDEX)
  462.     --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  463.     --Evade Check vs 33% Aegis
  464.     SIM_INDEX = THINCREMENT(SIM_INDEX)
  465.     --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  466.     if(TRUE_WHEEL[SIM_INDEX+1] % 100 >= 33) then
  467.         --Damage roll
  468.         SIM_INDEX = THINCREMENT(SIM_INDEX)
  469.         --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  470.         TED_ATTACK = ((111 + TRUE_WHEEL[SIM_INDEX+1] % 14) - 55)
  471.         TED_DAMAGE = TED_ATTACK * 8 --Halved for back row from 17 physM
  472.     else
  473.         TED_MOVE = TED_MOVE .. "[BLOCKED]"
  474.         TED_DAMAGE = 0
  475.     end
  476. end
  477.  
  478. function TED_WHITE_HOLE()
  479.     --Take Aim
  480.     TED_TARGET = TED_AIM(TED_TARGET)
  481.    
  482.     TED_MOVE = "White Hole"
  483.     --Aegis Block
  484.    
  485.     --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  486.     if (BAT_RNG_NEXT(100) < 33) then
  487.         --console.writeline("Aeg: " .. TRUE_WHEEL[SIM_INDEX+1])
  488.         TED_MOVE = TED_MOVE .. "[BLOCK]"
  489.     else
  490.         --console.writeline("Aeg: " .. TRUE_WHEEL[SIM_INDEX+1])
  491.         --WH Accuracy
  492.         if (BAT_RNG_NEXT(100) < 77) then
  493.             if (BAT_RNG_NEXT(100) < 20) then
  494.                 TED_MOVE = TED_MOVE .."[EVADE]"
  495.             else
  496.                 TED_MOVE = TED_MOVE .. "[VOID]"
  497.             end
  498.         else
  499.             TED_MOVE = TED_MOVE .. "[MISS]"
  500.         end
  501.     end
  502.                                    
  503.     TED_DAMAGE = 0
  504. end
  505.  
  506. function TED_REFLECT_AIM()
  507.     SIM_INDEX = THINCREMENT(SIM_INDEX)
  508.     --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  509.     while(TRUE_WHEEL[SIM_INDEX+1] % 8 ~= 2) do
  510.         SIM_INDEX = THINCREMENT(SIM_INDEX)
  511.     end
  512.     return TRUE_WHEEL[SIM_INDEX+1] % 8
  513. end
  514.  
  515. function TED_FLARE()
  516.     TED_MOVE = "FLARE"
  517.     --Take Aim
  518.     TED_TARGET = TED_AIM(TED_TARGET)
  519.     --Select reflected target - Draw cards until valid target. [Just 2 for Own damn face]
  520.     TED_TARGET = TED_REFLECT_AIM()
  521.     --Damage Roll v self
  522.     FLARE_ATT = 254 + BAT_RNG_NEXT(8)
  523.     TED_DAMAGE = FLARE_ATT * 11
  524.                                    
  525. end
  526.  
  527. function TED_HOLY()
  528.     TED_MOVE = "HOLY"
  529.     --Take Aim
  530.     TED_TARGET = TED_AIM(TED_TARGET)
  531.     --Select reflected target - Draw cards until valid target. [Just 2 for Own damn face]
  532.     TED_TARGET = TED_REFLECT_AIM()
  533.     --Damage roll v self
  534.     HOLY_ATT = 241 + BAT_RNG_NEXT(31)
  535.     TED_DAMAGE = (HOLY_ATT - 25) * 11
  536.                                    
  537. end
  538.  
  539. function TED_CONDEMN()
  540.     TED_TARGET = TED_AIM(TED_TARGET)
  541.     if(BAT_RNG_NEXT(100) >= 33) then
  542.         TED_MOVE = "CONDEMN - THEND"
  543.         NOT_CONDEMNED = false
  544.     else
  545.         TED_MOVE = "CONDEMN - [BLOCKED]"
  546.     end
  547. end
  548.  
  549. function TED_METEOR()
  550.     TED_MOVE = "METEOR"
  551.     TED_DAMAGE = 0
  552.     --Pick four targets
  553.     for METEOR_INDEX = 0, 3 do
  554.         TED_TARGET = TED_AIM_REP()
  555.         console.writeline("Target:" .. TED_TARGET .." R:" .. TRUE_WHEEL[SIM_INDEX+1])
  556.     end
  557.     --Roll Damage
  558.     for METEOR_INDEX = 0, 3 do
  559.         --if(BAT_RNG_NEXT(100) >= 33) then
  560.             METEOR_ATT = (50+BAT_RNG_NEXT(151))-10
  561.             METEOR_DMG = (METEOR_ATT * 14)
  562.             TED_DAMAGE = TED_DAMAGE + METEOR_DMG
  563.             console.writeline("Met:" .. METEOR_DMG .. " R:" .. TRUE_WHEEL[SIM_INDEX+1])
  564.         --end
  565.     end
  566.    
  567. end
  568.  
  569. function TED_WOUND(D, LOUD)
  570.     TED_HP_BEFORE = TED_HP
  571.     TED_HP = TED_HP - D
  572.     if TED_HP_BEFORE >= 30000 then
  573.         if TED_HP < 30000 then
  574.             TED_STATE = 1
  575.             TED_SCRIPT = 0
  576.             if LOUD then console.writeline("==TED PHASE 2 BEGIN==") end
  577.         end
  578.     elseif TED_HP_BEFORE >= 10000 then
  579.         if TED_HP < 10000 then
  580.             TED_STATE = 2
  581.             TED_SCRIPT = 0
  582.             if LOUD then console.writeline("==TED PHASE 3 BEGIN==") end
  583.         end
  584.     end
  585.     if LOUD then console.writeline("TED HP:" .. TED_HP) end
  586. end
  587.  
  588.  
  589. --Fight prediction routine
  590. function THUNDERING_PROGNOSTICATOR(LOUD_MODE, TRUE_MODE, A, B)
  591.    
  592.     --Init Stuff. Wheel setup, character data
  593.     if(TRUE_MODE) then
  594.         SIM_INDEX = GET_TRUE_INDEX()
  595.     else
  596.         SIM_INDEX = GET_FAKE_INDEX(A, B)
  597.     end
  598.     --ToDo: Dial these numbers
  599.     TED_HP = 49001
  600.     TED_STATE = 0  --Track phases of fight
  601.     TED_SCRIPT = 0 --Offset value for script reading
  602.    
  603.     FARIS_HP = 9999
  604.     FARIS_SPEED = 17
  605.    
  606.     ACTION_QUEUE = {}
  607.    
  608.     --Speed Array
  609.     SIM_SPEEDS = {17,1,1,1,1,1,44,27,35,55,35,0}
  610.     --Speed offsets
  611.     for speed_index = 0, 7 do
  612.         SIM_INDEX = THINCREMENT(SIM_INDEX)
  613.         speed_roll = TRUE_WHEEL[SIM_INDEX+1] % 3
  614.         --console.writeline(speed_index .. " Roll: ".. TRUE_WHEEL[SIM_INDEX+1] .. " > " .. speed_roll)
  615.         if speed_roll == 2 then speed_roll = -1 end
  616.         SIM_SPEEDS[speed_index+5] = SIM_SPEEDS[speed_index+5] + speed_roll
  617.     end
  618.     --console.writeline("Speeds: ")
  619.     --console.writeline(SIM_SPEEDS)
  620.     --Initiative shuffle
  621.     SIM_INITIATIVES = {}
  622.     while( table.getn(SIM_INITIATIVES) < 12) do
  623.         --get a number
  624.         SIM_INDEX = THINCREMENT(SIM_INDEX)
  625.         local initiative_roll = TRUE_WHEEL[SIM_INDEX+1] % 12
  626.         --Check for presence in init array
  627.         not_got_this = true
  628.         for check_this = 0, table.getn(SIM_INITIATIVES) do
  629.             if SIM_INITIATIVES[check_this+1] == initiative_roll then not_got_this = false end
  630.         end
  631.        
  632.         if not_got_this then table.insert(SIM_INITIATIVES, initiative_roll) end
  633.        
  634.     end
  635.     --console.writeline("Init:")
  636.     --console.writeline(SIM_INITIATIVES)
  637.    
  638.     --ATB setup & fight prep
  639.     --ATB array of characters read in Initiative order
  640.     --1-4 Players, 5 & 6 ???, 7 TED, 8-12 NED
  641.     SIM_ATBS = {60,1,1,1,120 - SIM_SPEEDS[5],120 - SIM_SPEEDS[6],120 - SIM_SPEEDS[7],120 - SIM_SPEEDS[8],120 - SIM_SPEEDS[9],120 - SIM_SPEEDS[10],120 - SIM_SPEEDS[11],120 - SIM_SPEEDS[12] }
  642.     SIM_READY_FLAGS = {0,0,0,0,0,0,0,0,0,0,0,0}
  643.     FIGHT_CLOCK = 0
  644.     --ATB Pre-igniter, progress to first act. No RNG Calls
  645.     SIM_ATBS[7] = 2 --Still Bad idea, replace eventually
  646.    
  647.    
  648.     --Killswitch for fight simulator
  649.     NOT_CONDEMNED = true
  650.     --Fight loop begins
  651.     while (FARIS_HP > 0 and TED_HP > 0 and FIGHT_CLOCK <4096 and NOT_CONDEMNED) do
  652.         --ATB resolved
  653.         NONE_READY = true
  654.         NONE_ACTED = true
  655.         --In initiative order (Only 0 and 6 for now)
  656.         for i = 0, 12 do
  657.             --get next character index
  658.             CHARACTER = SIM_INITIATIVES[i+1]
  659.             --Filter for Faris or TED
  660.             if CHARACTER == 0 or CHARACTER == 6 then
  661.                 --If Unready, Tick ATB and check for ready
  662.                 if SIM_READY_FLAGS[CHARACTER+1] == 0 then
  663.                     --Tick ATB
  664.                    
  665.                     SIM_ATBS[CHARACTER+1] = SIM_ATBS[CHARACTER+1] - 1
  666.                    
  667.                     --If now ready, set 'em up
  668.                     if SIM_ATBS[CHARACTER+1] <= 0 and NONE_READY and NONE_ACTED then
  669.                         NONE_READY = false
  670.                         table.insert(ACTION_QUEUE, CHARACTER)
  671.                         --Turn's up, do a think
  672.                         if CHARACTER == 0 then
  673.                             --Zerk has no ready action
  674.                             --Zerk knows.
  675.                             console.writeline(FIGHT_CLOCK .. " ZERK Knows." )
  676.                         end
  677.                         --TED Readies Action
  678.                         if CHARACTER == 6 then
  679.                             --Pick a move
  680.                             TED_MOVE_SELECT = BAT_RNG_NEXT(3)
  681.                             RAW_SELECT = TRUE_WHEEL[SIM_INDEX+1]
  682.                             --Parse move-Select via Script rules
  683.                             --  AI SCRIPT:
  684.                             --  State 2 Condition:HP < 10000{
  685.                             --      0{Meteo,Fight,Nothing}
  686.                             --  State 1 Condition:HP < 30000{
  687.                             --      0{Flare,Holy,Fight}
  688.                             --      1{Fight,Fight,White Hole}
  689.                             --      2{Fight,White Hole,Nothing}
  690.                             --      3{Fight,Condemn,White Hole} }
  691.                             --  State 0 Base
  692.                             --      0{Fight,White Hole,Nothing}
  693.                             --      1{Fight,White Hole,Fight}
  694.                             if TED_MOVE_SELECT == 0 then
  695.                                 if TED_STATE == 0 then
  696.                                     TED_MOVE = "FIGHT"
  697.                                 elseif TED_STATE == 1 then
  698.                                     if TED_SCRIPT == 0 then
  699.                                         TED_MOVE = "FLARE"
  700.                                     else
  701.                                         TED_MOVE = "FIGHT"
  702.                                     end
  703.                                 else -- TED_STATE 2
  704.                                     TED_MOVE = "METEOR"
  705.                                 end
  706.                             elseif TED_MOVE_SELECT == 1 then
  707.                                 if TED_STATE == 0 then
  708.                                     TED_MOVE = "WHITE HOLE"
  709.                                 elseif TED_STATE == 1 then
  710.                                     if TED_SCRIPT == 0 then
  711.                                         TED_MOVE = "HOLY"
  712.                                     elseif TED_SCRIPT == 1 then
  713.                                         TED_MOVE = "FIGHT"
  714.                                     elseif TED_SCRIPT == 2 then
  715.                                         TED_MOVE = "WHITE HOLE"
  716.                                     else
  717.                                         TED_MOVE = "CONDEMN"
  718.                                     end
  719.                                 else -- TED_STATE 2
  720.                                     TED_MOVE = "FIGHT"
  721.                                 end
  722.                             else -- Move_select 2
  723.                                 if TED_STATE == 0 then
  724.                                     if TED_SCRIPT == 0 then
  725.                                         TED_MOVE = "NOTHING"
  726.                                     else
  727.                                         TED_MOVE = "FIGHT"
  728.                                     end
  729.                                 elseif TED_STATE == 1 then
  730.                                     if TED_SCRIPT == 0 then
  731.                                         TED_MOVE = "FIGHT"
  732.                                     elseif TED_SCRIPT == 2 then
  733.                                         TED_MOVE = "NOTHING"
  734.                                     else
  735.                                         TED_MOVE = "WHITE HOLE"
  736.                                     end
  737.                                 else -- TED_STATE 2
  738.                                     TED_MOVE = "NOTHING"
  739.                                 end
  740.                             end
  741.                            
  742.                             --Non-meteor moves all guess a target
  743.                             if TED_MOVE ~= "METEOR" then
  744.                                 TED_TARGET = BAT_RNG_NEXT(4)
  745.                             end
  746.                            
  747.                             if LOUD_MODE then
  748.                                 console.writeline(FIGHT_CLOCK .. " TED READIES: " .. TED_SCRIPT .. ","..RAW_SELECT.."|".. TED_MOVE_SELECT .. " @ ".. TED_TARGET)
  749.                             end
  750.                             --Advance action sctipt accordingly
  751.                             if TED_STATE < 2 then
  752.                                 TED_SCRIPT = TED_SCRIPT + 1
  753.                                 if TED_STATE == 0 then
  754.                                     if TED_SCRIPT > 1 then TED_SCRIPT = 0 end
  755.                                 else
  756.                                     if TED_SCRIPT > 3 then TED_SCRIPT = 0 end
  757.                                 end
  758.                             end
  759.                            
  760.                         end -- End of TED Think
  761.                         --Set ready flag
  762.                         SIM_READY_FLAGS[CHARACTER+1] = 1
  763.                     end -- End of If ATB = 0
  764.                 --If Ready flag set, And:
  765.                 elseif NONE_READY then
  766.                     if table.getn(ACTION_QUEUE) > 0 then
  767.                         --Only resolve action for character at front of the queue
  768.                         if ACTION_QUEUE[1] == CHARACTER then
  769.                             NONE_ACTED = false
  770.                             table.remove(ACTION_QUEUE, 1)
  771.                             --Character's ready Do their moves
  772.                             if CHARACTER == 0 then
  773.                                 --Zerk Act, which is a form of think
  774.                                 --console.writeline(FIGHT_CLOCK .. " ZERK Acts ")
  775.                                 ZERK_TARGET = ZERK_AIM()
  776.                                 --console.writeline(TRUE_WHEEL[SIM_INDEX+1])
  777.                                 ZERK_EARTH_AXE()
  778.                                 if LOUD_MODE then
  779.                                     console.writeline(FIGHT_CLOCK .. " ====== Zerk: ".. ZERK_TARGET .. " " .. ZERK_MOVE .. " " .. ZERK_DAMAGE)
  780.                                 end
  781.                                 TED_WOUND(ZERK_DAMAGE, LOUD_MODE)
  782.                             elseif CHARACTER == 6 then
  783.                                 --TED Execute Action
  784.                                 --console.writeline(FIGHT_CLOCK .. " TED ACTS")
  785.                                 if TED_MOVE == "FIGHT" then
  786.                                     TED_FIGHT()
  787.                                 elseif TED_MOVE == "WHITE HOLE" then
  788.                                     TED_WHITE_HOLE()
  789.                                 elseif TED_MOVE == "NOTHING" then
  790.                                     TED_NOTHING()
  791.                                 elseif TED_MOVE == "FLARE" then
  792.                                     TED_FLARE()
  793.                                 elseif TED_MOVE == "HOLY" then
  794.                                     TED_HOLY()
  795.                                 elseif TED_MOVE == "CONDEMN" then
  796.                                     TED_CONDEMN()
  797.                                 elseif TED_MOVE == "METEOR" then
  798.                                     TED_METEOR()
  799.                                 else
  800.                                     --True Nothing.
  801.                                 end
  802.                                
  803.                                 if LOUD_MODE then
  804.                                     console.writeline(FIGHT_CLOCK .." ====== TED: ".. TED_MOVE .. " " .. TED_DAMAGE)
  805.                                 end
  806.                                 --If self-damage
  807.                                 if TED_MOVE == "HOLY" or TED_MOVE == "FLARE" then
  808.                                     TED_WOUND(TED_DAMAGE, LOUD_MODE)
  809.                                 else --Else, Faris Damage
  810.                                     FARIS_HP = FARIS_HP - TED_DAMAGE
  811.                                     if LOUD_MODE then
  812.                                         console.writeline("FARIS HP:" .. FARIS_HP)
  813.                                     end
  814.                                 end
  815.                                
  816.                             end -- End of Character-Specific Action Executions
  817.                             --Reset ATB and UnReady flag
  818.                             SIM_ATBS[CHARACTER+1] = 120 - SIM_SPEEDS[CHARACTER+1]
  819.                             SIM_READY_FLAGS[CHARACTER+1] = 0
  820.                             if LOUD_MODE then
  821.                                 console.writeline(SIM_ATBS)
  822.                             end
  823.                         end -- If character at front of queue
  824.                     end -- If Action queue non-empty
  825.                    
  826.                 end --End of ATB/Ready block
  827.             end --End of character filter
  828.            
  829.         end --End of initiative sweep
  830.        
  831.         --Entropy roll each fight loop
  832.         SEB = BAT_RNG_NEXT(100)
  833.         if(FIGHT_CLOCK > 1610 and FIGHT_CLOCK < 1860 and LOUD_MODE) then
  834.             console.writeline("sEb:"..SEB .. " | " .. TRUE_WHEEL[SIM_INDEX+1] .. " Shin: " .. SIM_INDEX)
  835.         end
  836.         FIGHT_CLOCK = FIGHT_CLOCK + 1
  837.         --HP Leak
  838.         if FIGHT_CLOCK % 8 == 0 then FARIS_HP = FARIS_HP - 2 end
  839.     end -- End while Fight
  840.    
  841.     if(NOT_CONDEMNED == false) then
  842.         return "Beyond Dead"
  843.     elseif (FARIS_HP <= 0) then
  844.         return "Regular Dead"
  845.     elseif (TED_HP <= 0) then
  846.          return "Tree Dead"
  847.     else
  848.         return "????"
  849.     end
  850. end
  851.  
  852. while true do
  853.     memory.usememorydomain("WRAM")
  854.     --Using this to detect fight load for now
  855.     ESCAPADE = memory.readbyte(0x3EF0)
  856.    
  857.     if ESCAPADE ~= 0 then
  858.         if THINK_STATE == 0 then
  859.             console.clear()
  860.             --Checks for Exdeath fight
  861.             Visibles = memory.readbyte(0x3EF2)
  862.             TREE_ID = memory.readbyte(0x3EF5)
  863.             if(Visibles == 32 and TREE_ID == 19) then
  864.                 MAKE_TRUE_WHEEL()
  865.                 THUNDERING_PROGNOSTICATOR(true, true,0,0)
  866.                 --[[
  867.                 FAKE_B = 0
  868.                 for FAKE_A = 0, 255 do
  869.                     MAKE_FAKE_WHEEL(FAKE_A,0)
  870.                     PREDICTION = THUNDERING_PROGNOSTICATOR(false, false,FAKE_A, FAKE_B)
  871.                     if(PREDICTION == "Tree Dead") then
  872.                         console.writeline(FAKE_A .. " " .. FAKE_B ..":" .. PREDICTION)
  873.                     end
  874.                 end
  875.                 --]]
  876.             end
  877.            
  878.             THINK_STATE = 1
  879.         end
  880.     else
  881.         THINK_STATE = 0
  882.     end
  883.    
  884.     if THINK_STATE == 1 then
  885.         --THINK HUD
  886.         RAW_THINK()
  887.     end
  888.    
  889.     gui.text(0,432, "THINK STATE:" .. string.format(THINK_STATE))
  890.    
  891.     emu.frameadvance()
  892. end
  893.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement