-- GBA Shaman King - Master of Spirits, TASing script -- Simple script; glorified ram watch, Yoh and enemy information -- Warning: shit quality; first time lua -- Written by xy2_, 2017 local color= { opaque= { [0]=0xFF00FF00, -- Green 0xFFFFFF00, -- Yellow 0xFFFF0000, -- Red 0xFFBA8E7D, -- Brown 0xFF0000FF, -- Blue 0xFF665046 -- Dark brown }; trans= { [0]=0x7700FF00, -- Green 0x77FFFF00, -- Yellow 0x77FF0000, -- Red 0x77BA8E7D, -- Brown 0x770000FF, -- Blue 0x44665046 -- Dark brown } } client.SetGameExtraPadding(0,0,40,0) --############################################################################# local function UpdateMemoryMap() --############################################################################# m= { globalframe = memory.read_u32_le(0x1DD4, "IWRAM"), igtframe = memory.read_u32_le(0x1DD8, "IWRAM"), cameraX = memory.read_s32_le(0x1E50, "IWRAM"), cameraY = memory.read_s32_le(0x1E54, "IWRAM"), furyoku = memory.read_u16_le(0x22BE, "IWRAM"), frefill = memory.read_u16_le(0x22CA, "IWRAM"), downbuffer = memory.read_u8( 0x25C3, "IWRAM"), state = memory.read_u16_le(0x35E0, "IWRAM"), duration = memory.read_u8( 0x35E9, "IWRAM"), statetimer = memory.read_u8( 0x35DF, "IWRAM"), groair = memory.read_u8( 0x3614, "IWRAM"), igtframearea= memory.read_u32_le(0x3629, "IWRAM"), delay = memory.read_u16_le(0x362D, "IWRAM"), invicibility= memory.read_u16_le(0x3630, "IWRAM"), health = memory.read_u16_le(0x3636, "IWRAM"), xposition = memory.read_u32_le(0x3648, "IWRAM"), yposition = memory.read_u32_le(0x364C, "IWRAM"), xspeed = memory.read_s32_le(0x3650, "IWRAM"), yspeed = memory.read_s32_le(0x3654, "IWRAM"), igtframeseg = memory.read_u32_le(0x36DD, "IWRAM"), } end -- General RAM watch, and value display on screen --############################################################################# local function DisplayHud(x,y) --############################################################################# -- Furyoku gui.pixelText (x+0,y+0, string.format("%4d", m.furyoku), 0xFFFFFFFF, color.trans[4]) -- Furyoku refill if m.refill == 0 then gui.pixelText(x+0,y+7, string.format("%4d", m.frefill), 0xFFFFFFFF, color.trans[0]) else gui.pixelText(x+0,y+7, string.format("%4d", m.frefill), 0xFFFFFFFF, color.trans[2]) end -- In-game time (current segment) gui.pixelText(x+180,y+0, string.format("%8d", m.igtframeseg), 0xFFFFFFFF, color.trans[0]) -- In-game time (current area) gui.pixelText(x+180,y+7, string.format("%8d", m.igtframearea), 0xFFFFFFFF, color.trans[3]) -- In-game time (global) gui.pixelText(x+180,y+14, string.format("%8d", m.igtframe), 0xFFFFFFFF, color.trans[5]) -- Global timer gui.pixelText(x+180,y+21, string.format("%8d", m.globalframe)) -- Speed gui.pixelText(x+215,y, string.format("%6d", m.xspeed)) gui.pixelText(x+215,y+7, string.format("%6d", m.yspeed)) -- Ground/air? Displays G on ground, A on air if m.groair == 1 then gui.pixelText(x+215,y+14, "G", 0xFFFFFFFF, color.trans[4]) else gui.pixelText(x+215,y+14, "A", 0xFFFFFFFF, color.trans[1]) end -- Buffered down input timer to backdash if m.downbuffer >= 1 then gui.pixelText(x+219,y+14, "V" .. string.format("%4d", m.downbuffer), 0xFFFFFFFF, color.trans[0]) else gui.pixelText(x+219,y+14, string.format("%5d", m.downbuffer), 0xFFFFFFFF, color.trans[5]) end -- X and Y position gui.pixelText(x+203,y+35, string.format("%9d", m.xposition), 0xFFFFFFFF, color.trans[5]) gui.pixelText(x+203,y+42, string.format("%9d", m.yposition), 0xFFFFFFFF, color.trans[5]) -- local bosshp= memory.read_u16_le(0x36EA, "IWRAM") -- gui.pixelText(x+0,y+153, string.format("%4d", bosshp), color.opaque[1]) -- -- local bossinv= memory.read_u16_le(0x36E4, "IWRAM") -- gui.pixelText(x+17,y+153, string.féormat("%2d", bossinv), 0xFFFFFFFF, color.trans[1]) -- -- local bossatk= memory.read_u16_le(0x36E1, "IWRAM") -- gui.pixelText(x+26,y+153, string.format("%2d", bossatk)) end -- Draws side bar with general movie info --############################################################################# local function SideBar(x,y) --############################################################################# local frame= emu.framecount() if emu.islagged() == true then gui.pixelText(x,y, frame, 0xFFFFFFFF, color.opaque[2]) else gui.pixelText(x,y, frame) end local lagcount= emu.lagcount() gui.pixelText(x+24,y, lagcount, color.opaque[2]) -- Shoutouts to Masterjun local buttons = {["Up"]="^", ["Down"]="v", ["Left"]="<", ["Right"]=">", ["Select"]="s", ["Start"]="S", ["A"]="A", ["B"]="B", ["L"]="L", ["R"]="R"} local s = "" for k,v in pairs(movie.getinput(frame-1)) do if v == true then s= s..buttons[k] end end gui.pixelText(x,y+7 ,s) end -- Displays information about Yoh's animations on the sidebar --############################################################################# local function GetYohState(x,y) --############################################################################# local stateText= { [0]={"Standing","",""}, {"Walking","",""}, {"Ground","sliding",""}, {"Crouching","",""}, {"Crouched","",""}, {"Standing","up",""}, {"Pre-","jumping",""}, {"Jumping","",""}, {"Falling,","initial",""}, {"Falling","",""}, {"Landing","",""}, {"Back","dashing",""}, {"Entering","door",""}, {"Exiting","door",""}, {"Taking","damage",""}, {"Taking","damage,","crouched"}, {"Taking","damage,","air"}, {"Knockback","damage",""}, {"Knockback","upwards",""}, {"Knockback","hitting","ground"}, {"Knockback","fall",""}, {"Knockback","ground",""}, {"Knockback","getting up",""}, {"Electro-","cuted",""}, {"Electro-","cuted","2"}, {"Taking","damage?",""}, {"Taking","damage?",""}, {"1st slash,","wooden,","ground"}, {"2nd slash,","wooden,","ground"}, {"3rd slash,","wooden,","ground"}, {"1st slash,","light,","ground"}, {"2nd slash,","light,","ground"}, {"3rd slash,","light,","ground"}, {"1st slash,","antiquity,","ground"}, {"2nd slash,","antiquity,","ground"}, {"3rd slash,","antiquity,","ground"}, {"Crouch","slash,","wooden"}, {"Crouch","slash,","light"}, {"Crouch","slash,","antiquity"}, {"1st slash,","wooden,","air"}, {"2nd slash,","wooden,","air"}, {"3rd slash,","wooden,","air"}, {"1st slash,","light,","air"}, {"2nd slash,","light,","air"}, {"3rd slash,","light,","air"}, {"1st slash,","antiquity,","air"}, {"2nd slash,","antiquity,","air"}, {"3rd slash,","antiquity,","air"}, {"Halo","Bump,","ground"}, {"Halo","Bump,","air"}, {"Nipopo","Punch", "ground"}, {"Nipopo","Punch", "air"}, {"Daodondo","",""}, {"Gussy", "Kenji", "ground"}, {"Gussy", "Kenji", "air"}, {"Jaguar","Swipe",""}, {"Footballer","",""}, {"Footballer,","sparks",""}, {"Big", "Thumb",""}, {"Big", "Thumb,","smoke"}, {"Big", "Thumb,","Tokageroh"}, {"Celestial","Slash,","ground"}, {"Celestial","Slash,","air"}, {"Celestial","Slash,","blade"}, [73]={"Totem","Attack",""}, } local t= stateText[m.state] if t then gui.pixelText(x,y, m.state .. ":" .. m.statetimer) gui.pixelText(x,y+ 7,t[1],color.opaque[1]) gui.pixelText(x,y+14,t[2],color.opaque[1]) gui.pixelText(x,y+21,t[3],color.opaque[1]) gui.pixelText(x,y+28, m.duration .. ":" .. m.delay, 0xFFFFFFFF, color.trans[2]) else gui.pixelText(x,y+ 0,"NULL!!!",0xFFC0C0C0) end end -- Draws hitboxes -- Object size: B4 (180) --############################################################################# local function DrawHitbox(x,y, offset, id) --############################################################################# cameraX,cameraY= m.cameraX/256, m.cameraY/256 -- Figure out appropriate pixel values (somewhat hacky) local X1, X2= memory.read_s32_le(0x3664 + offset, "IWRAM")/256, memory.read_s32_le(0x3668 + offset, "IWRAM")/256 local Y1, Y2= memory.read_s32_le(0x366C + offset, "IWRAM")/256, memory.read_s32_le(0x3670 + offset, "IWRAM")/256 local pixelX1, pixelX2= X1-cameraX+120, X2-cameraX+120 local pixelY1, pixelY2= cameraY-Y1+71, cameraY-Y2+71 local invicibility= memory.read_u16_le(0x3630 + offset, "IWRAM") -- Add invicibility counter if invicible if invicibility >= 1 then gui.drawBox (x+pixelX1, y+pixelY1, x+pixelX2, y+pixelY2, color.opaque[1], color.trans[5]) gui.pixelText (x+pixelX1, y+pixelY1, invicibility, 0xFFFFFFFF, color.trans[1]) else gui.drawBox (x+pixelX1, y+pixelY1, x+pixelX2, y+pixelY2, color.opaque[5], color.trans[5]) end -- Facing direction local fdirection= memory.read_u8(0x3634 + offset, "IWRAM") if fdirection == 1 then gui.pixelText (x+pixelX1, y+pixelY2 - 7, "<") elseif fdirection == 0 then gui.pixelText (x+pixelX1, y+pixelY2 - 7, ">") else gui.pixelText (x+pixelX1, y+pixelY2 - 7, "?") end -- Raw damage output local rawdmg= memory.read_u8(0x3638 + offset, "IWRAM") gui.pixelText (x+pixelX1 + 8, y+pixelY2 - 7, rawdmg, 0xFFFFFFFF, color.trans[2]) -- Health local health= memory.read_u16_le(0x3636 + offset, "IWRAM") gui.pixelText(x+pixelX1 + 10,y+pixelY1 + 1, health, color.opaque[1]) -- State, animation and timer information if id ~= 0 then local state= memory.read_u16_le(0x35E0 + offset, "IWRAM") local statetimer= memory.read_u8(0x35DF + offset, "IWRAM") local duration= memory.read_u8(0x35E9 + offset, "IWRAM") local delay= memory.read_u16_le(0x362D + offset, "IWRAM") gui.pixelText (x+pixelX1 + 24, y+pixelY2 - 7, state .. ":" .. statetimer) gui.pixelText (x+pixelX1 + 24, y+pixelY2, duration .. ":" .. delay, 0xFFFFFFFF, color.trans[2]) end end --@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ while true do --@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ UpdateMemoryMap() DisplayHud(0,0) SideBar(241,0) GetYohState(241,20) for i=0,1 do --if memory.read_u16_le(0x3636 + i*180, "IWRAM") ~= 0 then DrawHitbox(0,8, 0 + i*180, i) --end end emu.frameadvance() end