Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Script for extracting game data and outputting it into After Effects keyframe data format
- -- Written by Alex Losego
- -- the filepath to save the csv file
- local absolutefilepath = "C:\\Users\\Alex\\Documents\\output.csv"
- -- the memory domain to use for memory addresses specified in the next array
- local domain = "RAM"
- -- the framerate of the source video this will be attached to
- local framerate = 60.1
- -- list of memory addresses to keep track of
- ---- array key is the name of the data
- ---- array value contains the type and address
- ------ type 't' can be 'u8' 's8' 'u16' 's16' for unsigned/signed 8-bit/16-bit value
- ------ address 'lo' is the memory address of value (the lower 8 bits for 16-bit)
- ------ address 'hi' is the memory address of higher 8 bits for 16-bit (need to be specified even if the 16 bits are contiguous)
- local addresses = {
- --loc_x = {t = "s8", lo = 0x1200},
- --loc_y = {t = "s8", lo = 0x1204},
- --loc_z = {t = "s8", lo = 0x1208},
- --camera_x = {t = "s16", hi = 0x1B, lo = 0x1A},
- --camera_y = {t = "s16", hi = 0x1D, lo = 0x1C},
- --sprite_0 = {t = "u8", lo = 0x9E},
- --sprite_1 = {t = "u8", lo = 0x9F},
- }
- -- list of keyframes imported into After Effects
- ---- 'name' is the name of the keyframe
- ---- 't' is the type of keyframe: can be 'slider' (1D) or 'point' (2D) or '3dpoint' (3D)
- ---- 'x' is the name of the data given above for first dimension of keyframe
- ---- 'y' is the name of the data given above for second dimension of keyframe (point only)
- ---- 'z' is the name of the data given above for third dimension of keyframe (3d point only)
- local keyframes = {
- --{name = "location", t = "3dpoint", x = "loc_x", y = "loc_y", y = "loc_z"},
- --{name = "camera", t = "point", x = "camera_x", y = "camera_y"},
- --{name = "slot_0_sprite", t = "slider", x = "sprite_0"},
- --{name = "slot_1_sprite", t = "slider", x = "sprite_1"},
- }
- -- don't need to change anything below this point
- function done()
- return movie.mode() == "FINISHED" or movie.mode() == "INACTIVE"
- end
- -- Start Main --
- console.writeline("Starting...")
- raw = {}
- memory.usememorydomain(domain);
- repeat
- emu.frameadvance()
- for k, v in pairs(addresses) do
- val = 0;
- if v.t == "u8" then
- val = memory.readbyte(v.lo)
- elseif v.t == "s8" then
- val = memory.readbyte(v.lo)
- if val >= 0x80 then
- val = val - 0x100
- end
- elseif v.t == "u16" then
- val = 0x100*memory.readbyte(v.hi) + memory.readbyte(v.lo)
- elseif v.t == "s16" then
- val = 0x100*memory.readbyte(v.hi) + memory.readbyte(v.lo)
- if val >= 0x8000 then
- val = val - 0x10000
- end
- end
- if raw[k] == nil then
- raw[k] = {}
- end
- table.insert(raw[k], val);
- end
- until done()
- file = io.open(absolutefilepath,"w")
- file:write("Adobe After Effects 8.0 Keyframe Data\n\n\n")
- file:write("\tUnits Per Second\t" .. framerate .. "\n")
- file:write("\tSource Width\t100\n")
- file:write("\tSource Height\t100\n")
- file:write("\tSource Pixel Aspect Ratio\t1\n")
- file:write("\tComp Pixel Aspect Ratio\t1\n\n")
- for i = 1,#keyframes do
- console.writeline("Writing keyframe data for "..keyframes[i].name..".")
- if keyframes[i].t == "slider" then
- file:write("Effects\tSlider Control #"..i.."\tSlider#2\n\tFrame\n")
- --
- for j=1,#raw[keyframes[i].x] do
- val = raw[keyframes[i].x][j]
- if j > 1 and val == raw[keyframes[i].x][j-1] then
- -- unnecessary keyframe
- else
- file:write("\t"..j.."\t"..val.."\n")
- end
- end
- --
- file:write("\n");
- elseif keyframes[i].t == "point" then
- file:write("Effects\tPoint Control #"..i.."\tPoint#2\n\tFrame\tX pixels\tY pixels\n")
- --
- for j=1,#raw[keyframes[i].x] do
- valX = raw[keyframes[i].x][j]
- valY = raw[keyframes[i].y][j]
- if j > 1 and valX == raw[keyframes[i].x][j-1] and valY == raw[keyframes[i].y][j-1] then
- -- unnecessary keyframe
- else
- file:write("\t"..j.."\t"..valX.."\t"..valY.."\n")
- end
- end
- --
- file:write("\n")
- elseif keyframes[i].t == "3dpoint" then
- file:write("Effects\t3D Point Control #"..i.."\t3D Point#2\n\tFrame\tX pixels\tY pixels\tZ pixels\n")
- --
- for j=1,#raw[keyframes[i].x] do
- valX = raw[keyframes[i].x][j]
- valY = raw[keyframes[i].y][j]
- valZ = raw[keyframes[i].z][j]
- if j > 1 and valX == raw[keyframes[i].x][j-1] and valY == raw[keyframes[i].y][j-1] and valZ == raw[keyframes[i].z][j-1] then
- -- unnecessary keyframe
- else
- file:write("\t"..j.."\t"..valX.."\t"..valY.."\t"..valZ.."\n")
- end
- end
- --
- file:write("\n")
- end
- end
- file:write("\nEnd of Keyframe Data")
- file:close()
- console.writeline("Done.")
Add Comment
Please, Sign In to add comment