-- Kirby's Dream Course (U)-- snes9x 1.43RAM = { xv = 0x7ed9d4, yv = 0x7ed9d6, zv = 0x7ed9d8}pad, padold = {}, {}accel, decel = 0, 0emu.registerbefore(function() local duringCupInSound = memory.readbyte(0x7e6ac0)~=2 and (memory.readword(0x7e1ffc)==0x80f5 or memory.readword(0x7e1ffc)==0xcb83 or memory.readword(0x7e1ffc)==0xd300) local duringOnWarp = (memory.readbyte(0x7e6a48)==1) -- memory.readbyte(0x7e1edd)==0 or memory.readbyte(0x7e6a48)==1) local duringCameraMoveOnWarp = (memory.readbyte(0x7e1edd)==0 and memory.readbyte(0x7e659c)==255) local duringWaterSwitchAnimation = (memory.readword(0x7e0858)==0) local duringUFOBootUp = (memory.readword(0x7ed9c6)==10 and memory.readword(0x7ed9c8)==10 and memory.readword(0x7ed776)==600) -- (memory.readbyte(0x7e0302)==1 and memory.readbyte(0x7eda52)==1) if not ( (memory.readbyte(0x7e6ac0)==2 -- during a shot and memory.readbyte(0x7e6850)~=8 -- not during ability boot and not duringOnWarp and not duringWaterSwitchAnimation and not duringUFOBootUp or duringCupInSound ) and memory.readbyte(0x7e6a8c)~=1 -- but not during the transform of the last enemy ) then return end pad = joypad.get(1) padtrig = {} for k, v in pairs(pad) do if not padold[k] and v then padtrig[k] = true end end padold = pad local dir = math.deg(math.atan2(memory.readwordsigned(RAM.yv), memory.readwordsigned(RAM.xv))) -- memory.readwordsigned(RAM.dir) local hv = math.sqrt(math.pow(memory.readwordsigned(RAM.xv), 2) + math.pow(memory.readwordsigned(RAM.yv), 2)) local vv = memory.readwordsigned(RAM.zv) -- rotate if pad.left then dir = dir + 1.5 end if pad.right then dir = dir - 1.5 end if pad.L then dir = dir + 3.0 end if pad.R then dir = dir - 3.0 end -- floating if pad.up then local newvv = vv + 256 if newvv >= 1024 then newvv = newvv - 128 end vv = newvv memory.writeword(0x7ed9ec, 1) end if pad.down then local newvv = vv - 256 vv = newvv end -- speedup if pad.Y then accel = math.min(accel + 8, 0x70) local newhv = hv + accel if newhv <= 0x1200 then hv = newhv else hv = 0x1200 end else accel = 0 end -- speeddown if pad.X then decel = math.min(accel + 64, 0x200) local newhv = hv - decel if newhv >= 0x400 then hv = newhv else hv = 0x400 end else decel = 0 end local clip16 = function(v) return math.max(-32768, math.min(32767, v)) end memory.writeword(RAM.xv, clip16(hv * math.cos(math.rad(dir)))) memory.writeword(RAM.yv, clip16(hv * math.sin(math.rad(dir)))) memory.writeword(RAM.zv, clip16(vv))end)