At long last I restarted work on my TASeditor, and new version can be found here:
http://savefile.com/files/339041
In fact, it's not old TasEdit, but brand new one, I just felt like starting form scratch ^__^ It introduces new (still unfinished though) interface...
Now it can...
...open VBM, SMV, FCM, FMV
...save as FCM (tested with FCM and FMV movies, both replayed successfully to the end (Air, Air-no-death(savestate) - FCM, Gradius by morimoto - FMV))
Working with program:
- You can move tracks using drag'n'drop on tracks panels to the left (it resets selections though)
- You can change setting for tracks (right mouse button, ignore menu and click on next track panel to select multiple tracks)
- Left mouse button creates selection on frames panel, to create new selection click outside of current one
- for buttons : double click on selection inverts states of selected buttons
- for integer values (for example FCM special) : double click sets value from toolbar into selected cells
- hold left mouse button on selection to move selected block, right mouse button does the same but clears the place where block was
- right mouse button brings up menu, here you can:
-Insert frames, new frames will be put before first selected frame (frame is considered "selected" if it has at least one selected button
- Delete selected frames (same here)
- Duplicate frames (and here too)
- Copy or paste selected block to one of two buffers (pasting will override data in corresponding block starting from upper-left corner of selection)
- HZ+-, VZ+- adjust vertical and horisontal zoom
Save dialog:
here you can change some header data and what track is used by every button ^__^
That's all, I think, I am sorry, but you can't edit data from keyboard for now, I have to find some way to implement it...
Old message:
After having trained on VBM and SMV convertors I decided to try to write universal, plugin-based movie editor. I want to know what do you want to see there, and how must some things be done to be more convenient for you. I also described some technical aspects, so that programmers who may be will want to write plugins could also give their suggestions.
Current ideas:
Program has two tabs: one for converting and one for editing.
1) Editing
Any movie file (i would really like to support all those formats: fmv fcm vba smv gmv zmv m64 txt) can be opened here, edited and saved (also as another file, even in other format).
Perhaps it should look like list of frames (columns : frame_number A B L R < v > ^ S s), buttons like duplicate, insert empty frame, insert combination(for fighting games for example, combos can be stored in special files), switch set to enable and disable every joypad button in selected frames... I need your ideas here...
2) Converting
Here you can choose input file, it's format (if not autodetected) and output format. of course smv>vbm conversion is not any useful, but fcm>fmv is. If files have different headers, user should be requested to fill some fields that can not be calculated.
3) Text format
Text format is one for all emulators, it will make one file for every controler, all files will have same header, but controller number will be added to file name. If several files are selected as input, multi-controller output file will be created.
Current idea of txt format:
[HEADER]
header|s4=VBM☻ // s4 means: string, 4 bytes
frames|u4=21332 // u4 means longword
...
author|s32=LazyZefiris
[FRAGMENTS]
savestate|256=AA34D2...4F // name|original start offset=hex data
[DATA]
0|:123 // original frame number | keypresses | length (123 frames in this case)
123|S // :1 is not needed for 1 frame combination
124|:6
130|S:2
132|:14
146|v
147|A
148|:10
...
214423|>:4
When converting to text file you can optionally add marker file with frame numbers and comments to be added to corresponding frames. While reading TXT file you can optionally enable writing marker file with all your comments and frame numbers.
When TXT is read, all the text after // is ignored (/// is read as single /, //// as // etc). If line begins with // it is ignored and not counted as frame with no muttons pressed. Also all the data before | in DATA section is ignored
4) Movie in memory
Every file format should be loaded into memory into next structure:
TMovie : record
filename : PChar; // original filename
headers : longword;
header : array of record
name : PChar; // name of header entry
tp : byte; // type: 0 = signed, 1 = unsigned, 2 = flags, 3 = string
l : integer; // length of data
Sdata : pchar; // if value is string
Idata : longword; // if value is numeric
end;
frames : longword; // movie length
datastart : longword; // data start offset in original file
controllers : byte; // number of controllers
controller : array of record // up to 4 controllers
data : array of longword; // up to 32 bits for every frame.
end;
fragments: longword; // number of unconverted fragments
fragment : array of record
name : pchar; // name for fragment (conversion purposes)
size : longword; // size of fragment
start : longword; // where it was originally in file
data : array of byte;
end;
error : byte; // >0 if there were errors while working with rom
end;
The bad side of this format is that it uses dinamic arrays, and may be I won't be able to pass such records from dll to main program, then I shall have to make all arrays have fixed width, that means limited number of header lines, controllers, frames... expanding limits would mean more memory unneccessarily taken...
5) Plug-ins.
Plugin for every format should have next functions(one plugin = one format):
// IO:
CheckHeader(fn: TMovie; var r: boolean); // checks if 'fn' is a supported file;
Loadmovie(data: TMovie; files:integer; files:array of pchar; res:pchar); //res is reserved for whatever happens =)
SaveMovie(data: TMovie; controllerID: integer; filename : pchar; res: pchar); // ControllerID is used when saving to one-controller file to point whict controler data to save
// Editing:
GetCode (s: PChar); //returns string that containg bit explanation ('ABLR' means bit 1 for A, bit 2 for B, bit 3 for L, bit 4 for R. 'xxxxyyyy' means first four bits for x and next four for y (for analog input)
// Init
Init(ext:PChar, Info:PChar); //returns supported extension and description
// There also should be functions to retrieve header data from file, check if file header is correct (for autodetecting format)...
Your questions and comments?
24.05.06: finishing writing VBM plugin capable of loading VBM file and saving it (input and output files are exactly the same). Next is trying to make convenient editor...
EDIT: Big part of editor is ready, basic editing, adding and removing frames does work (although ading or removing frames in beginning of movie takes too much time and has to be optimized somehow... Now thinking about it.) Copying-Pasting fragments will be done through special "combo list" where you can store combinations, copied from movies, looks quite simple to use. I should finish first beta tomorrow if I have time...